Skip to content

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:

  1. Global fragment (config/fragments/global.defconfig) — common modules
  2. Board selection + board.yaml defconfig entries — board-specific symbols
  3. RTOS fragment (config/fragments/rtos/<rtos>.defconfig) — RTOS selection and settings
  4. Board+RTOS overrides from board.yaml rtos_defconfig.<rtos> — per-RTOS board tuning
  5. App selection + app.yaml defconfig entries — app language and required modules
  6. App+RTOS overrides from app.yaml rtos_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