La programmazione di sistemi embedded (che ho seguito per oltre 30 anni) richiede una mentalità abbastanza diversa dalla maggior parte degli altri tipi di sviluppo di software. La gamma di potenza di calcolo varia ampiamente, dai microcontrollori a 8 bit che costano 30 centesimi in quantità ai microprocessori a 32 bit che eseguono Linux o altri sistemi operativi comuni. Attualmente sto facendo progetti a entrambe le estremità di questa scala. La memoria di codice sul micros più piccolo può essere solo pochi KB, con solo poche centinaia di byte di RAM. Un micro di fascia media a 16 bit che costa $ 3 in quantità potrebbe avere 256 KB di memoria di programma e 16 KB di RAM.
Oltre alle risorse di memoria limitate, uno degli aspetti della programmazione embedded che è diverso da altre aree dello sviluppo del software è che il programmatore spesso gestisce direttamente l'hardware a livello di registro, sia sul micro stesso che in un periferica collegata al micro tramite bus seriali come UART, SPI o I2C. Per questo motivo, i microprogrammi embedded di fascia bassa sono solitamente programmati in linguaggio C o assembly.
I sistemi embedded si occupano spesso di eventi in tempo reale, quindi un programma firmware incorporato di solito ha molte routine di interrupt e un piccolo RTOS (sistema operativo in tempo reale). Il debug di tali sistemi richiede spesso l'assistenza hardware utilizzando un paio di linee dedicate nel micro, in modo che i punti di interruzione possano essere impostati da remoto da un PC. Analizzatori logici, analizzatori bus e oscilloscopi sono strumenti aggiuntivi utilizzati per il debug di questi sistemi.
A causa degli aspetti hardware dello sviluppo integrato, gli sviluppatori hanno spesso un background di elettronica. (Ho dei gradi sia in EE che in CS).