RTOS v embedded systémech

Co je RTOS a proč jej používat

RTOS (Real-Time Operating System) je operační systém navržený pro deterministické chování – tedy schopnost garantovat časově omezenou odezvu na události. Na rozdíl od běžných operačních systémů (Windows, Linux bez rozšíření pro real-time) klade RTOS důraz na přesné plánování úloh, predikovatelnost latencí a řízení zdrojů tak, aby kritické funkce systému (řízení motoru, brzd, ovládání robota, audio pipeline, rádiová komunikace) splnily své termíny (deadline).

  • Determinismus: chování úloh je analyticky předvídatelné (WCET, doba odezvy).
  • Malá stopa: nízké nároky na paměť (desítky až stovky kB), běh na MCU bez MMU.
  • Modularita: jádro, plánovač, synchronizační primitiva, mezivláknová komunikace (IPC), časovače, ovladače (drivery).
  • Bezpečnost: izolace, MPU/MMU, watchdog, zpracování chyb (fault-handling), certifikované varianty.

Typy real-time požadavků

  • Hard real-time: zmeškání termínu je nepřijatelné (brzdový systém, kardiostimulátor). Návrh musí prokázat splnitelnost termínů i v nejhorším případě.
  • Firm real-time: občasné zmeškání je tolerovatelné, ale snižuje užitek (síťová brána s QoS).
  • Soft real-time: preferuje se nízká latence a jitter, ale zmeškání termínu není kritické (audio streaming).

Časování, latence a metriky

  • WCET (Worst-Case Execution Time): horní hranice doby běhu úlohy na dané konfiguraci CPU a kompilátoru.
  • ISR latency: doba od vzniku přerušení po jeho obsluhu (ovlivňují maskování, priorita, kritické sekce).
  • Schedulovací latence: doba od uvolnění nejvyšší úlohy připravené k běhu do jejího spuštění (kontextové přepnutí, preempce).
  • Jitter: kolísání periody nebo odezvy; minimalizuje se výběrem plánovače, beztikovým režimem (tickless) a omezením kritických sekcí.

Plánovací algoritmy v RTOS

Volba plánovače ovlivňuje predikovatelnost a využití CPU. Běžně se používají:

  • Fixní priority (preemptivní): každé úloze je přiřazena priorita; vždy běží nejvyšší prioritní připravená úloha. Často doplněno o priority inheritance, aby se zabránilo inverzi priorit.
  • Rate-Monotonic (RM): periodičtějším úlohám je přiřazena vyšší priorita (fixní); analyticky lze ověřit splnitelnost dle využití CPU.
  • Deadline-Monotonic (DM): kratší deadline znamená vyšší prioritu (fixní).
  • Earliest Deadline First (EDF): dynamický plánovač, který vždy spouští úlohu s nejbližším deadlinem; na jednojádrových systémech je při nízké režii optimální.
  • Round-Robin: časové dělení mezi úlohami stejné priority; často se kombinuje s fixními prioritami.

Analýza splnitelnosti (schedulability)

Pro hard real-time systémy se provádí formální ověření, že všechny úlohy dokončí své termíny i v nejhorším možném scénáři.

  • Utilizační testy (Liu & Layland): pro RM platí mez pro n periodických úloh U ≤ n(2^{1/n} − 1).
  • Response Time Analysis (RTA): iterativní výpočet nejhorší doby odezvy úlohy, zahrnující interferenci vyšších priorit a blokace mutexy.
  • Jednoúčelové úlohy a sporadické servery: návrh pro obsluhu aperiodických požadavků bez ohrožení periodických úloh.

Úlohy, vlákna a stavy

  • Stavy: běžící (running), připravený (ready), blokovaný (na semaforu/frontě), pozastavený (suspended), odložený (delay – časovač), ukončený (terminated).
  • Atributy: priorita, zásobník (stack), afinitní jádro (SMP), perioda/deadline, hook pro sledování.
  • Životní cyklus: vytváření/zničení, pozastavení/obnovení, odložení, změna priority, událostmi řízený běh.

Přerušení (ISR) a kontextové přepínání

ISR musí být co nejkratší: pouze přečíst/uložit data, odmaskovat přerušení, notifikovat úlohu (semafory, fronty, event flagy). Náročnější zpracování přesunout do úloh s nižší prioritou. Je nezbytné:

  • Minimalizovat dobu se zakázanými přerušeními.
  • Nepoužívat blokující RTOS volání v ISR, pokud nejsou explicitně povolená.
  • Správně mapovat priority NVIC (ARM Cortex-M) a úrovně priorit RTOS.

Synchronizační primitiva a IPC

  • Mutex: zajišťuje exkluzivní přístup s podporou priority inheritance nebo priority ceiling proti inverzi priorit.
  • Binární semafor: signalizuje událost (typicky z ISR na úlohu).
  • Počítaný semafor: omezená kapacita zdroje (např. DMA kanály).
  • Fronty (message queues): přenos datových struktur mezi úlohami, často s kopírováním nebo zero-copy metodou.
  • Event groups: bitová maska pro agregaci signálů z více zdrojů.
  • Mailboxes/stream buffers: efektivní proudová data (UART, audio).
  • Časovače (software timers): odložené akce, periodické úkoly bez aktivního čekání.

Inverze priorit: detekce a mitigace

Inverze priorit nastává, když nízkoprioritní úloha blokuje vysokoprioritní kvůli sdílenému zámku. Řešení:

  • Priority Inheritance: dočasné zvýšení priority držitele zámku.
  • Priority Ceiling: zámek má „strop“ priority; při jeho zamčení se úloha automaticky zvýší na tuto hodnotu.
  • Lock-free/RCU: tam, kde je vhodné a bezpečné, volit bez-zámkové datové struktury.

Paměť a ochrana

  • Statická alokace: preferovaná v bezpečnostně kritických systémech, předvídatelná.
  • Dynamická alokace: pokud je nutná, použít deterministický alokátor (např. TLSF), pooly pevných bloků.
  • MPU/MMU: ochrana proti přetečení zásobníku, izolace úloh a ovladačů, sandboxing.
  • Velikost zásobníku: měření high watermark, ochranné pásmo (guard band), detekce přetečení.

Tick vs. tickless, časování a spotřeba

  • Tick-based: periodický systémový tik (např. 1 ms). Jednodušší, ale vyšší jitter a spotřeba energie.
  • Tickless: plánovač si nastaví nejbližší budík; nižší spotřeba a jitter, ale vyšší složitost implementace.
  • RTC/Low-power timers: slouží k uspání MCU a přesnému probuzení; vyžadují synchronizaci s jádrem RTOS.

Drivery, DMA a práce s periferiemi

V návrhu RTOS se doporučuje vrstvení: ISR → lehký HAL/BSP → fronty/eventy → úlohy. DMA snižuje zátěž CPU a jitter, ale vyžaduje správu cache a bariér (zejména u MCU s cache). Překrytí paměti, dvojité bufferování a „ping-pong“ techniky jsou standardem pro streamy (ADC, I2S, UART).

Síťování a průmyslové protokoly

  • TCP/IP stack: lwIP, podpora IPv4/IPv6, TLS offload, MQTT.
  • Průmyslové protokoly: CAN/CAN-FD, LIN, Modbus, EtherCAT; důraz na přesné cykly a nízké latence.
  • TSN (Time-Sensitive Networking): deterministický Ethernet (časová synchronizace, plánování přenosů).

Multiprocesorové RTOS: SMP vs. AMP

  • SMP: jedno plánovače pro více CPU jader; sdílené fronty, afinitní vazby, zámky, koherence cache.
  • AMP: každé jádro běží vlastní OS/RTOS; komunikace probíhá přes RPMsg, mailboxes, sdílenou paměť.
  • Heterogenní SoC: kombinace A-core (Linux) a M-core (RTOS) s remoteproc a virtio kanály.

Hypervizory a smíšeně kritické systémy

Pro konsolidaci funkcí a separaci domén lze využít lehké hypervizory (bare-metal partitioning, typ 1). Umožňují koexistenci bezpečnostně kritických částí (ASIL, DAL) s méně kritickými aplikacemi bez vzájemného rušení.

Real-time Linux vs. RTOS

  • PREEMPT_RT: rozšiřuje Linux o lepší latence; vhodný pro vyšší vrstvy a komplexní stacky.
  • RTOS: nižší režie, menší paměťová stopa, hlubší kontrola nad časováním. Často doplňuje Linux na jiném jádře.

Bezpečnost a spolehlivost

  • Watchdog a brown-out: zotavení z blokací a poklesů napětí.
  • Fail-safe a fail-operational: definice bezpečných stavů a degradovaných režimů.
  • Ochrana proti útokům: secure boot, kryptografické podpisy, řízení práv úloh, ASLR (kde je dostupné), OTA aktualizace s rollbackem.
  • Standardy: MISRA C/C++, CERT C, ISO 26262 (automotive), IEC 61508 (průmyslové systémy), DO-178C (letectví), IEC 62304 (medicína).

Volba RTOS a ekosystém

  • FreeRTOS/Azure RTOS ThreadX: široká podpora MCU, velká komunita, nástroje pro trace.
  • Zephyr: modulární, device tree, rozsáhlé subsystémy (BLE, TCP/IP, senzorika).
  • VxWorks, QNX: komerční, certifikovatelné, bohaté nástroje a dlouhodobá podpora.
  • RTEMS, NuttX, μC/OS: další ověřené varianty dle požadavků licence a funkcí.

Build, CI/CD a aktualizace

  • Reprodukovatelné buildy: uzamčení verzí toolchainu, kontejnerizace, hermetické build skripty.
  • Testy v CI: jednotkové testy (Ceedling/CppUTest), integrační, regresní, pokrytí kódu.
  • HIL (Hardware-in-the-Loop): automatizované testy s reálným hardwarem, měření latencí.
  • OTA: A/B sloty, kryptografické podpisy, bezpečný bootloader, robustní rollback.

Diagnostika a tracing v RTOS

  • Statistiky běhu: využití CPU na úlohu, délky front, watermarky zásobníků.
  • Trace: sledování přepínání úloh, ISR, blokací; nástroje jako ITM/SWO, ETM, trace knihovny.
  • Logování bez blokování: kruhový buffer, DMA do UART/USB, časová razítka s vysokým rozlišením.

Doba spuštění a start systému

  • Inicializace časovačů a NVIC: prioritizace kritických periferií před méně důležitými.
  • Minimalizace doby do „ready“ stavu: lazy init, deferované práce v nízkoprioritních úlohách.
  • Self-testy: CRC FW, testy RAM, sanity checky periferií.

Návrhové vzory pro RTOS aplikace

  • Producer–Consumer: ISR nebo senzory generují data do front; zpracování v pracovní úloze.
  • Command Dispatcher: fronta příkazů pro driver nebo komunikační stack.
  • State Machine per Task: každá úloha implementuje explicitní stavový automat; zlepšuje čitelnost a údržbu.
  • Time-Triggered Architecture: cyklické spouštění úloh s přesnými časy (major/minor cycle).

Typické pasti a jak se jim vyhnout

  • Nadměrné používání mutexů vede k deadlockům a jitteru; preferujte fronty a bez-zámkové postupy.
  • Dlouhá ISR a příliš rozsáhlé maskování přerušení způsobují vysoké latence.
  • Špatné dimenzování zásobníků vede ke záhadným pádům; sledujte watermarky.
  • Neřízená dynamická alokace způsobuje fragmentaci; používejte pooly a statickou alokaci.
  • Nedostatečné zohlednění cache a bariér u DMA vede k nekonzistentním datům.

Ukázková architektura malé RTOS aplikace

  • Úlohy: CommTask (vysoká priorita) pro RX/TX, ControlTask (střední priorita) pro regulaci, LoggerTask (nízká priorita) pro záznam dat.
  • ISR: UART RX ISR plní