oveRTOS C API
Embedded RTOS framework — build system, configuration, and portable C API
Loading...
Searching...
No Matches
storage.h
1/*
2 * Copyright (C) 2026 Kamil Lulko <kamil.lulko@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 *
6 * This file is part of oveRTOS.
7 */
8
9#ifndef OVE_STORAGE_H
10#define OVE_STORAGE_H
11
48#include "ove/types.h"
49#include "ove_config.h"
50
51/*
52 * Include the backend-specific storage header.
53 *
54 * __BINDGEN__ — Rust bindgen: use exact build-time-generated sizes
55 * (required for zero-heap static allocation).
56 * __ZIG_CIMPORT__ — Zig @cImport: use minimal opaque types (Zig only
57 * passes pointer handles, never allocates storage).
58 *
59 * Without either flag, the real backend header is included.
60 */
61#if defined(__ZIG_CIMPORT__)
62/* Try to include build-time storage sizes for zero-heap mode.
63 * zig_storage_sizes.h is generated by ove_zig.cmake and placed
64 * on the include path only for zero-heap builds. */
65#if __has_include("zig_storage_sizes.h")
66#include "zig_storage_sizes.h"
67#endif
68#endif
69
70#if defined(__ZIG_CIMPORT__) && !defined(OVE_SIZEOF_OVE_THREAD_STORAGE)
71#ifdef CONFIG_OVE_ZERO_HEAP
72#error "Zero-heap mode requires storage sizes. Run cmake with ove_zig.cmake to generate zig_storage_sizes.h"
73#endif
74/* Zig heap mode: minimal opaques — only pointer handles are used,
75 * the C backend mallocs real storage. */
76#include <stdint.h>
78typedef struct { uint8_t _opaque; } ove_mutex_storage_t;
79typedef struct { uint8_t _opaque; } ove_sem_storage_t;
80typedef struct { uint8_t _opaque; } ove_event_storage_t;
81typedef struct { uint8_t _opaque; } ove_condvar_storage_t;
82typedef struct { uint8_t _opaque; } ove_thread_storage_t;
83typedef struct { uint8_t _opaque; } ove_queue_storage_t;
84typedef struct { uint8_t _opaque; } ove_timer_storage_t;
85typedef struct { uint8_t _opaque; } ove_eventgroup_storage_t;
86typedef struct { uint8_t _opaque; } ove_workqueue_storage_t;
87typedef struct { uint8_t _opaque; } ove_work_storage_t;
88typedef struct { uint8_t _opaque; } ove_stream_storage_t;
89typedef struct { uint8_t _opaque; } ove_watchdog_storage_t;
90typedef struct { uint8_t _opaque; } ove_file_storage_t;
91typedef struct { uint8_t _opaque; } ove_dir_storage_t;
92#ifdef CONFIG_OVE_INFER
93typedef struct { uint8_t _opaque; } ove_model_storage_t;
94#endif
95#ifdef CONFIG_OVE_NET
96typedef struct { uint8_t _opaque; } ove_socket_storage_t;
97typedef struct { uint8_t _opaque; } ove_netif_storage_t;
98#endif
99#ifdef CONFIG_OVE_NET_TLS
100typedef struct { uint8_t _opaque; } ove_tls_storage_t;
101#endif
102#ifdef CONFIG_OVE_NET_HTTP
103typedef struct { uint8_t _opaque; } ove_http_client_storage_t;
104#endif
105#ifdef CONFIG_OVE_NET_MQTT
106typedef struct { uint8_t _opaque; } ove_mqtt_client_storage_t;
107#endif
108#ifdef CONFIG_OVE_UART
109typedef struct { uint8_t _opaque; } ove_uart_storage_t;
110#endif
111#ifdef CONFIG_OVE_SPI
112typedef struct { uint8_t _opaque; } ove_spi_storage_t;
113#endif
114#ifdef CONFIG_OVE_I2C
115typedef struct { uint8_t _opaque; } ove_i2c_storage_t;
116#endif
117#ifdef CONFIG_OVE_I2S
118typedef struct { uint8_t _opaque; } ove_i2s_storage_t;
119#endif
121#elif defined(__ZIG_CIMPORT__) || defined(__BINDGEN__)
122/*
123 * Opaque storage types for Rust bindings.
124 *
125 * When OVE_STORAGE_SIZES is generated at build time (by
126 * ove_rust.cmake), exact per-backend sizes are used.
127 * Otherwise, conservative upper bounds cover all backends.
128 */
129#include <stdint.h>
130
137#define OVE_OPAQUE_(name, size, align) \
138 typedef struct { _Alignas(align) uint8_t _opaque[size]; } name
139
140/*
141 * Sizes are generated at build time by ove_rust.cmake and injected
142 * via storage_sizes.h (included by build.rs before this header).
143 * If the defines are missing, the build system is misconfigured.
144 */
145#ifndef OVE_SIZEOF_OVE_THREAD_STORAGE
146#error "Storage sizes not generated. Rust/Zig zero-heap builds require ove_{rust,zig}.cmake to produce storage sizes."
147#endif
148
150OVE_OPAQUE_(ove_mutex_storage_t, OVE_SIZEOF_OVE_MUTEX_STORAGE, OVE_ALIGNOF_OVE_MUTEX_STORAGE);
151OVE_OPAQUE_(ove_sem_storage_t, OVE_SIZEOF_OVE_SEM_STORAGE, OVE_ALIGNOF_OVE_SEM_STORAGE);
152OVE_OPAQUE_(ove_event_storage_t, OVE_SIZEOF_OVE_EVENT_STORAGE, OVE_ALIGNOF_OVE_EVENT_STORAGE);
153OVE_OPAQUE_(ove_condvar_storage_t, OVE_SIZEOF_OVE_CONDVAR_STORAGE, OVE_ALIGNOF_OVE_CONDVAR_STORAGE);
154OVE_OPAQUE_(ove_thread_storage_t, OVE_SIZEOF_OVE_THREAD_STORAGE, OVE_ALIGNOF_OVE_THREAD_STORAGE);
155OVE_OPAQUE_(ove_queue_storage_t, OVE_SIZEOF_OVE_QUEUE_STORAGE, OVE_ALIGNOF_OVE_QUEUE_STORAGE);
156OVE_OPAQUE_(ove_timer_storage_t, OVE_SIZEOF_OVE_TIMER_STORAGE, OVE_ALIGNOF_OVE_TIMER_STORAGE);
157OVE_OPAQUE_(ove_eventgroup_storage_t, OVE_SIZEOF_OVE_EVENTGROUP_STORAGE, OVE_ALIGNOF_OVE_EVENTGROUP_STORAGE);
158OVE_OPAQUE_(ove_workqueue_storage_t, OVE_SIZEOF_OVE_WORKQUEUE_STORAGE, OVE_ALIGNOF_OVE_WORKQUEUE_STORAGE);
159OVE_OPAQUE_(ove_work_storage_t, OVE_SIZEOF_OVE_WORK_STORAGE, OVE_ALIGNOF_OVE_WORK_STORAGE);
160OVE_OPAQUE_(ove_stream_storage_t, OVE_SIZEOF_OVE_STREAM_STORAGE, OVE_ALIGNOF_OVE_STREAM_STORAGE);
161OVE_OPAQUE_(ove_watchdog_storage_t, OVE_SIZEOF_OVE_WATCHDOG_STORAGE, OVE_ALIGNOF_OVE_WATCHDOG_STORAGE);
162OVE_OPAQUE_(ove_file_storage_t, OVE_SIZEOF_OVE_FILE_STORAGE, OVE_ALIGNOF_OVE_FILE_STORAGE);
163OVE_OPAQUE_(ove_dir_storage_t, OVE_SIZEOF_OVE_DIR_STORAGE, OVE_ALIGNOF_OVE_DIR_STORAGE);
164#if defined(CONFIG_OVE_INFER) && defined(OVE_SIZEOF_OVE_MODEL_STORAGE)
165OVE_OPAQUE_(ove_model_storage_t, OVE_SIZEOF_OVE_MODEL_STORAGE, OVE_ALIGNOF_OVE_MODEL_STORAGE);
166#endif
167#if defined(CONFIG_OVE_NET) && defined(OVE_SIZEOF_OVE_SOCKET_STORAGE)
168OVE_OPAQUE_(ove_socket_storage_t, OVE_SIZEOF_OVE_SOCKET_STORAGE, OVE_ALIGNOF_OVE_SOCKET_STORAGE);
169OVE_OPAQUE_(ove_netif_storage_t, OVE_SIZEOF_OVE_NETIF_STORAGE, OVE_ALIGNOF_OVE_NETIF_STORAGE);
170#endif
171#if defined(CONFIG_OVE_NET_TLS) && defined(OVE_SIZEOF_OVE_TLS_STORAGE)
172OVE_OPAQUE_(ove_tls_storage_t, OVE_SIZEOF_OVE_TLS_STORAGE, OVE_ALIGNOF_OVE_TLS_STORAGE);
173#endif
174#if defined(CONFIG_OVE_NET_HTTP) && defined(OVE_SIZEOF_OVE_HTTP_CLIENT_STORAGE)
175OVE_OPAQUE_(ove_http_client_storage_t, OVE_SIZEOF_OVE_HTTP_CLIENT_STORAGE, OVE_ALIGNOF_OVE_HTTP_CLIENT_STORAGE);
176#endif
177#if defined(CONFIG_OVE_NET_MQTT) && defined(OVE_SIZEOF_OVE_MQTT_CLIENT_STORAGE)
178OVE_OPAQUE_(ove_mqtt_client_storage_t, OVE_SIZEOF_OVE_MQTT_CLIENT_STORAGE, OVE_ALIGNOF_OVE_MQTT_CLIENT_STORAGE);
179#endif
180#if defined(CONFIG_OVE_UART) && defined(OVE_SIZEOF_OVE_UART_STORAGE)
181OVE_OPAQUE_(ove_uart_storage_t, OVE_SIZEOF_OVE_UART_STORAGE, OVE_ALIGNOF_OVE_UART_STORAGE);
182#endif
183#if defined(CONFIG_OVE_SPI) && defined(OVE_SIZEOF_OVE_SPI_STORAGE)
184OVE_OPAQUE_(ove_spi_storage_t, OVE_SIZEOF_OVE_SPI_STORAGE, OVE_ALIGNOF_OVE_SPI_STORAGE);
185#endif
186#if defined(CONFIG_OVE_I2C) && defined(OVE_SIZEOF_OVE_I2C_STORAGE)
187OVE_OPAQUE_(ove_i2c_storage_t, OVE_SIZEOF_OVE_I2C_STORAGE, OVE_ALIGNOF_OVE_I2C_STORAGE);
188#endif
189#if defined(CONFIG_OVE_I2S) && defined(OVE_SIZEOF_OVE_I2S_STORAGE)
190OVE_OPAQUE_(ove_i2s_storage_t, OVE_SIZEOF_OVE_I2S_STORAGE, OVE_ALIGNOF_OVE_I2S_STORAGE);
191#endif
194#undef OVE_OPAQUE_
195#else
196#if defined(CONFIG_OVE_RTOS_FREERTOS)
197#include "ove_storage_freertos.h"
198#elif defined(CONFIG_OVE_RTOS_ZEPHYR)
199#include "ove_storage_zephyr.h"
200#elif defined(CONFIG_OVE_RTOS_NUTTX)
201#include "ove_storage_nuttx.h"
202#elif defined(CONFIG_OVE_RTOS_POSIX)
203#if defined(CONFIG_OVE_BOARD_WASM)
204#include "ove_storage_wasm.h"
205#else
206#include "ove_storage_posix.h"
207#endif
208#endif
209#endif /* __BINDGEN__ */
210
225#if !defined(CONFIG_OVE_ZERO_HEAP)
226#define OVE_HEAP_SYNC 1
227#define OVE_HEAP_THREAD 1
228#define OVE_HEAP_QUEUE 1
229#define OVE_HEAP_TIMER 1
230#define OVE_HEAP_EVENTGROUP 1
231#define OVE_HEAP_WORKQUEUE 1
232#define OVE_HEAP_STREAM 1
233#define OVE_HEAP_WATCHDOG 1
234#define OVE_HEAP_FS 1
235#define OVE_HEAP_INFER 1
236#define OVE_HEAP_NET 1
237#define OVE_HEAP_NET_TLS 1
238#define OVE_HEAP_NET_HTTP 1
239#define OVE_HEAP_NET_MQTT 1
240#define OVE_HEAP_UART 1
241#define OVE_HEAP_SPI 1
242#define OVE_HEAP_I2C 1
243#define OVE_HEAP_I2S 1
244#endif /* !CONFIG_OVE_ZERO_HEAP */
254#include <assert.h>
255
256#ifndef OVE_STATIC_INIT_ASSERT
257#define OVE_STATIC_INIT_ASSERT(cond) assert(cond)
258#endif
259
279#define OVE_MUTEX_DEFINE(name) \
280 static ove_mutex_storage_t name
281
285#define OVE_SEM_DEFINE(name) \
286 static ove_sem_storage_t name
287
291#define OVE_EVENT_DEFINE(name) \
292 static ove_event_storage_t name
293
297#define OVE_CONDVAR_DEFINE(name) \
298 static ove_condvar_storage_t name
299
300/* Backend-specific thread stack definition (Zephyr needs K_THREAD_STACK_DEFINE) */
301#ifndef OVE_THREAD_STACK_DEFINE_
307#define OVE_THREAD_STACK_DEFINE_(name, size) \
308 static uint8_t name[(size)]
309#endif
310
312/* Block-scope static variant — safe inside ({...}) statement expressions. */
313#ifndef OVE_THREAD_STACK_BLOCK_STATIC_
314#define OVE_THREAD_STACK_BLOCK_STATIC_(name, size) \
315 static uint8_t __attribute__((aligned(8))) name[(size)]
316#endif
319/* Class-member variant (no 'static') — for C++ class-embedded stacks.
320 * Overridden by backends that need special alignment (e.g. Zephyr MPU). */
321#ifndef OVE_THREAD_STACK_MEMBER_
329#define OVE_THREAD_STACK_MEMBER_(name, size) uint8_t name[size]
330#endif
331
338#define OVE_THREAD_DEFINE(name, stack_size_bytes) \
339 static ove_thread_storage_t name; \
340 OVE_THREAD_STACK_DEFINE_(name##_stack, stack_size_bytes)
341
349#define OVE_QUEUE_DEFINE(name, item_sz, max) \
350 static ove_queue_storage_t name; \
351 static uint8_t name##_buffer[(item_sz) * (max)]
352
356#define OVE_TIMER_DEFINE(name) \
357 static ove_timer_storage_t name
358
362#define OVE_EVENTGROUP_DEFINE(name) \
363 static ove_eventgroup_storage_t name
364
371#define OVE_WORKQUEUE_DEFINE(name, stack_size_bytes) \
372 static ove_workqueue_storage_t name; \
373 static uint8_t name##_stack[stack_size_bytes]
374
381#define OVE_STREAM_DEFINE(name, buf_size) \
382 static ove_stream_storage_t name; \
383 static uint8_t name##_buffer[(buf_size) + 1]
384
388#define OVE_WATCHDOG_DEFINE(name) \
389 static ove_watchdog_storage_t name
390
391#ifdef CONFIG_OVE_INFER
395#define OVE_MODEL_DEFINE(name) \
396 static ove_model_storage_t name
397
401#define OVE_MODEL_ARENA_DEFINE(name, size) \
402 static uint8_t __attribute__((aligned(16))) name[(size)]
403#endif /* CONFIG_OVE_INFER */
404
405#ifdef CONFIG_OVE_UART
412#define OVE_UART_DEFINE(name, rx_buf_size) \
413 static ove_uart_storage_t name; \
414 static uint8_t name##_rx_buf[(rx_buf_size)]
415#endif /* CONFIG_OVE_UART */
416
417#ifdef CONFIG_OVE_SPI
421#define OVE_SPI_DEFINE(name) \
422 static ove_spi_storage_t name
423#endif /* CONFIG_OVE_SPI */
424
425#ifdef CONFIG_OVE_I2C
429#define OVE_I2C_DEFINE(name) \
430 static ove_i2c_storage_t name
431#endif /* CONFIG_OVE_I2C */
432
/* ove_storage_define */
434
458/* Helper: constructor preamble */
459#define OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
460 __attribute__((used)) \
461 static void __attribute__((constructor)) \
462 _##name##_ctor(void) {
463
464#define OVE_DEFINE_STATIC_CTOR_END_(name) \
465 OVE_STATIC_INIT_ASSERT(_err == OVE_OK); \
466 }
469#ifdef CONFIG_OVE_ZERO_HEAP
470/* ── Zero-heap: use static storage + _init() ─────────────────────────── */
471
477#define OVE_MUTEX_DEFINE_STATIC(name) \
478 static ove_mutex_storage_t _##name##_storage; \
479 static ove_mutex_t name; \
480 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
481 int _err = ove_mutex_init(&name, &_##name##_storage); \
482 OVE_DEFINE_STATIC_CTOR_END_(name)
483
489#define OVE_RECURSIVE_MUTEX_DEFINE_STATIC(name) \
490 static ove_mutex_storage_t _##name##_storage; \
491 static ove_mutex_t name; \
492 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
493 int _err = ove_recursive_mutex_init(&name, \
494 &_##name##_storage); \
495 OVE_DEFINE_STATIC_CTOR_END_(name)
496
504#define OVE_SEM_DEFINE_STATIC(name, initial, max) \
505 static ove_sem_storage_t _##name##_storage; \
506 static ove_sem_t name; \
507 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
508 int _err = ove_sem_init(&name, &_##name##_storage, \
509 (initial), (max)); \
510 OVE_DEFINE_STATIC_CTOR_END_(name)
511
517#define OVE_EVENT_DEFINE_STATIC(name) \
518 static ove_event_storage_t _##name##_storage; \
519 static ove_event_t name; \
520 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
521 int _err = ove_event_init(&name, &_##name##_storage); \
522 OVE_DEFINE_STATIC_CTOR_END_(name)
523
529#define OVE_CONDVAR_DEFINE_STATIC(name) \
530 static ove_condvar_storage_t _##name##_storage; \
531 static ove_condvar_t name; \
532 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
533 int _err = ove_condvar_init(&name, &_##name##_storage); \
534 OVE_DEFINE_STATIC_CTOR_END_(name)
535
546#define OVE_THREAD_DEFINE_STATIC(hname, stack_sz, fn, ctx, prio, tname) \
547 static ove_thread_storage_t _##hname##_storage; \
548 OVE_THREAD_STACK_DEFINE_(_##hname##_stack, stack_sz); \
549 static ove_thread_t hname; \
550 OVE_DEFINE_STATIC_CTOR_BEGIN_(hname) \
551 struct ove_thread_desc _desc = { \
552 .name = (tname), \
553 .entry = (fn), \
554 .arg = (ctx), \
555 .priority = (prio), \
556 .stack_size = (stack_sz), \
557 .stack = _##hname##_stack, \
558 }; \
559 int _err = ove_thread_init(&hname, \
560 &_##hname##_storage, &_desc); \
561 OVE_DEFINE_STATIC_CTOR_END_(hname)
562
570#define OVE_QUEUE_DEFINE_STATIC(name, item_sz, max) \
571 static ove_queue_storage_t _##name##_storage; \
572 static uint8_t _##name##_buf[(item_sz) * (max)]; \
573 static ove_queue_t name; \
574 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
575 int _err = ove_queue_init(&name, &_##name##_storage, \
576 _##name##_buf, (item_sz), (max)); \
577 OVE_DEFINE_STATIC_CTOR_END_(name)
578
588#define OVE_TIMER_DEFINE_STATIC(name, cb, user_data, period_ms, one_shot) \
589 static ove_timer_storage_t _##name##_storage; \
590 static ove_timer_t name; \
591 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
592 int _err = ove_timer_init(&name, &_##name##_storage, \
593 (cb), (user_data), (period_ms), (one_shot)); \
594 OVE_DEFINE_STATIC_CTOR_END_(name)
595
601#define OVE_EVENTGROUP_DEFINE_STATIC(name) \
602 static ove_eventgroup_storage_t _##name##_storage; \
603 static ove_eventgroup_t name; \
604 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
605 int _err = ove_eventgroup_init(&name, \
606 &_##name##_storage); \
607 OVE_DEFINE_STATIC_CTOR_END_(name)
608
617#define OVE_WORKQUEUE_DEFINE_STATIC(name, stack_sz, wq_name, prio) \
618 static ove_workqueue_storage_t _##name##_storage; \
619 static uint8_t _##name##_stack[(stack_sz)]; \
620 static ove_workqueue_t name; \
621 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
622 int _err = ove_workqueue_init(&name, \
623 &_##name##_storage, (wq_name), (prio), \
624 (stack_sz), _##name##_stack); \
625 OVE_DEFINE_STATIC_CTOR_END_(name)
626
633#define OVE_WORK_DEFINE_STATIC(name, handler) \
634 static ove_work_storage_t _##name##_storage; \
635 static ove_work_t name; \
636 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
637 int _err = ove_work_init_static(&name, \
638 &_##name##_storage, (handler)); \
639 OVE_DEFINE_STATIC_CTOR_END_(name)
640
648#define OVE_STREAM_DEFINE_STATIC(name, buf_sz, trigger) \
649 static ove_stream_storage_t _##name##_storage; \
650 static uint8_t _##name##_buf[(buf_sz) + 1]; \
651 static ove_stream_t name; \
652 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
653 int _err = ove_stream_init(&name, &_##name##_storage, \
654 _##name##_buf, (buf_sz), (trigger)); \
655 OVE_DEFINE_STATIC_CTOR_END_(name)
656
663#define OVE_WATCHDOG_DEFINE_STATIC(name, timeout_ms) \
664 static ove_watchdog_storage_t _##name##_storage; \
665 static ove_watchdog_t name; \
666 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
667 int _err = ove_watchdog_init(&name, \
668 &_##name##_storage, (timeout_ms)); \
669 OVE_DEFINE_STATIC_CTOR_END_(name)
670
671#ifdef CONFIG_OVE_INFER
680#define OVE_MODEL_DEFINE_STATIC(name, model_ptr, model_sz, arena_sz) \
681 static ove_model_storage_t _##name##_storage; \
682 static uint8_t __attribute__((aligned(16))) _##name##_arena[(arena_sz)]; \
683 static ove_model_t name; \
684 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
685 struct ove_model_config _cfg = { \
686 .model_data = (model_ptr), \
687 .model_size = (model_sz), \
688 .arena_size = (arena_sz), \
689 }; \
690 int _err = ove_model_init(&name, \
691 &_##name##_storage, _##name##_arena, &_cfg); \
692 OVE_DEFINE_STATIC_CTOR_END_(name)
693#endif /* CONFIG_OVE_INFER */
694
695#ifdef CONFIG_OVE_I2C
703#define OVE_I2C_DEFINE_STATIC(name, inst, spd) \
704 static ove_i2c_storage_t _##name##_storage; \
705 static ove_i2c_t name; \
706 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
707 struct ove_i2c_cfg _cfg = { \
708 .instance = (inst), .speed = (spd), \
709 }; \
710 int _err = ove_i2c_init(&name, \
711 &_##name##_storage, &_cfg); \
712 OVE_DEFINE_STATIC_CTOR_END_(name)
713#endif /* CONFIG_OVE_I2C */
714
715#ifdef CONFIG_OVE_SPI
722#define OVE_SPI_DEFINE_STATIC(name, cfg_ptr) \
723 static ove_spi_storage_t _##name##_storage; \
724 static ove_spi_t name; \
725 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
726 int _err = ove_spi_init(&name, \
727 &_##name##_storage, (cfg_ptr)); \
728 OVE_DEFINE_STATIC_CTOR_END_(name)
729#endif /* CONFIG_OVE_SPI */
730
731#ifdef CONFIG_OVE_UART
739#define OVE_UART_DEFINE_STATIC(name, rx_buf_sz, cfg_ptr) \
740 static ove_uart_storage_t _##name##_storage; \
741 static uint8_t _##name##_rx_buf[(rx_buf_sz)]; \
742 static ove_uart_t name; \
743 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
744 int _err = ove_uart_init(&name, \
745 &_##name##_storage, _##name##_rx_buf, (cfg_ptr)); \
746 OVE_DEFINE_STATIC_CTOR_END_(name)
747#endif /* CONFIG_OVE_UART */
748
749#else /* !CONFIG_OVE_ZERO_HEAP */
750/* ── Heap mode: use _create() — works on all backends ────────────────── */
751
757#define OVE_MUTEX_DEFINE_STATIC(name) \
758 static ove_mutex_t name; \
759 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
760 int _err = ove_mutex_create(&name); \
761 OVE_DEFINE_STATIC_CTOR_END_(name)
762
768#define OVE_RECURSIVE_MUTEX_DEFINE_STATIC(name) \
769 static ove_mutex_t name; \
770 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
771 int _err = ove_recursive_mutex_create(&name); \
772 OVE_DEFINE_STATIC_CTOR_END_(name)
773
781#define OVE_SEM_DEFINE_STATIC(name, initial, max) \
782 static ove_sem_t name; \
783 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
784 int _err = ove_sem_create(&name, (initial), (max)); \
785 OVE_DEFINE_STATIC_CTOR_END_(name)
786
792#define OVE_EVENT_DEFINE_STATIC(name) \
793 static ove_event_t name; \
794 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
795 int _err = ove_event_create(&name); \
796 OVE_DEFINE_STATIC_CTOR_END_(name)
797
803#define OVE_CONDVAR_DEFINE_STATIC(name) \
804 static ove_condvar_t name; \
805 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
806 int _err = ove_condvar_create(&name); \
807 OVE_DEFINE_STATIC_CTOR_END_(name)
808
819#define OVE_THREAD_DEFINE_STATIC(hname, stack_sz, fn, ctx, prio, tname) \
820 static ove_thread_t hname; \
821 OVE_DEFINE_STATIC_CTOR_BEGIN_(hname) \
822 struct ove_thread_desc _desc = { \
823 .name = (tname), \
824 .entry = (fn), \
825 .arg = (ctx), \
826 .priority = (prio), \
827 .stack_size = (stack_sz), \
828 }; \
829 int _err = ove_thread_create_(&hname, &_desc); \
830 OVE_DEFINE_STATIC_CTOR_END_(hname)
831
839#define OVE_QUEUE_DEFINE_STATIC(name, item_sz, max) \
840 static ove_queue_t name; \
841 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
842 int _err = ove_queue_create(&name, (item_sz), (max)); \
843 OVE_DEFINE_STATIC_CTOR_END_(name)
844
854#define OVE_TIMER_DEFINE_STATIC(name, cb, user_data, period_ms, one_shot) \
855 static ove_timer_t name; \
856 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
857 int _err = ove_timer_create(&name, \
858 (cb), (user_data), (period_ms), (one_shot)); \
859 OVE_DEFINE_STATIC_CTOR_END_(name)
860
866#define OVE_EVENTGROUP_DEFINE_STATIC(name) \
867 static ove_eventgroup_t name; \
868 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
869 int _err = ove_eventgroup_create(&name); \
870 OVE_DEFINE_STATIC_CTOR_END_(name)
871
880#define OVE_WORKQUEUE_DEFINE_STATIC(name, stack_sz, wq_name, prio) \
881 static ove_workqueue_t name; \
882 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
883 int _err = ove_workqueue_create(&name, \
884 (wq_name), (prio), (stack_sz)); \
885 OVE_DEFINE_STATIC_CTOR_END_(name)
886
893#define OVE_WORK_DEFINE_STATIC(name, handler) \
894 static ove_work_t name; \
895 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
896 int _err = ove_work_init(&name, (handler)); \
897 OVE_DEFINE_STATIC_CTOR_END_(name)
898
906#define OVE_STREAM_DEFINE_STATIC(name, buf_sz, trigger) \
907 static ove_stream_t name; \
908 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
909 int _err = ove_stream_create(&name, \
910 (buf_sz), (trigger)); \
911 OVE_DEFINE_STATIC_CTOR_END_(name)
912
919#define OVE_WATCHDOG_DEFINE_STATIC(name, timeout_ms) \
920 static ove_watchdog_t name; \
921 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
922 int _err = ove_watchdog_create(&name, (timeout_ms)); \
923 OVE_DEFINE_STATIC_CTOR_END_(name)
924
925#ifdef CONFIG_OVE_INFER
934#define OVE_MODEL_DEFINE_STATIC(name, model_ptr, model_sz, arena_sz) \
935 static ove_model_t name; \
936 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
937 struct ove_model_config _cfg = { \
938 .model_data = (model_ptr), \
939 .model_size = (model_sz), \
940 .arena_size = (arena_sz), \
941 }; \
942 int _err = ove_model_create(&name, &_cfg); \
943 OVE_DEFINE_STATIC_CTOR_END_(name)
944#endif /* CONFIG_OVE_INFER */
945
946#ifdef CONFIG_OVE_I2C
954#define OVE_I2C_DEFINE_STATIC(name, inst, spd) \
955 static ove_i2c_t name; \
956 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
957 struct ove_i2c_cfg _cfg = { \
958 .instance = (inst), .speed = (spd), \
959 }; \
960 int _err = ove_i2c_create(&name, &_cfg); \
961 OVE_DEFINE_STATIC_CTOR_END_(name)
962#endif /* CONFIG_OVE_I2C */
963
964#ifdef CONFIG_OVE_SPI
971#define OVE_SPI_DEFINE_STATIC(name, cfg_ptr) \
972 static ove_spi_t name; \
973 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
974 int _err = ove_spi_create(&name, (cfg_ptr)); \
975 OVE_DEFINE_STATIC_CTOR_END_(name)
976#endif /* CONFIG_OVE_SPI */
977
978#ifdef CONFIG_OVE_UART
986#define OVE_UART_DEFINE_STATIC(name, rx_buf_sz, cfg_ptr) \
987 static ove_uart_t name; \
988 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
989 (void)(rx_buf_sz); \
990 int _err = ove_uart_create(&name, (cfg_ptr)); \
991 OVE_DEFINE_STATIC_CTOR_END_(name)
992#endif /* CONFIG_OVE_UART */
993
994#endif /* CONFIG_OVE_ZERO_HEAP */
995
/* ove_storage_define_static */
997
/* ove_storage */
999
1000#endif /* OVE_STORAGE_H */