1.6 KB ROM, 432 B RAM
The absolute minimum is reached on an STM32F030F4 (Cortex-M0) — including the first thread's control block and stack. The kernel plus a stripped vendor HAL is 52 bytes of that footprint.
One C file, 1.6 KB of ROM and 432 bytes of RAM at the low end, and fifty-odd build projects from 8-bit AVR to Cortex-M55 and RISC-V. Small enough to reason about — and to run as a guest on RVM.
RMP.nes into an emulator — the full benchmark output runs without a board. 
Verification is still under construction
Formal verification is not finished: stage 1 (a working, portable kernel) is complete, stage 2 (the formal specification and its proofs) is in progress, and stage 3 (a verified rewrite targeting IEC 61508 SIL 4 / ISO 26262 ASIL D) has not started. Today the evidence is 100% branch coverage in white-box tests — pre-certified SIL 2 / EAL 4, not a certificate.
RMP deliberately provides every basic RTOS primitive and nothing more: threads, semaphores, mailboxes, FIFOs, message queues, blocking message queues, alarms, scheduler locking, and an efficient memory pool. That minimality is not an aesthetic choice — it is what makes the kernel small enough to understand, test to full branch coverage, and eventually prove.
The same kernel source runs on a 32 KB AVR, a 16-bit MSP430, a 32-bit Cortex-R5 and a RISC-V microcontroller. Ports are deliberately kept thin so the abstraction is exercised by real hardware rather than by a simulator. The full list, including every build project and toolchain, is on the ports page.



RMP ships two ready-to-run demonstrations that need no hardware:
Project/GCCMF-X86L and watch the benchmark output. RMP runs on top of ptrace and signals, so it is not fast, but every primitive works.RMP.nes and load it into your favourite emulator. The Namco 163 mapper is required: its readable IRQ timer is what RMP uses to measure cycles.
RMP is a complete bare-metal RTOS, and it is also the reference guest of RVM: the same source tree builds a virtualized variant that runs as an unprivileged virtual machine, with all privileged operations routed through the monitor. The virtualized ports keep the kernel ABI intact, which is why RMP is used to measure the cost of virtualization itself.
| Port | Chip | Yield | Sem | |
|---|---|---|---|---|
| ARMv6-M | STM32L071CB | 400 | 751 | 649 |
| ARMv7-M | STM32F405RG | 312 | 540 | 448 |
| ARMv7-M | STM32F767IG | 192 | 352 | 292 |
| RV32IMAC | CH32V307VC | 233 | 384 | 336 |
All values are CPU cycles, GCC, highest optimization. The benchmark page has the complete tables, including the virtualization overhead columns.
void Func_1(void* Param)
{
RMP_LOG_S("Parameter passed is ");
RMP_LOG_H((ptr_t)Param);
RMP_LOG_S("\r\n");
while(1)
{
RMP_Thd_Delay(30000);
RMP_LOG_S("Delayed 30000 cycles\r\n\r\n");
};
}
void RMP_Init_Hook(void)
{
RMP_Thd_Crt(&Thd_1, Func_1, &Stack_1, sizeof(Stack_1),
(void*)0x12345678, 1, 5);
}That is the whole "hello world": a thread control block, a stack array, and one call. The getting-started guide walks through compiling a real project and reading its benchmark output.