Un sistema operativo in real-time è un sistema operativo che funziona da supporto per applicazioni su sistemi real-time. Generalmente tali sistemi vengono utilizzati a scopo industriale, come ad esempio nel caso in cui si debbano trasferire dei dati durante alcuni processi di telecomunicazione. Tale sistema operativo non è noto per la sua velocità d’azione, quando per la capacità di restituire una risposta entro un tempo pre-determinato. I processi d’azione di un RTOS sono generalmente tre: periodici, aperiodici, sporadici. Nel primo caso le attività vengono compiute con una frequenza regolare, nel secondo caso invece avvengono con intervalli irregolari, mentre infine vengono compiuti raramente. Ci sono però altre casistiche:

  • soft real-time: un processo che non rispetta una scadenza pre-determinata. In questo modo provoca un danno reparabile al sistema in questione.
  • hard real-time: un task che qualora superi, in termini di tempo la sua deadline, provoca un danno irreparabile.
  • “anytime” :I tasks anytime elaborano dei dati che rispondono a requisiti di qualità minima e qualità massima.

Prima di procedere è bene fornire una più specifica definizione di cosa si un sistema RTOS.

RTOS: cos’è?

Per identificare cosa sia un RTOS è necessario partire da una differenza tra Time Sharing vs Real Time. Nel caso di classici sistemi operativi il tempo è condiviso. Ciò significa che diversi utenti possono connettersi nello stesso momento ed utilizzare il sistema operativo con ubicazioni differenti. Il sistema operativo RTOS invece svolge le attività in un determinato range di tempo.

Ma cerchiamo di approfondire ulteriormente: un sistema operativo è un interfaccia tra un software e una componente hardware. Esso svolge compiti come: gestione della memoria, gestione dei processi, gestione dei file.

Differenza tra sistemi Time Sharing vs Real Time

Per comprendere con maggiore chiarezza cosa si intenda con il termine RTOS è possibile iniziare da una distinzione già precedentemente annunciata, quella tra sistema Time Sharing vs Real Time. Nel primo caso tanti utenti possono utilizzare contemporaneamente un determinato sistema informatico. Come avviene ciò? In una situazione simile il tempo del processore viene condiviso temporaneamente tra diversi utenti. L’attività del processore avviene in tempi super veloci in modo che, quando l’utente fornire un input viene restituito un output immediatamente.

Quando parliamo di Sistema Real time ci riferiamo invece ad un sistema operativo che svolge una determinata attività in un tempo prestabilito. Quest’ultimo funziona in base ad alcuni vincoli temporali. In questo sistema operativo non è prevista alcuna condivisione di risorse, o meglio: queste restano fisse per un determinato periodo dopo di ché possono essere riassegnate.

Migliori RTOS

Ora che abbiamo compreso quali siano le caratteristiche di un simile sistema operativo cerchiamo di comprendere quali sono i migliori. Potremmo parlare di FreeRTOS, oppure di VxWorks, QNX e Linux.

FreeRTOS è un core del sistema operativo in tempo reale. La caratteristica principale di questo kernel sta nel fatto che è costituito da soli 3 file, per questo motivo risulta piccolo e leggero. FreeRTOS implementa più thread in modo che il programma host chiami un metodo tick thread a brevi intervalli regolari. A seconda delle esigenze di un singolo progetto, si può scegliere tra una serie di metodi di allocazione dinamica, oppure consentire solo l’allocazione statica.

Nel caso di di VxWorks, QNX e Linux ci riferiamo invece a sistemi operativi certificati POSIX. In altri casi si tratta invece di sistemi compatibili.

A tal punto risulta chiaro che, esistendo diversi tipi di sistemi operativi RTOS ciascuno di essi si adatti in modo più o meno funzionale ad un diverso progetto. Alcuni sistemi operativi sono in grado di eseguire hard real-time, ma non tutti possono farlo. Questo dipende dallo scheduler, come detto in precedenza, o per essere più chiari dal tipo di design di base.

Quando usare un RTOS?

Ora che abbiamo parlato in termini teorici di questo tipo di sistema operativo cerchiamo di andare più affondo alla questione. Quando usare un RTOS? La risposta, come si potrebbe immaginare, non è universale. Bisogna valutare diversi fattori prima di prendere una simile decisione. Ciascun progetto differisce da un altro e per questo motivo le nostre esigenze potrebbero differire di volta in volta. Il consiglio in ogni caso è quello di trovare un equilibrio tra le prestazioni in tempo reale richieste e il tempo e il budget che si ha a disposizione.

Fattori da considerare:

  • presenza di scadenze rigide per il progetto
  • necessità di una pianificazione specifica del lavoro

Proponiamo di seguito un esempio di RTOS cercando di capire ancor più nello specifico quali siano i suoi compiti:

Aspetti fondamentali kernelFreeRTOS

Poco fa avevamo introddotto il kernelFreeRTOS, ora entriamo più nello specifico. Da questa spiegazione sarà possibile capire quando e perché utilizzare un RTOS.

Caratteristiche:

KernelFreeRTOS propone:

  • Un pianificatore multitasking.
  • Diverse opzioni di allocazione di memoria
  • Operazioni di coordinamento tra task, come notifiche di task, code di messaggi

Esso esegue esclusivamente operazioni deterministiche e ciò dipende dal pianificatore di task FreeRTOS, che consente di assegnare a ciascun task priorità rigorose.

Ogni volta che viene creato un nuovo task è richiesta RAM che può essere allocata dinamicamente oppure staticamente.

Il kernel FreeRTOS include cinque implementazioni heap:

heap_1
Non consente che venga liberata memoria.
heap_2
Consente che venga liberata memoria, ma non unisce i blocchi liberi adiacenti.
heap_3
Racchiude i valori malloc() e free() standard per la sicurezza per i thread.
heap_4
Unisce i blocchi adiacenti per evitare la frammentazione. Include un'opzione di posizionamento dell'indirizzo assoluto.
heap_5
È simile a heap_4. Può distribuire l'heap su più aree di memoria non adiacenti.

Come comunicano i task?

Il coordinamento tra task avviene tramite le code, che rappresentano il principale modus comunicativo tra task. Queste possono essere usate per lo scambio di messaggi ma in altri casi servono anche da buffer FIFO. I messaggi vengono inviati tramite copia e quindi i dati stessi vengono copiati e non semplicemente memorizzati.  Quando un task cerca di leggere una coda vuota, viene visualizzato e inserito uno stato di blocco. In questo modo nessun tempo di CPU verrà sprecato; così verrà fornita la possibilità di eseguire altri task. Lo stesso processo si verifica qualora si provi a scrivere in una coda piena, il task viene inserito in uno stato di blocco fin quando non si libera spazio.

Ora dovreste riuscire a comprendere quando utilizzare un RTOS sia conveniente. Analizzate il vostro progetto e cercate di fornirgli la miglior soluzione possibile.