Cosa hanno in comune una consolle, un POS, un decoder, un sistema di volo, un cellulare e una lavatrice? Sono tutti dotati di un sistema embedded: ovvero, hanno al loro interno un microprocessore integrato che elabora informazioni, li monitora e ne controlla le funzionalità. I primi esempi di sistemi embedded risalgono agli anni Sessanta, ma solo alla fine degli anni Ottanta si sono diffusi come prodotti di massa. Oggi, lo sviluppo dei sistemi embedded è strettamente legato a quello dell’Internet of Things. Perché?
Cos’è un sistema embedded
“Embedded” in inglese significa “incorporato, incapsulato”. Un sistema embedded è quindi un sistema di elaborazione che, non immediatamente visibile, si integra all’interno dell’oggetto o del sistema informatico in cui è inserito per monitorarne e gestirne alcune funzionalità. Si configura come un microprocessore che, a differenza dei PC, è programmato per svolgere solo particolari compiti di misura e controllo, spesso una sola operazione (special purpose). I sistemi embedded quindi non sono riprogrammabili, se non parzialmente e in casi particolari, e non possono essere separati dal sistema in cui si integrano senza che questo perda funzionalità. Progettati per scopi specifici, la maggior parte dei sistemi embedded non ha un sistema operativo ma un hardware “su misura” e un software, chiamato anche “firmware”, strettamente necessari a eseguirli. Di dimensioni ridotte, i sistemi embedded funzionano senza interazione umana e sono capaci di resistere a eventi dannosi e di ripartire in modo autonomo.
Il “cuore” di un sistema embedded è il microprocessore, che, come in un pc, contiene la CPU – Central Processing Unit, ovvero l’unità centrale di elaborazione e le sue interfacce. La CPU dialoga con: la memoria RAM, ovvero la memoria di sistema, di esecuzione; la memoria ROM, ovvero la memoria di archivio su cui in genere viene programmato il firmware, con o senza sistema operativo. A differenza di un pc, però, un sistema embedded è più “leggero” proprio perché deve assolvere a meno compiti: ha quindi frequenze di CPU inferiori e minori quantità di memorie. La CPU viene collegata alle memorie e agli altri dispositivi di input-output tramite piste in rame dette “bus”, che trasportano gli impulsi elettrici quindi le informazioni. I bus collegano quindi anche con la CPU i dispositivi logici programmabili, i sistemi di alimentazione e raffreddamento, i sensori e gli attuatori che attraverso conversioni analogico-digitale e viceversa (AD-DA) consentono al sistema di scambiare dati con l’esterno.
Le operazioni della CPU sono temporizzate da un apposito clock, un segnale digitale che commuta tra 0 e 1 più volte al secondo: a ogni impulso, viene eseguita una operazione. La misura degli intervalli di tempo per la sincronizzazione viene effettuata da appositi timer. Anche il clock, nei sistemi embedded, è meno “performante” rispetto a un processore “multipurpose”.
A cosa servono i sistemi embedded
I sistemi embedded eseguono operazioni in tempi stabiliti e con costi contenuti. Poche, a ripetizione. Sono sistemi specifici: la maggior parte opera in tempo reale (sistemi real time) con il vincolo di rispettare la deadline di esecuzione (hard real time). Servono quindi a esercitare funzioni di misura e controllo in tempo reale con consumi ridotti e pochi costi di manutenzione. Esempio: in caso di incendio, il sistema embedded chiuderà automaticamente le porte antincendio nel tempo prestabilito, in modo che il fuoco non si propaghi nel resto dell’edificio. Nei pacemaker, controllerà che il dispositivo non si scarichi prima del previsto. Nelle lavatrici, monitorerà i parametri di funzionamento segnalando eventuali anomalie.
I sistemi embedded possono essere categorizzati in tre tipologie: i PLC – Programmable Logic Controller; i microcontrollori; i System-on-Chip.
I PLC, Controllori Logici Programmabili, sono pensati per i sistemi di automazione e in genere programmati su misura per una sola funzione specifica. Servono a monitorare i segnali di ingresso (digitali o analogici), eseguire operazioni logiche e attivare segnali di uscita specifici. Hanno una buona connettività input-output per scambiare dati con i sensori e gli attuatori all’interno degli impianti industriali. Sono costituiti dalla CPU, da un alimentatore e moduli ingresso/uscita (I/O).
I microcontrollori riducono in un micropacchetto (package) le componenti del microprocessore. Vengono usati nelle misurazioni, nella raccolta di dati ambientali, nell’automotive perché hanno diversi pin di ingresso e uscita che consentono un’efficace interazione con l’ambiente. Nei modelli più avanzati, sono dotati di interfacce Wi-Fi, Ethernet, Touchscreen e LCD.
I System-on-Chip hanno, come da definizione, tutto il sistema concentrato in una singola unità: potenzialmente possono racchiudere CPU, GPU, memorie, tutti i dispositivi di connettività e di controllo audio-video, le porte di ingresso e di uscita, i convertitori, i sensori. In realtà, vengono programmati a seconda delle esigenze. E, con diverse modalità di programmazione, sono inseriti negli smartphone, nei GPS, nei lettori multimediali, nella domotica.
Sistemi embedded e Internet of Things
I sistemi embedded, integrati all’interno di oggetti o sistemi informatici più complessi, costituiscono sempre più delle soluzioni IoT: architetture che abilitano dispositivi connessi in rete, tra loro e con le persone, che acquisiscono, elaborano e scambiano informazioni con l’ambiente per eseguire le azioni più opportune in tempo reale.
Non tutti i sistemi embedded sono IoT: è il caso di sistemi progettati per ottenere uno scambio “chiuso”, cioè di dati e informazioni tra dispositivi senza interazione con l’ambiente. Non basta quindi, per un sistema embedded, essere dotato di microcontrollori con sensori e convertitori analogico-digitale e digitale-analogico per essere considerato IoT.
Ad esempio, una tipologia di sistemi embedded molto diffusa è M2M, Machine2Machine: un insieme di tecnologie che supportano la comunicazione cablata e wireless tra dispositivi e macchine, per permettere lo scambio di informazioni locali anche da remoto. In ambito industriale, un tipico sistema M2M è lo SCADA – Supervisory Control and Data Acquisition, con funzioni di monitoraggio e controllo delle apparecchiature negli impianti di produzione. Uno SCADA può essere fruibile da un operatore attraverso dispositivi con sistema embedded dedicati a un determinato microcontrollore.
Ma, come è stato sottolineato, M2M non è necessariamente IoT: infatti, la comunicazione M2M utilizza trasmissioni point-to-point tra dispositivi, con sensori e hardware dedicati che viaggiano su cellulari o sistemi chiusi, mentre IoT opera su reti con protocollo IP per gestire dati raccolti su gateway o cloud. Altrimenti detto, M2M collega i dispositivi in un sistema di rete “chiuso”, IoT in un sistema “aperto”, formato da più sottoinsiemi M2M, l’ambiente fisico e le persone.
Di certo, tutte i sistemi embedded sono abilitanti delle applicazioni IoT, per il monitoraggio in tempo reale, il basso consumo energetico, i bassi costi di manutenzione e l’alta disponibilità sul mercato. Spetta agli sviluppatori individuare le soluzioni più adeguate alle esigenze delle aziende.
Come viene progettato un sistema embedded
I sistemi embedded possono essere ad architettura distribuita o centralizzata, e variano per dimensioni, prestazioni, consumi, costi e tempi di sviluppo, aggiornabilità: in fase di progettazione, è importante eseguire un’analisi di contesto per capire dove verrà inserito il sistema e quali saranno i suoi obiettivi. Generalmente, le fasi iniziali della progettazione sono contemporanee alla stesura delle specifiche: si utilizza quindi spesso un approccio flessibile alla progettazione che consenta di modificarla in corso d’opera senza incidere sul time-to-market, il tempo che intercorre tra l’ideazione e la commercializzazione/consegna del sistema.
Un sistema embedded è special purpose: esegue una o poche azioni ripetutamente, al meglio delle possibilità. Deve avere quindi: una buona efficienza energetica; un software con un costo computazione più basso possibile, che non occupi molto spazio in una memoria ridotta; un hardware che non sia troppo pesante o ingombrante (es: inserito in uno smartphone o in un peacemaker).
Un sistema embedded deve essere affidabile (reliable), ovvero svolgere l’operazione nel dato periodo di tempo: il tasso di fallimento è misurato in FIT (Failure in Time), il tempo durante il quale ci si aspetta che funzioni è chiamato MTTF – Mean Time To Failure o, nel caso di operazioni ripetute, MTBF – Mean Time Between Failures. Il sistema è ritenuto più o meno affidabile a seconda del valore del tasso di fallimento e della percentuale di tempo in cui è funzionante. Questa percentuale, che ne indica la disponibilità (availability), è calcolata dal rapporto tra l’MTTF, l’aspettativa di funzionamento, e la stessa aspettativa sommata al MTTR – Mean Time to Repair, il tempo medio di ripristino quindi di manutenzione. In formule: Availability= MTTF/(MTTF+MTTR).
L’affidabilità è strettamente legata alla reattività, alla capacità di reazione a stimoli provenienti dall’ambiente a seconda delle esigenze, il sistema embedded sarà hard real-time o soft real-time: nel primo caso, l’operazione deve essere conclusa assolutamente nei tempi stabiliti, nel secondo c’è una finestra di “tolleranza” che non pregiudica il funzionamento del sistema o provoca danni a persone o ambiente circostante.
Infatti, un sistema embedded deve essere sicuro, nel doppio senso di safety (protezione da rischi e incidenti fortuiti) and security (protezione da minacce e attacchi deliberati): non deve arrecare danni a utenti e ambiente, deve garantire integrità delle informazioni e fornirne l’accesso solo alle persone autorizzate al trattamento.
Software per sistemi embedded ed esempi
I software per sistemi embedded hanno un costo di computazione più basso e non occupano molto spazio in memoria. Un sistema embedded può avere o meno un sistema operativo: un SO richiede più risorse computazionali e vincoli da rispettare ma d’altra parte supporta la gestione in tempo reale, le memorie di massa e i protocolli di comunicazione oltre a consentire un tempo di sviluppo minore. Tra i sistemi operativi più comuni, il Real-Time Operating System (RTOS), che gestisce le risorse hardware, ospita le applicazioni ed elabora i dati in tempo reale, definendo l’elaborazione, la scansione temporale e la programmazione dei compiti.
Di seguito, qualche esempio di sistema embedded tra i più famosi.
Arduino
Arduino nasce dal progetto Wiring, un ambiente di sviluppo software e hardware semplice, completo ed economico realizzato nei primi anni Duemila all’interno dell’Interaction Design Institute di Ivrea. Vent’anni fa, le piattaforme embedded non erano a basso costo né disponibili per “neofiti” o per produzioni a tiratura limitata. Oggi Arduino è una piattaforma elettronica open-source basata su hardware e software di facile utilizzo con diverse schede (board), vari linguaggi di programmazione, un sistema operativo come OpenWrt e una community mondiale di sviluppatori e appassionati. Ha un’architettura KISS (Keep It Simple, Stupid!) sia come hardware (il primo processore della serie aveva 8 bit, poche memorie, senza sistema operativo) che come software. Infatti, il linguaggio di programmazione, dalla sintassi molto simile a C e Java, è semplificato: i costrutti più complicati vengono “mascherati” dall’interfaccia utente, a meno che esplicitamente non si voglia usarli. Inoltre funziona su sistemi operativi Windows, Macintosh, OSX e Linux.
Una scheda Arduino è composta da un microcontrollore, un pulsante di reset, un led “Power on” che indica l’accensione, una porta USB, un jack per l’alimentazione e diversi PIN di I/O. La collocazione dei PIN di I/O analogici e digitali sulla scheda è diventata uno standard nel settore. Una scheda Arduino “legge” gli ingressi come la luce su un sensore e li trasforma in un’azione come l’accensione di un motore. Basta programmare il microcontrollore sulla scheda con il linguaggio di programmazione Arduino e il software Arduino, basato su Processing.
Arduino ha un ambiente di sviluppo (IDE- Integrated Development Environment) dal codice sorgente in licenza GPL per software libero. Questo abbassa notevolmente la soglia economica di accesso al prodotto (la versione meno costosa del modulo può essere assemblata a mano) e favorisce un altissimo livello di community, persone che hanno sviluppato negli anni migliaia di librerie disponibili da scaricare, ad esempio per fare interagire la scheda con una periferica come un sensore o un attuatore. D’altro canto, aver lasciato sia l’hardware che il software con licenza libera ha dato luogo a produzioni dai prezzi stracciati che non sempre mantengono gli standard di qualità.
Linux Embedded
Linux Embedded è un dispositivo basato su un microcontrollore di fascia alta che esegue un sistema operativo basato su kernel Linux, dal codice sorgente completamente gratuito. Tra le tipologie più diffuse, i processori a 32 bit con architettura ARM. Ha i vantaggi del software open source e ha a disposizione un layer di gestione hardware molto evoluto. La presenza di un sistema operativo, come visto in precedenza, ha dei vantaggi ma anche svantaggi nella programmazione di un sistema Hard Real Time: “alleggerire” il sistema operativo, dividendo il kernel in moduli componibili in base alle esigenze è una delle sfide in fase di progettazione ma può non bastare per un sistema Hard Real Time. Una delle soluzioni può essere inserire un secondo kernel tra l’originale e la macchina, una “patch” di tipo Hard Real Time.
Tra i vantaggi di Linux Embedded, tutti gli strumenti di sviluppo dal mondo PC disponibili in open-source, testati, migliorati e adattabili. Linux Embedded viene applicato nella videosorveglianza industriale, ovvero nei circuiti di telecamere controllabili da remoto, o nei sistemi di infotainment e di guida autonoma automobilistica.
Android
Android è un sistema embedded. Infatti, Android Inc, fondata nel 2003 come società di progettazione software per dispositivi mobili e acquistata nel 2005 da Google, ha cominciato da allora a sviluppare un sistema operativo basato su kernel Linux. Il sistema operativo è stato lanciato nel 2007 con un Software Development Kit che comprendeva strumenti di sviluppo, librerie e documentazione, mentre nel 2008 è stato commercializzato il primo dispositivo con Android, oggi uno dei sistemi operativi per smartphone più usati al mondo.
Android è una versione (stack) di software open source, rilasciato sotto licenza di software libero Apache, che obbliga al diritto di autore ed esclude responsabilità nelle versioni modificate. Android include: il sistema operativo Kernel Linux modulare, diverse librerie in linguaggio C/C++ ma accessibili in Java e un insieme di applicazioni. Tra queste, la sostituzione dei componenti, il browser integrato, la grafica ottimizzata, il motore per le strutture dei dati, il supporto multimediale per i formati audio-video fino al GPS, la fotocamera, la bussola e le diverse modalità di connettività: Bluetooth, 3G, LTE, NFC, Wi-Fi. Lo stack di Android include la Dalvik virtual machine, creata appositamente: al lancio di ogni applicazione viene associata un’istanza, così da gestire più applicazioni contemporaneamente.