87#include "ove_config.h"
99#if defined(__ZIG_CIMPORT__)
103#if __has_include("zig_storage_sizes.h")
104#include "zig_storage_sizes.h"
108#if defined(__ZIG_CIMPORT__) && !defined(OVE_SIZEOF_OVE_THREAD_STORAGE)
109#ifdef CONFIG_OVE_ZERO_HEAP
110#error "Zero-heap mode requires storage sizes. Run cmake with ove_zig.cmake to generate zig_storage_sizes.h"
118} ove_mutex_storage_t;
124} ove_event_storage_t;
127} ove_condvar_storage_t;
130} ove_thread_storage_t;
133} ove_queue_storage_t;
136} ove_timer_storage_t;
139} ove_eventgroup_storage_t;
142} ove_workqueue_storage_t;
148} ove_stream_storage_t;
151} ove_watchdog_storage_t;
158#ifdef CONFIG_OVE_INFER
161} ove_model_storage_t;
166} ove_socket_storage_t;
169} ove_netif_storage_t;
171#ifdef CONFIG_OVE_NET_TLS
176#ifdef CONFIG_OVE_NET_HTTP
179} ove_http_client_storage_t;
181#ifdef CONFIG_OVE_NET_MQTT
184} ove_mqtt_client_storage_t;
186#ifdef CONFIG_OVE_UART
207#elif defined(__ZIG_CIMPORT__) || defined(__BINDGEN__)
223#define OVE_OPAQUE_(name, size, align) \
225 _Alignas(align) uint8_t _opaque[size]; \
233#ifndef OVE_SIZEOF_OVE_THREAD_STORAGE
234#error "Storage sizes not generated. Rust/Zig zero-heap builds require ove_{rust,zig}.cmake to produce storage sizes."
238OVE_OPAQUE_(ove_mutex_storage_t, OVE_SIZEOF_OVE_MUTEX_STORAGE, OVE_ALIGNOF_OVE_MUTEX_STORAGE);
239OVE_OPAQUE_(ove_sem_storage_t, OVE_SIZEOF_OVE_SEM_STORAGE, OVE_ALIGNOF_OVE_SEM_STORAGE);
240OVE_OPAQUE_(ove_event_storage_t, OVE_SIZEOF_OVE_EVENT_STORAGE, OVE_ALIGNOF_OVE_EVENT_STORAGE);
241OVE_OPAQUE_(ove_condvar_storage_t, OVE_SIZEOF_OVE_CONDVAR_STORAGE, OVE_ALIGNOF_OVE_CONDVAR_STORAGE);
242OVE_OPAQUE_(ove_thread_storage_t, OVE_SIZEOF_OVE_THREAD_STORAGE, OVE_ALIGNOF_OVE_THREAD_STORAGE);
243OVE_OPAQUE_(ove_queue_storage_t, OVE_SIZEOF_OVE_QUEUE_STORAGE, OVE_ALIGNOF_OVE_QUEUE_STORAGE);
244OVE_OPAQUE_(ove_timer_storage_t, OVE_SIZEOF_OVE_TIMER_STORAGE, OVE_ALIGNOF_OVE_TIMER_STORAGE);
245OVE_OPAQUE_(ove_eventgroup_storage_t, OVE_SIZEOF_OVE_EVENTGROUP_STORAGE,
246 OVE_ALIGNOF_OVE_EVENTGROUP_STORAGE);
247OVE_OPAQUE_(ove_workqueue_storage_t, OVE_SIZEOF_OVE_WORKQUEUE_STORAGE,
248 OVE_ALIGNOF_OVE_WORKQUEUE_STORAGE);
249OVE_OPAQUE_(ove_work_storage_t, OVE_SIZEOF_OVE_WORK_STORAGE, OVE_ALIGNOF_OVE_WORK_STORAGE);
250OVE_OPAQUE_(ove_stream_storage_t, OVE_SIZEOF_OVE_STREAM_STORAGE, OVE_ALIGNOF_OVE_STREAM_STORAGE);
251OVE_OPAQUE_(ove_watchdog_storage_t, OVE_SIZEOF_OVE_WATCHDOG_STORAGE,
252 OVE_ALIGNOF_OVE_WATCHDOG_STORAGE);
253OVE_OPAQUE_(ove_file_storage_t, OVE_SIZEOF_OVE_FILE_STORAGE, OVE_ALIGNOF_OVE_FILE_STORAGE);
254OVE_OPAQUE_(ove_dir_storage_t, OVE_SIZEOF_OVE_DIR_STORAGE, OVE_ALIGNOF_OVE_DIR_STORAGE);
255#if defined(CONFIG_OVE_INFER) && defined(OVE_SIZEOF_OVE_MODEL_STORAGE)
256OVE_OPAQUE_(ove_model_storage_t, OVE_SIZEOF_OVE_MODEL_STORAGE, OVE_ALIGNOF_OVE_MODEL_STORAGE);
258#if defined(CONFIG_OVE_NET) && defined(OVE_SIZEOF_OVE_SOCKET_STORAGE)
259OVE_OPAQUE_(ove_socket_storage_t, OVE_SIZEOF_OVE_SOCKET_STORAGE, OVE_ALIGNOF_OVE_SOCKET_STORAGE);
260OVE_OPAQUE_(ove_netif_storage_t, OVE_SIZEOF_OVE_NETIF_STORAGE, OVE_ALIGNOF_OVE_NETIF_STORAGE);
262#if defined(CONFIG_OVE_NET_TLS) && defined(OVE_SIZEOF_OVE_TLS_STORAGE)
263OVE_OPAQUE_(ove_tls_storage_t, OVE_SIZEOF_OVE_TLS_STORAGE, OVE_ALIGNOF_OVE_TLS_STORAGE);
265#if defined(CONFIG_OVE_NET_HTTP) && defined(OVE_SIZEOF_OVE_HTTP_CLIENT_STORAGE)
266OVE_OPAQUE_(ove_http_client_storage_t, OVE_SIZEOF_OVE_HTTP_CLIENT_STORAGE,
267 OVE_ALIGNOF_OVE_HTTP_CLIENT_STORAGE);
269#if defined(CONFIG_OVE_NET_MQTT) && defined(OVE_SIZEOF_OVE_MQTT_CLIENT_STORAGE)
270OVE_OPAQUE_(ove_mqtt_client_storage_t, OVE_SIZEOF_OVE_MQTT_CLIENT_STORAGE,
271 OVE_ALIGNOF_OVE_MQTT_CLIENT_STORAGE);
273#if defined(CONFIG_OVE_UART) && defined(OVE_SIZEOF_OVE_UART_STORAGE)
274OVE_OPAQUE_(ove_uart_storage_t, OVE_SIZEOF_OVE_UART_STORAGE, OVE_ALIGNOF_OVE_UART_STORAGE);
276#if defined(CONFIG_OVE_SPI) && defined(OVE_SIZEOF_OVE_SPI_STORAGE)
277OVE_OPAQUE_(ove_spi_storage_t, OVE_SIZEOF_OVE_SPI_STORAGE, OVE_ALIGNOF_OVE_SPI_STORAGE);
279#if defined(CONFIG_OVE_I2C) && defined(OVE_SIZEOF_OVE_I2C_STORAGE)
280OVE_OPAQUE_(ove_i2c_storage_t, OVE_SIZEOF_OVE_I2C_STORAGE, OVE_ALIGNOF_OVE_I2C_STORAGE);
282#if defined(CONFIG_OVE_I2S) && defined(OVE_SIZEOF_OVE_I2S_STORAGE)
283OVE_OPAQUE_(ove_i2s_storage_t, OVE_SIZEOF_OVE_I2S_STORAGE, OVE_ALIGNOF_OVE_I2S_STORAGE);
289#if defined(CONFIG_OVE_RTOS_FREERTOS)
290#include "ove_storage_freertos.h"
291#elif defined(CONFIG_OVE_RTOS_ZEPHYR)
292#include "ove_storage_zephyr.h"
293#elif defined(CONFIG_OVE_RTOS_NUTTX)
294#include "ove_storage_nuttx.h"
295#elif defined(CONFIG_OVE_RTOS_POSIX)
296#if defined(CONFIG_OVE_BOARD_WASM)
297#include "ove_storage_wasm.h"
299#include "ove_storage_posix.h"
318#if !defined(CONFIG_OVE_ZERO_HEAP)
319#define OVE_HEAP_SYNC 1
320#define OVE_HEAP_THREAD 1
321#define OVE_HEAP_QUEUE 1
322#define OVE_HEAP_TIMER 1
323#define OVE_HEAP_EVENTGROUP 1
324#define OVE_HEAP_WORKQUEUE 1
325#define OVE_HEAP_STREAM 1
326#define OVE_HEAP_WATCHDOG 1
328#define OVE_HEAP_AUDIO 1
329#define OVE_HEAP_INFER 1
330#define OVE_HEAP_NET 1
331#define OVE_HEAP_NET_TLS 1
332#define OVE_HEAP_NET_HTTP 1
333#define OVE_HEAP_NET_MQTT 1
334#define OVE_HEAP_UART 1
335#define OVE_HEAP_SPI 1
336#define OVE_HEAP_I2C 1
337#define OVE_HEAP_I2S 1
350#ifndef OVE_STATIC_INIT_ASSERT
351#define OVE_STATIC_INIT_ASSERT(cond) assert(cond)
373#define OVE_MUTEX_DEFINE(name) static ove_mutex_storage_t name
378#define OVE_SEM_DEFINE(name) static ove_sem_storage_t name
383#define OVE_EVENT_DEFINE(name) static ove_event_storage_t name
388#define OVE_CONDVAR_DEFINE(name) static ove_condvar_storage_t name
391#ifndef OVE_THREAD_STACK_DEFINE_
403#define OVE_THREAD_STACK_DEFINE_(name, size) static uint8_t __attribute__((aligned(8))) name[(size)]
413#ifndef OVE_THREAD_STACK_DEFINE_STATIC_
414#define OVE_THREAD_STACK_DEFINE_STATIC_(name, size) \
415 static uint8_t __attribute__((aligned(8))) name[(size)]
420#ifndef OVE_THREAD_STACK_BLOCK_STATIC_
421#define OVE_THREAD_STACK_BLOCK_STATIC_(name, size) \
422 static uint8_t __attribute__((aligned(8))) name[(size)]
428#ifndef OVE_THREAD_STACK_MEMBER_
442#define OVE_THREAD_STACK_MEMBER_(name, size) uint8_t __attribute__((aligned(8))) name[size]
451#define OVE_THREAD_DEFINE(name, stack_size_bytes) \
452 static ove_thread_storage_t name; \
453 OVE_THREAD_STACK_DEFINE_(name##_stack, stack_size_bytes)
462#define OVE_QUEUE_DEFINE(name, item_sz, max) \
463 static ove_queue_storage_t name; \
464 static uint8_t name##_buffer[(item_sz) * (max)]
469#define OVE_TIMER_DEFINE(name) static ove_timer_storage_t name
474#define OVE_EVENTGROUP_DEFINE(name) static ove_eventgroup_storage_t name
482#define OVE_WORKQUEUE_DEFINE(name, stack_size_bytes) \
483 static ove_workqueue_storage_t name; \
484 OVE_THREAD_STACK_DEFINE_(name##_stack, stack_size_bytes)
492#define OVE_STREAM_DEFINE(name, buf_size) \
493 static ove_stream_storage_t name; \
494 static uint8_t name##_buffer[(buf_size) + 1]
499#define OVE_WATCHDOG_DEFINE(name) static ove_watchdog_storage_t name
501#ifdef CONFIG_OVE_INFER
505#define OVE_MODEL_DEFINE(name) static ove_model_storage_t name
510#define OVE_MODEL_ARENA_DEFINE(name, size) static uint8_t __attribute__((aligned(16))) name[(size)]
513#ifdef CONFIG_OVE_UART
520#define OVE_UART_DEFINE(name, rx_buf_size) \
521 static ove_uart_storage_t name; \
522 static uint8_t name##_rx_buf[(rx_buf_size)]
529#define OVE_SPI_DEFINE(name) static ove_spi_storage_t name
536#define OVE_I2C_DEFINE(name) static ove_i2c_storage_t name
546#define OVE_I2S_DEFINE(name) static ove_i2s_storage_t name
575#define OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
576 __attribute__((used)) static void __attribute__((constructor)) _##name##_ctor(void) \
578#define OVE_DEFINE_STATIC_CTOR_END_(name) \
579 OVE_STATIC_INIT_ASSERT(_err == OVE_OK); \
590#define OVE_MUTEX_DEFINE_STATIC(name) \
591 static ove_mutex_storage_t _##name##_storage; \
592 static ove_mutex_t name; \
593 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
594 int _err = ove_mutex_init(&name, &_##name##_storage); \
595 OVE_DEFINE_STATIC_CTOR_END_(name)
602#define OVE_RECURSIVE_MUTEX_DEFINE_STATIC(name) \
603 static ove_mutex_storage_t _##name##_storage; \
604 static ove_mutex_t name; \
605 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
606 int _err = ove_recursive_mutex_init(&name, &_##name##_storage); \
607 OVE_DEFINE_STATIC_CTOR_END_(name)
616#define OVE_SEM_DEFINE_STATIC(name, initial, max) \
617 static ove_sem_storage_t _##name##_storage; \
618 static ove_sem_t name; \
619 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
620 int _err = ove_sem_init(&name, &_##name##_storage, (initial), (max)); \
621 OVE_DEFINE_STATIC_CTOR_END_(name)
628#define OVE_EVENT_DEFINE_STATIC(name) \
629 static ove_event_storage_t _##name##_storage; \
630 static ove_event_t name; \
631 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
632 int _err = ove_event_init(&name, &_##name##_storage); \
633 OVE_DEFINE_STATIC_CTOR_END_(name)
640#define OVE_CONDVAR_DEFINE_STATIC(name) \
641 static ove_condvar_storage_t _##name##_storage; \
642 static ove_condvar_t name; \
643 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
644 int _err = ove_condvar_init(&name, &_##name##_storage); \
645 OVE_DEFINE_STATIC_CTOR_END_(name)
657#define OVE_THREAD_DEFINE_STATIC(hname, stack_sz, fn, ctx, prio, tname) \
658 static ove_thread_storage_t _##hname##_storage; \
659 OVE_THREAD_STACK_DEFINE_(_##hname##_stack, stack_sz); \
660 static ove_thread_t hname; \
661 OVE_DEFINE_STATIC_CTOR_BEGIN_(hname) \
662 int _err = ove_thread_init(&hname, &_##hname##_storage, (tname), (fn), (ctx), (prio), \
663 (stack_sz), _##hname##_stack); \
664 OVE_DEFINE_STATIC_CTOR_END_(hname)
673#define OVE_QUEUE_DEFINE_STATIC(name, item_sz, max) \
674 static ove_queue_storage_t _##name##_storage; \
675 static uint8_t _##name##_buf[(item_sz) * (max)]; \
676 static ove_queue_t name; \
677 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
678 int _err = ove_queue_init(&name, &_##name##_storage, _##name##_buf, (item_sz), (max)); \
679 OVE_DEFINE_STATIC_CTOR_END_(name)
690#define OVE_TIMER_DEFINE_STATIC(name, cb, user_data, period_ms, one_shot) \
691 static ove_timer_storage_t _##name##_storage; \
692 static ove_timer_t name; \
693 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
694 int _err = ove_timer_init(&name, &_##name##_storage, (cb), (user_data), (period_ms), \
696 OVE_DEFINE_STATIC_CTOR_END_(name)
703#define OVE_EVENTGROUP_DEFINE_STATIC(name) \
704 static ove_eventgroup_storage_t _##name##_storage; \
705 static ove_eventgroup_t name; \
706 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
707 int _err = ove_eventgroup_init(&name, &_##name##_storage); \
708 OVE_DEFINE_STATIC_CTOR_END_(name)
718#define OVE_WORKQUEUE_DEFINE_STATIC(name, stack_sz, wq_name, prio) \
719 static ove_workqueue_storage_t _##name##_storage; \
720 OVE_THREAD_STACK_DEFINE_(_##name##_stack, (stack_sz)); \
721 static ove_workqueue_t name; \
722 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
723 int _err = ove_workqueue_init(&name, &_##name##_storage, (wq_name), (prio), (stack_sz), \
725 OVE_DEFINE_STATIC_CTOR_END_(name)
733#define OVE_WORK_DEFINE_STATIC(name, handler) \
734 static ove_work_storage_t _##name##_storage; \
735 static ove_work_t name; \
736 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
737 int _err = ove_work_init_static(&name, &_##name##_storage, (handler)); \
738 OVE_DEFINE_STATIC_CTOR_END_(name)
747#define OVE_STREAM_DEFINE_STATIC(name, buf_sz, trigger) \
748 static ove_stream_storage_t _##name##_storage; \
749 static uint8_t _##name##_buf[(buf_sz) + 1]; \
750 static ove_stream_t name; \
751 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
752 int _err = ove_stream_init(&name, &_##name##_storage, _##name##_buf, (buf_sz), (trigger)); \
753 OVE_DEFINE_STATIC_CTOR_END_(name)
761#define OVE_WATCHDOG_DEFINE_STATIC(name, timeout_ms) \
762 static ove_watchdog_storage_t _##name##_storage; \
763 static ove_watchdog_t name; \
764 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
765 int _err = ove_watchdog_init(&name, &_##name##_storage, (timeout_ms)); \
766 OVE_DEFINE_STATIC_CTOR_END_(name)
768#ifdef CONFIG_OVE_INFER
777#define OVE_MODEL_DEFINE_STATIC(name, model_ptr, model_sz, arena_sz) \
778 static ove_model_storage_t _##name##_storage; \
779 static uint8_t __attribute__((aligned(16))) _##name##_arena[(arena_sz)]; \
780 static ove_model_t name; \
781 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
782 struct ove_model_config _cfg = { \
783 .model_data = (model_ptr), \
784 .model_size = (model_sz), \
785 .arena_size = (arena_sz), \
787 int _err = ove_model_init(&name, &_##name##_storage, _##name##_arena, &_cfg); \
788 OVE_DEFINE_STATIC_CTOR_END_(name)
799#define OVE_I2C_DEFINE_STATIC(name, inst, spd) \
800 static ove_i2c_storage_t _##name##_storage; \
801 static ove_i2c_t name; \
802 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
803 struct ove_i2c_cfg _cfg = { \
804 .instance = (inst), \
807 int _err = ove_i2c_init(&name, &_##name##_storage, &_cfg); \
808 OVE_DEFINE_STATIC_CTOR_END_(name)
818#define OVE_SPI_DEFINE_STATIC(name, cfg_ptr) \
819 static ove_spi_storage_t _##name##_storage; \
820 static ove_spi_t name; \
821 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
822 int _err = ove_spi_init(&name, &_##name##_storage, (cfg_ptr)); \
823 OVE_DEFINE_STATIC_CTOR_END_(name)
826#ifdef CONFIG_OVE_UART
834#define OVE_UART_DEFINE_STATIC(name, rx_buf_sz, cfg_ptr) \
835 static ove_uart_storage_t _##name##_storage; \
836 static uint8_t _##name##_rx_buf[(rx_buf_sz)]; \
837 static ove_uart_t name; \
838 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
839 int _err = ove_uart_init(&name, &_##name##_storage, _##name##_rx_buf, (cfg_ptr)); \
840 OVE_DEFINE_STATIC_CTOR_END_(name)
862#define OVE_I2S_DEFINE_STATIC(name, tx_dma_bytes, rx_dma_bytes, cfg_ptr) \
863 static ove_i2s_storage_t _##name##_storage; \
864 static uint8_t __attribute__((aligned(4))) _##name##_tx_buf[(tx_dma_bytes)]; \
865 static uint8_t __attribute__((aligned(4))) _##name##_rx_buf[(rx_dma_bytes)]; \
866 static ove_i2s_t name; \
867 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
868 int _err = ove_i2s_init(&name, &_##name##_storage, _##name##_tx_buf, _##name##_rx_buf, \
870 OVE_DEFINE_STATIC_CTOR_END_(name)
884#define OVE_NETIF_DEFINE_STATIC(name) \
885 static ove_netif_storage_t _##name##_storage; \
886 static ove_netif_t name; \
887 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
888 int _err = ove_netif_init(&name, &_##name##_storage); \
889 OVE_DEFINE_STATIC_CTOR_END_(name)
898#define OVE_SOCKET_DEFINE(name) static ove_socket_storage_t name
901#ifdef CONFIG_OVE_NET_TLS
911#define OVE_TLS_DEFINE_STATIC(name) \
912 static ove_tls_storage_t _##name##_storage; \
913 static ove_tls_t name; \
914 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
915 int _err = ove_tls_init(&name, &_##name##_storage); \
916 OVE_DEFINE_STATIC_CTOR_END_(name)
919#ifdef CONFIG_OVE_NET_HTTP
929#define OVE_HTTP_CLIENT_DEFINE_STATIC(name) \
930 static ove_http_client_storage_t _##name##_storage; \
931 static ove_http_client_t name; \
932 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
933 int _err = ove_http_client_init(&name, &_##name##_storage); \
934 OVE_DEFINE_STATIC_CTOR_END_(name)
937#ifdef CONFIG_OVE_NET_MQTT
946#define OVE_MQTT_CLIENT_DEFINE_STATIC(name) \
947 static ove_mqtt_client_storage_t _##name##_storage; \
948 static ove_mqtt_client_t name; \
949 OVE_DEFINE_STATIC_CTOR_BEGIN_(name) \
950 int _err = ove_mqtt_client_init(&name, &_##name##_storage); \
951 OVE_DEFINE_STATIC_CTOR_END_(name)