Yes. All event storage, timers, handlers (via Small Buffer Optimized FastDelegate), background service registrations, and coroutines allocate memory in static arrays and stack frames defined at compile time. This is verified automatically in CI via custom overloaded global new/delete hooks in test_zero_heap_guarantee.cpp.
Yes. The corium/async/ module is entirely modular and optional. You can use standard CRTP static polymorphism (corium::Application) with synchronous event handlers or background worker services (corium::BackgroundService) without using coroutines.
The queue capacity is a template parameter on BoundedMpscQueuePolicy or RuntimeBuilder (default 1024). A good rule of thumb is:
Yes. Use corium::embedded::IsrEventSink or corium::embedded::FreeRtosIsrSink. These handles push events into the lock-free Dmitry Vyukov ring buffer without acquiring mutexes or allocating memory, ensuring ISR safety across ARM CMSIS, ESP32, and STM32 platforms.
Corium provides configurable Overflow Policies:
DropNewestOverflowPolicy(default): Drops the incoming event quietly.DropOldestOverflowPolicy: Evicts the oldest unhandled event to prioritize fresh data.AuditOverflowPolicy: Increments an atomic drop counter for diagnostics and monitoring.PanicOverflowPolicy: Asserts or invokes the panic handler on overflow.
Yes. Corium includes:
corium::FreeRtosClockPolicy: Drives the timer scheduler fromxTaskGetTickCount().corium::embedded::FreeRtosIsrSink: ManagesxHigherPriorityTaskWokenandportYIELD_FROM_ISR().corium::embedded::InterruptLock: WrapstaskENTER_CRITICAL()/portENTER_CRITICAL().
Corium is a header-only library with two distribution options:
Option A: Add as submodule / subdirectory
add_subdirectory(corium)
target_link_libraries(my_app PRIVATE corium)Option B: Single-Header distribution
#include "corium/single_include/corium.hpp"