RTEMS — Real-Time Executive for Multiprocessor Systems

RTEMS este un sistem de operare open-source pentru embedded și timp real, folosit în aplicații critice.

Ce este RTEMS?

RTEMS (Real-Time Executive for Multiprocessor Systems) e un sistem de operare open-source pentru aplicații embedded cu cerințe stricte de timp real. Dezvoltat inițial de U.S. Army, RTEMS a fost folosit în misiuni NASA, acceleratoare de particule, și sisteme de control industrial.

Caracteristici fundamentale

| Caracteristică | Descriere | |---|---| | Tip | RTOS (Real-Time Operating System) | | Licență | BSD-style (permisivă, friendly pentru proiecte comerciale) | | API | POSIX, Classic RTEMS API, RTEIDL | | Scheduling | Prioritate preemptivă, Rate Monotonic, round-robin | | MP | Suport omogen și eterogen | | Memorie | Alocare dinamică, regiuni, partiții | | IPC | Mesaje, semafoare, evenimente, semnale | | Arhitecturi | ARM, PowerPC, SPARC, x86, RISC-V, MIPS, MSP430 |

Unde se folosește

NASA — Mars Rover

RTEMS a fost ales pentru controlul rover-elor NASA datorită fiabilității și certificării în medii critice. Sistemul rulează pe procesoare RAD-hard (rezistente la radiații) din familia SPARC.

CERN — Acceleratoare de particule

Sistemele de control pentru fasciculele de particule de la CERN folosesc RTEMS pentru achiziție date în timp real cu latențe sub microsecundă.

Domenii tipice

  • Aerospațial și apărare: sateliți, drone, ghidaj
  • Industrial: controlere PLC, robotică, SCADA
  • Automotive: sisteme de frânare, airbaguri, ECU
  • Medical: pompe de infuzie, aparatură de diagnostic
  • Telecomunicații: routere, switch-uri, stații de bază

Arhitectură

RTEMS e structurat pe mai multe niveluri, fiecare cu responsabilități bine definite:

1. Kernel (CPUKit)

Inima sistemului: scheduler, gestionare task-uri, sincronizare, timere.

Scheduler: Prioritate preemptivă cu 256 de nivele. Task-ul cu cea mai mare prioritate gata de execuție rulează întotdeauna. În varianta SMP, cozile de prioritate sunt distribuite pe nuclee.

2. BSP (Board Support Package)

Stratul care abstractizează hardware-ul specific al plăcii. Fiecare placă are propriul BSP, care implementează:

  • Inițializarea procesorului și a perifericelor
  • Gestionarea întreruperilor (ISR)
  • Timere de sistem
  • Console I/O prin UART

3. Device Drivers

Drivere generice și specifice pentru dispozitive: SPI, I²C, CAN, Ethernet, GPIO, ADC/DAC.

4. API Layer

Expoziție publică sub formă de:

  • Classic RTEMS API: API-ul nativ, optimizat pentru performanță
  • POSIX API: Compatibilitate cu standardele UNIX (pthreads, semaphore, mqueue)
  • RTEIDL: IDL pentru sisteme distribuite

Concepte esențiale

Task-uri

Un task e o unitate de execuție cu prioritate, stack propriu și context. Stările unui task:

READY → RUNNING → BLOCKED
  ↑         ↓
  └─────────┘
  • READY: Așteaptă procesorul
  • RUNNING: Rulează activ
  • BLOCKED: Așteaptă un eveniment/resursă

Scheduling — Rate Monotonic

Pentru task-uri periodice, RTEMS suportă Rate Monotonic Scheduling (RMS) — cu cât perioada e mai scurtă, cu atât prioritatea e mai mare.

Regula: Un set de n task-uri poate fi schedulat RMS dacă: ∑ᵢ Cᵢ/Tᵢ ≤ n(2^{1/n} − 1)

unde Cᵢ = timpul de execuție, Tᵢ = perioada.

Pentru n→∞, limita e ln 2 ≈ 0.693 — adică CPU-ul nu poate fi încărcat mai mult de ~69% cu task-uri periodice în RMS pur.

IPC — Comunicare între task-uri

| Mecanism | Descriere | Tip | |---|---|---| | Mesaje | Schimb de date structurate, buffere | Asincron / sincron | | Semafoare | Sincronizare, mutex cu moștenire de prioritate | Blocant | | Evenimente | Semnalizare pe 32 de biți per task | Asincron | | Semnal | Notificare între task-uri | Asincron | | Region/Partition | Gestionare memorie | Dinamic / static |

Moștenirea priorității

O problemă clasică în RTOS: un task cu prioritate înaltă așteaptă un mutex deținut de un task cu prioritate joasă. Fără moștenire, apare inversionarea priorității — task-ul de prioritate medie poate „depăși" task-ul de prioritate înaltă.

RTEMS implementează moștenirea priorității (priority inheritance): task-ul care deține mutex-ul „moștenește" temporar prioritatea celui mai înalt task care așteaptă, eliminând inversiunea.

Exemplu — task periodic minimal

task_init():
    while true:
        citire_senzori()       // I/O
        procesare_date()       // calcul
        actualizare_actuatori()// I/O
        sleep_until(next_period)

Structura clasică a unui task RTEMS: inițializare, buclă infinită cu operații I/O și procesare, sincronizare temporală.

RTEMS vs Linux

| Caracteristică | RTEMS | Linux | |---|---|---| | Latență întrerupere | < 1 µs | 5-20 µs (RT patch ~5 µs) | | Scheduling | Preemptiv, determinist | Round-robin, CFS | | Memorie | Alocare statică recomandată | Paginare, swap, virtuală | | Driver model | Manual, BSP-specific | Generic, plug-and-play | | Userspace/Kernel | Un singur spațiu de adrese | Separare completă | | Dimensiune nucleu | 50-500 KB | 5-50 MB | | Aplicații tipice | Sateliți, rover-e | Servere, desktop, embedded complex |

Licență

RTEMS e distribuit sub o licență BSD-style — poți folosi, modifica și distribui fără restricții, inclusiv în produse comerciale. Nu există obligația de a publica modificările.

Resurse

  • Site oficial: https://www.rtems.org/
  • Documentație: https://docs.rtems.org/
  • Cod sursă: https://gitlab.rtems.org/rtems/
  • Listă discuții: users@rtems.org