Scheduling Wiring Matrix
Which scheduling capabilities nano-ros delivers per platform,
and which portable executor classes are live in dispatch —
derived from the two artifacts the runtime executes, not from
prose. The per-platform rows are parsed from sched_caps_for()
(nros-orchestration-ir), the exact function the workload realizer
calls to decide Native-vs-Degrade for a deployment; its rule, quoted
from the source: caps describe what nano-ros DELIVERS, not what
the OS could do (issue 0261).
Kernel capabilities per platform
| Platform | Kernel EDF | Reservation / sporadic server | Preemption threshold | SMP affinity | Priority levels | Low number = high priority |
|---|---|---|---|---|---|---|
| Linux host | — | — | — | ✓ | 99 | — |
| Zephyr | ✓ | — | — | ✓ | 32 | ✓ |
| FreeRTOS | — | — | — | ✓ | 16 | — |
| ThreadX | — | — | ✓ | ✓ | 32 | ✓ |
| NuttX | — | ✓ | — | ✓ | 255 | — |
| Bare-metal (RTIC / NVIC) | — | — | — | — | 8 | — |
Notes carried from the source arms: the Linux row is deliberately
conservative — no SCHED_DEADLINE consumer exists, so edf is
false even though Linux could; its affinity is sched_setaffinity,
which is Linux and not POSIX (absent from libc’s apple module), so the
row’s reach is linux while the platform layer beneath it stays
posix; Zephyr’s EDF is
CONFIG_SCHED_DEADLINE; NuttX’s reservation is POSIX
SCHED_SPORADIC; ThreadX’s preemption threshold is native; the
bare-metal row is NVIC hardware priorities with SRP ceilings (RTIC),
single core. These are PLATFORM DEFAULTS and there is no per-image
override today: [deploy.<board>] edf = <bool> / cores = <n> was
documented here but never authorable — the knob read an extras bag no
table wrote, and upstream’s deny_unknown_fields rejected the keys
outright. Retired with issue 0951; issue 0259 wants the override to
exist and needs an authoring path first.
Portable executor classes (SchedClass)
These run inside the executor on every platform — they need no
kernel support, which is what makes them portable; where the kernel
HAS the native capability (table above), the realizer places the
workload natively instead. “Dispatch sites” counts
SchedClass::<X> references in the executor’s spin path — a class
with zero sites is a type, not a behavior.
| Class | Dispatch sites in spin.rs | Status |
|---|---|---|
Fifo | 2 | Live — the default class; bucketed FIFO ready-set. |
Edf | 1 | Live — earliest-deadline-first ready-set ordering. |
Sporadic | 5 | Live — budget/period enforcement in dispatch. |
TimeTriggered | 1 | Accepted but deprecated in favour of cooperating TT-with-other-classes (see the enum’s deprecation note); dispatches as Fifo. |
Related
- Scheduling Models — the narrative: how tiers, transport priorities, and these classes land on each kernel
- RTOS Cooperation — spin-loop shapes per execution model
- Support Status · Per-RMW Feature Matrix