Skip to content

Guest Support ​

RVM paravirtualizes RTOS kernels with drop-in port layers: the guest library mirrors the relative layout of each official RTOS tree and contains only the files that were added — official kernel files are never included or modified, so a plain overlay is always safe.

Support matrix ​

GuestVersionStatusARMv6-MARMv7-MRV32 (RISC-V)Toolchains
RMPlatestPractical✅✅✅Keil, IAR, GCC
FreeRTOSV9.0.0Practical✅✅✅Keil (RVDS), IAR, GCC
uC/OS-IIV2.93Practical✅✅✅Keil (RVDS), IAR, GCC
uC/OS-IIIV3.08.02Practical✅✅✅Keil (RVDS), IAR, GCC
RT-ThreadV4.1.1Practical✅✅✅Keil (RVDS), IAR, GCC (RV32: GCC only)
DjyOSV1.1.0Commemorative—✅ M7 only—GCC (STM32H743 only)
KLiteV5.2.1Commemorative—✅ M7 only—GCC (STM32H743 only)
  • Practical ports cover the full architecture/toolchain matrix above and are measured in the benchmark tables.
  • Commemorative ports are memorial single-combination ports (Cortex-M7 + GCC + STM32H743ZIT6). They demonstrate the porting technique on kernels with a fixed single combination.
  • RMP is not distributed in the guest library: it carries its RVM platform layers natively (Source/Platform/*_RVM/ in the RMP tree) and needs no guest-side packaging.

Evaluation boards

Cortex-M0+: STM32G071RBT6 · Cortex-M4: STM32F429ZIT6 · Cortex-M7: STM32H743ZIT6 · RV32IMAC: CH32V307VCT6

Per-guest notes ​

RMP ​

EDI's own real-time kernel. It defines the original RVM switch template that every other port transplants: locked-state yield requests become a kernel pend flag replayed at unlock, so the port only ever sees unmasked, immediate switch requests.

FreeRTOS ​

A software deferred-yield that mimics the official PendSV pend via a nesting counter. configUSE_RVM_OPTIMISED_YIELD selects between the task-stack fast path and the pure-hypercall yield (which costs ~4x Yield latency with identical semantics); on RV32P, configUSE_PORT_RVF/configUSE_PORT_RVD select the FPU frame width.

uC/OS-II ​

Self-contained (no uC-CPU/uC-LIB). OS_CPU_SR_Save/Restore map onto the RVM virtual interrupt mask snapshot; clean frames take the assembly fast path, dirty ones the yield hypercall. Kernel objects must be created from a task context, so applications boot from an init task.

uC/OS-III ​

OS_CFG_RVM_FAST_YIELD_EN toggles the same fast/hypercall trade-off as FreeRTOS. The direct switch always lands the incoming task unmasked, preserving the kernel's Disable; Yield; Enable contract.

RT-Thread ​

Fast path for clean frames, deferred hypercall path for dirty ICI/IT frames. Requires RT_USING_LIBC. On RV32P the port is GCC-only.

DjyOS (commemorative) ​

DjyOS schedules events; every switch runs inside the kernel's async-signal mask. The port hosts all threads in one RVM user thread and masquerades contexts as 22-word exception frames. The guest must be compiled with -mfloat-abi=soft.

KLite (commemorative) ​

The always-deferred kernel shape: cpu_contex_switch() only pends, and the outermost cpu_leave_critical() consumes the pend through a yield dispatcher with a masquerade fast path. Selected in the project generator with the -klt flag.

Port contracts ​

Every port implements the same five-part job — critical sections, yield, context switch, interrupt delivery hooks and startup — while each kernel guarantees something different. The full contract/strategy analysis for each guest (including the interrupt model's three-layer gate and frame interchangeability) lives in the GUEST.md document in the repository.

For installation (tree overlay) and project generation, see Getting Started.

An official work of EDI, released into the public domain.