La natura system-on-chip dei dispositivi microelettronici programmabili ha spostato l'attenzione degli sviluppatori dalle problematiche più strettamente hardware a quelle di natura software, tanto che la componete software dello sviluppo di un sistema embedded è diventata preponderante, dell'ordine del 70-80%, fino a raggiungere il 90% percento dello sforzo di sviluppo. La complessità dei sistemi embedded e delle relative applicazioni è cresciuta enormemente negli ultimi anni sia in conseguenza delle esigenze crescenti dei requisiti applicativi, sia in conseguenza della complessità dei dispositivi hardware che si sono resi disponibili. Inoltre, la maggior parte dei sistemi embedded sono di natura real-time, quindi con requisiti di affidabilità molto stringenti, soprattutto in campi applicativi tradizionali per l'embedding come l'automotive, la comunicazione e l'industriale, e campi applicativi emergenti come il medicale e il consumer. Gli sviluppatori in passato hanno affrontato le problematiche di sistema e di real-time sviluppando del codice custom per garantirsi le prestazioni e l'affidabilità necessaria, ma ora i requisiti applicativi non lasciano spazio a questo approccio, anche perché i tempi per il completamento dello sviluppo (time-to-market) sono ormai troppo brevi. I sistemi operativi real-time (Rtos) sono dunque la naturale soluzione a questa problematica, anche se a loro volta, per lo sviluppatore ne aprono un'altra: quale è il Rtos più adatto, considerando i requisiti stringenti dell'applicazione? I Rtos sono fondamentalmente di natura proprietaria oppure di natura aperta (open source). I produttori di processori cercano di promuovere quelli di natura aperta, in modo da non impattare sui costi di sviluppo. Oltre a quelli promossi dai produttori di processori relativamente ai propri dispositivi, per gli stessi sono disponibili numerosissime soluzioni basate su Rtos aperti, ognuna delle quali risulta vantaggiosa relativamente a specifici aspetti applicativi (occupazione di memoria, supporto delle periferiche, scheduling dei processi hard real-time, ecc.). Parallelamente, i produttori di sistemi operativi offrono Rtos di natura proprietaria che garantiscono allo sviluppatore di soddisfare i loro requisiti applicativi e di avere anche il necessario supporto durante la fase di sviluppo. Adottare Rtos open source può essere una soluzione vantaggiosa dal punto di vista economico e addirittura dell'innovazione nello sviluppo, ma può risultare antieconomico se le problematiche di sviluppo sono complesse e il supporto allo sviluppo e manutenzione del software non sufficientemente deterministico. La soluzione proprietaria è più costosa, ma può risultare vantaggiosa se il supporto allo sviluppo offerto dal produttore di Rtos è valido ed efficiente. Comunque sia la scelta, un'attenta analisi del Rtos, delle sue specifiche funzionali e delle specifiche applicative, devono essere attentamente valutate sotto svariati aspetti, di cui la scalabilità e l'aggiornabilità sono tra i più importanti criteri, oltre quelli più strettamente legati al soddisfacimento dei requisiti funzionali.
Rtos per multicore
Une delle più importanti motivazioni alla scelta di un Rtos è l'evoluzione multicore della maggior parte delle piattaforme di computing. La caratterizzazione multicore, unita a quella system-on-chip, ha reso particolarmente complessi i sistemi di computing embedded, e conseguentemente ha reso una necessità la scelta obbligata il Rtos. Neutrino di QNX è un microkernel effettivo che, grazie alla sua modularità, è scalabile e adattabile alle architetture multicore. La sua tecnologia Bmp (bound multi-processing) elimina il rischio di migrazione consentendo allo sviluppatore di decidere esattamente dove dovrà girare ogni processo e ogni thread. Neutrino è un microkernel effettivo che garantisce l'esecuzione in maniera sicura di ogni driver, delle applicazioni, del protocollo dello stack e del file system. In tal modo ogni componente può fallire e può essere rimesso in esecuzione automaticamente senza influire sugli altri componenti o sul kernel. Questa è una peculiarità di Neutrino che garantisce un elevato livello di controllo dei guasti e il relativo recovery.
Rtos e Application Specific Processors
Una delle connotazioni più importanti dei sistemi embedded è la performance real-time e la specificità del processing, sempre più orientato a gestire processi e informazioni che provengono dal mondo esterno analogico. I Digital Signal Processor e più in generale gli Application Specific Processor, oltre all'emergente tecnologia dei processori multimedia, sono le nuove piattaforme di computing per i sistemi embedded. Queste, oltre ad avere una complessità di sistema interna, evidenziano anche una natura multicore e multi processing che necessita di essere governata opportunamente. OSEck (OSE Compact Kernel) di Enea, la versione ottimizzata per Dsp del Rtos OSE, occupa solo 8 kbyte di memoria, è fully preempitive, event-driven, capace di produrre risposte in tempo reale e capace di rilevare e gestire gli errori. Tutti questi sono requisiti di applicazioni embedded hard real-time tipiche delle applicazioni Dsp e degli application specific processor. OSEck utilizza un modello di programmazione di message passing ad alto livello che semplifica la scomposizione di applicazioni complesse in processi concorrenti semplici, tutti comunicanti attraverso messaggi diretti ad alta velocictà. Tale livello di astrazione semplifica le applicazioni complesse relativamente alla modellizzazione, al partizionamento e al debug. Ciò porta a trattare in maniera trasparente le problematiche applicative rispetto all'hardware e alla topologia sottostante, con in conseguenti vantaggi in termini di scalabilità e di adattabilità.
Un Rtos per sistemi complessi
I sistemi embedded complessi richiedono un determinismo assoluto nella gestione dei processi e dei dispositivi hardware di cui sono costituiti. LynxOS di Lynuxworks è un Rtos per sistemi real-time complessi, capace di garantire un determinismo assoluto (hard real-time). Ciò significa risposta alle richieste dei processi entro un intervallo di tempo noto. La risposta è predicibile e sicura anche se si è in presenza di un processo di input/output intensivo. La predicibilità della risposta è garantita dal modello di threading che utilizza routine di gestione dell'interruzione brevi e veloci. Tra le caratteristiche di LinuxOS, il supporto della memoria fino a 2 Gbyte, il multi processing simmetrico, la toolchain Gnu, l'esecuzione di task complessi in tempi predefiniti, il supporto di applicazioni multiple con dispositivi di interruzione multipli.
Un Rtos personalizzabile
MQX di Freescale è un Rtos configurabile che consente allo sviluppatore di ottenere una versione custom fatta su misura relativamente al suo target. Questo Rtos consente di configurare e bilanciare il codice fino ad ottenere le prestazioni richieste. Grazie alle sue Api di utilizzo immediato, lo sviluppatore è in grado di configurare in brevissimo tempo una istallazione di tale Rtos sul suo target in pochissimo tempo. MQX è strettamente integrato con la piattaforma di computing ColdFire e per questa piattaforma rende disponibile i driver per i device più correntemente utilizzati. L'integrazione con gli strumenti di sviluppo CodeWarrior consentono anche di disporre di funzionalità di profiling e debugging molto efficienti. La densità di codice di MQX è tale da ottenere, una volta configurato, un Rtos particolarmente compatto, consentendo in tal modo di ottenere un sistema embedded efficiente, veloce e di piccole dimensioni. Può essere configurato in modo da occupare appena 12 kbyte di Rom e 2,5 K di Ram su ColdFire V2, incluso il kernel, 2 task applicativi, un semaforo LW, lo stack per le interruzioni, la coda e la gestione della memoria. Le prestazioni real-time (cambio di contesto) sono garantite dal fatto che la risposta alle interruzioni di basso livello è ottimizzata a mano in linguaggio assembly. MQX ha un'architettura basata sui componenti: 25 componenti sono del core e 17 sono opzionali. I componenti vengono integrati solo se necessari, evitando in tal modo la presenza di componenti inutilizzati che occupano la memoria. Le prestazioni real-time sono garantite dall'approccio preemptive basato sulla priorità e il multithreading. Questo consente ai thread ad alta priorità di essere eseguiti entro la scadenza in maniera consistente, indipendentemente da quanti altri threads stiano competendo per la Cpu. Altre caratteristiche, come il fast boot e il sistema semplificato di passaggio dei messaggi rendono questo Rtos particolarmente efficiente su piattaforme di computing potenti e complesse.