Configure
oveRTOS uses Kconfig for build configuration, processed by the ove CLI. All configuration is stored in .config in the project root.
Interactive Configuration
make menuconfig
This opens the Kconfig TUI. Use arrow keys to navigate, space to toggle options, and ? to read help text. Save with S and exit with Q.
The top-level menu is organised into:
- RTOS Selection — choose the backend
- Hardware Target — choose the board
- Toolchain — ARM cross-compiler source and settings
- oveRTOS Modules — enable or disable individual API modules
- Debug Options — log level, debug builds, stack canaries
Selecting the RTOS Backend
Under RTOS Selection > RTOS backend, choose one of:
| Option | Backend |
|---|---|
FreeRTOS |
FreeRTOS via STM32CubeF7 SDK |
Zephyr RTOS |
Zephyr Project via West |
Apache NuttX |
Apache NuttX RTOS |
POSIX (native host) |
pthreads + sim dashboard, no cross-compilation |
Enabling and Disabling Modules
Under oveRTOS Modules, each subsystem can be toggled independently. Two modules are always enabled (thread management and application lifecycle). The remaining modules are optional:
| Module | Config symbol | Kconfig default |
|---|---|---|
| Synchronization primitives | OVE_SYNC |
disabled |
| Audio engine | OVE_AUDIO |
disabled |
| Filesystem | OVE_FS |
disabled |
| Console I/O | OVE_CONSOLE |
disabled |
| Logging | OVE_LOG |
disabled |
| Time and delays | OVE_TIME |
disabled |
| Board descriptor | OVE_BOARD |
disabled |
| GPIO | OVE_GPIO |
disabled |
| LED control | OVE_LED |
disabled |
| BSP compatibility shim | OVE_BSP |
disabled |
| LVGL UI framework | OVE_LVGL |
disabled |
| Message queues | OVE_QUEUE |
disabled |
| Software timers | OVE_TIMER |
disabled |
| Event groups | OVE_EVENTGROUP |
disabled |
| Interactive shell | OVE_SHELL |
disabled |
| Non-volatile storage | OVE_NVS |
disabled |
| Watchdog timer | OVE_WATCHDOG |
disabled |
| Work queues | OVE_WORKQUEUE |
disabled |
| Stream I/O | OVE_STREAM |
disabled |
| Power management | OVE_PM |
disabled |
Defconfig files enable commonly used modules for each board/RTOS combination. When starting from scratch with make menuconfig, all optional modules default to disabled.
Zero-Heap Mode
At the bottom of oveRTOS Modules, enable Zero-heap build (OVE_ZERO_HEAP) to remove the _create()/_destroy() function declarations entirely (they are gated behind OVE_HEAP_*, which is undefined in zero-heap mode). Apps must use _init()/_deinit() with caller-supplied storage, or OVE_*_DEFINE_STATIC() at file scope. Calling a _create() symbol in a zero-heap build is a link error.
Backend-Specific Submenus
After selecting a backend, a dedicated menu appears with source method and kernel configuration options. For advanced NuttX or Zephyr kernel tuning, use the dedicated targets:
make nuttx-menuconfig # NuttX native kernel config TUI
make zephyr-menuconfig # Zephyr native kernel config TUI
Loading a Configuration
Configurations use dot-separated <board>.<rtos>.<app> syntax. The build system composes the final .config from config fragments (global, board, RTOS, app) defined in config/fragments/, board.yaml, and app.yaml:
make <board>.<rtos>.<app>
For example:
make qemu.freertos.example_c
make stm32f746.zephyr.example_cpp
make host.posix.example_rust
Zero-heap variants are separate apps with the _zh suffix:
make host.posix.example_c_zh
make qemu.freertos.example_cpp_zh
Each _zh app has its own app.yaml with CONFIG_OVE_ZERO_HEAP=y
and any storage-mode-specific tuning.
Available Boards, RTOSes, and Apps
Boards:
| Short name | Board |
|---|---|
host |
Host PC (POSIX native) |
qemu |
QEMU MPS2-AN500 (Cortex-M7) |
stm32f746 |
STM32F746G-Discovery |
wasm |
WebAssembly (Emscripten) |
RTOSes:
| Name | Boards |
|---|---|
posix |
host, wasm |
freertos |
qemu, stm32f746 |
nuttx |
qemu, stm32f746 |
zephyr |
qemu, stm32f746 |
Apps — the third token of the dot-syntax target is the config_name field from each app.yaml. The values below are the heap-mode config_names; each has a _zh zero-heap sibling (e.g. example_c_zh, example_cpp_zh).
config_name (heap mode) |
Description |
|---|---|
example_c, example_cpp, example_rust, example_zig |
Basic example |
benchmark, benchmark_cpp, benchmark_rust, benchmark_zig |
Latency/throughput benchmark |
example_net, example_net_cpp, example_net_rust, example_net_zig |
Networking |
example_pm_c, example_pm_cpp, example_pm_rust, example_pm_zig |
Power management |
example_keyword_live, example_keyword_live_cpp, example_keyword_live_rust, example_keyword_live_zig |
Keyword detection |
make help prints the live list pulled from the on-disk app.yaml files — authoritative if this table drifts.
Building All Configurations
Build all apps for a specific board/RTOS pair:
make allconfigs-host.posix
make allconfigs-qemu.freertos
make allconfigs-stm32f746.zephyr
Build every configuration across all boards and RTOSes:
make alldefconfigs
Run make help to see available targets at any time.
How Fragment Composition Works
The ove CLI composes the final .config by layering these fragments in order:
- Global fragment (
config/fragments/global.defconfig) — common modules - Board selection +
board.yamldefconfig entries — board-specific symbols - RTOS fragment (
config/fragments/rtos/<rtos>.defconfig) — RTOS selection and settings - Board+RTOS overrides from
board.yamlrtos_defconfig.<rtos>— per-RTOS board tuning - App selection +
app.yamldefconfig entries — app language and required modules - App+RTOS overrides from
app.yamlrtos_defconfig.<rtos>— per-RTOS app tuning
Each layer supplements the previous without overwriting, so earlier settings are preserved unless explicitly overridden.
Saving a Modified Configuration
After customising settings in menuconfig, save the minimal diff as a defconfig:
make savedefconfig