Sistemi operativi
I sistemi embedded spesso non hanno bisogno di un sistema operativo completo. Alcuni usano sistemi operativi piccoli e semplici costruiti appositamente che si avviano molto rapidamente, altri non ne hanno affatto bisogno. I sistemi embedded non si adattano così facilmente, ma sono costruiti per svolgere i loro compiti in modo molto più affidabile. Poiché l'hardware è più semplice, spesso è anche più economico costruire e funzionare più velocemente.
Al contrario, un computer per uso generale deve essere pronto per l'uso di nuovi driver di dispositivi e software per l'esecuzione di hardware di cui non è ancora a conoscenza, come nuove stampanti o dischi rigidi. Ha bisogno di eseguire diversi programmi applicativi.
Man mano che i sistemi embedded diventano sempre più grandi, cose che prima erano solo su computer generici o anche sui mainframe stanno diventando comuni sui sistemi embedded. Questo include lo spazio di memoria protetto, e un ambiente di programmazione aperto che include Linux, NetBSD, ecc.
Alcuni esempi di sistemi operativi, da semplici a complessi:
- Semplice loop di controllo - Un timer e un loop vengono utilizzati per chiamare ripetutamente diverse subroutine. Questo viene spesso effettuato da una sola persona per i sistemi più piccoli.
- Controllo delle interruzioni - Le attività sono avviate da diversi tipi di eventi. L'evento potrebbe essere qualcosa di temporizzato (ogni dieci secondi, per esempio) o dalla pressione di un pulsante o dai dati ricevuti.
- multitasking non preventivo - Ogni attività ha il suo turno di esecuzione, e quando finisce chiama un pianificatore nel sistema operativo per eseguire l'attività successiva.
- multitasking preventivo o multi-threading - Un'attività può essere interrotta dopo un certo periodo di tempo per lasciarne eseguire un'altra per un po' di tempo. Nessun compito può monopolizzare il sistema. A questo livello il sistema è considerato avere un kernel "sistema operativo" e può eseguire task in parallelo. Questo tipo di sistema operativo viene solitamente acquistato da una società che lavora solo su sistemi operativi embedded.
I sistemi operativi in tempo reale includono prodotti come MicroC/OS-II, Green Hills INTEGRITY, QNX o VxWorks. A differenza di MacOS o Windows 7, questi sistemi operativi non sono conosciuti molto bene dalla maggior parte delle persone. Ma sono utilizzati in molti luoghi dove il tempo e la sicurezza sono molto importanti. Le persone li usano ogni giorno e non se ne rendono conto.
Esempi comuni di kernel più grandi sono Embedded Linux e Windows CE. Anche se questi non hanno i limiti di tempo stretti necessari per un rigoroso sistema in tempo reale, stanno diventando sempre più comuni, soprattutto per i dispositivi più potenti come i router wireless e i GPS. Essi consentono il riutilizzo del codice nel dominio pubblico per i Driver dei dispositivi, i Web Server, i Firewall e altro codice. Gli sviluppatori di software che sono più a loro agio a scrivere applicazioni per PC troveranno più familiare anche questo. Se necessario, un FPGA o altro hardware speciale può essere usato per le cose che necessitano di limiti di tempo ristretti.
Strumenti
Come altri software, i progettisti di sistemi embedded utilizzano compilatori, assemblatori e debugger per sviluppare software di sistema embedded. Tuttavia, essi possono anche utilizzare alcuni strumenti più specifici:
- Per i sistemi che utilizzano l'elaborazione digitale dei segnali, gli sviluppatori possono utilizzare strumenti matematici come MATLAB, MathCad o Mathematica.
- I compilatori e i linker personalizzati possono essere utilizzati per migliorare l'ottimizzazione per il particolare hardware.
- Un sistema embedded può avere un proprio linguaggio speciale o uno strumento di progettazione, o aggiungere miglioramenti a un linguaggio esistente come quello utilizzato da Basic Stamp.
Strumenti di debug:
- Un debugger in-circuit (ICD), un dispositivo hardware che si collega al microprocessore tramite un'interfaccia JTAG. Questo avvia e ferma il microprocessore dall'esterno mentre esegue il software. Permette anche di leggere la memoria e i registri e di memorizzare il programma software in memoria.
- Debug esterno utilizzando il logging o l'uscita della porta seriale per tracciare il funzionamento utilizzando un monitor lampeggiante (printfs).
- Debug interattivo residente - se il sistema operativo lo supporta, si tratta di una shell sul processore embedded che esegue comandi digitati dallo sviluppatore (Linux, per esempio).
- Un emulatore in-circuit sostituisce il microprocessore sulla scheda, fornendo il pieno controllo su tutto ciò che il microprocessore può fare.
- Un emulatore completo simula tutte le caratteristiche dell'hardware, permettendo di controllarlo e modificarlo. L'hardware in realtà non esiste, ma una sua versione fittizia (una macchina "virtuale") si trova su un normale PC.
- Controllo delle linee esterne con un analizzatore logico o multimetro.
A meno che non sia limitato al debug esterno, il programmatore può tipicamente caricare ed eseguire il software attraverso gli strumenti, visualizzare il codice in esecuzione nel processore e avviare o arrestare il suo funzionamento. La visualizzazione del codice può essere come codice assembly o codice sorgente. Alcuni sistemi integrati (come VxWorks o Green Hills) hanno caratteristiche speciali, come la possibilità di tenere traccia di quanto spazio occupa il software mentre viene eseguito, di quali attività sono in esecuzione e quando le cose accadono.
A seconda del tipo di sistema embedded che si sta realizzando, influirà sul modo in cui può essere debuggato. Per esempio, il debug di un singolo sistema a microprocessore è diverso dal debug di un sistema in cui l'elaborazione viene effettuata anche su una periferica (DSP, FPGA, co-processore).