Die Programmierung eingebetteter Systeme (mit der ich mich seit über 30 Jahren beschäftige) erfordert eine ganz andere Denkweise als die meisten anderen Arten der Softwareentwicklung. Der Bereich der Rechenleistung variiert stark, von 8-Bit-Mikrocontrollern, deren Menge 30 Cent kostet, bis zu 32-Bit-Mikroprozessoren, auf denen Linux oder ein anderes gängiges Betriebssystem ausgeführt wird. Ich mache derzeit Projekte an beiden Enden dieser Skala. Der Codespeicher auf den kleinsten Mikros beträgt möglicherweise nur wenige KB mit nur wenigen hundert Byte RAM. Ein 16-Bit-Mikro im mittleren Bereich, dessen Menge 3 US-Dollar kostet, verfügt möglicherweise über 256 KB Programmspeicher und 16 KB RAM.
Neben den begrenzten Speicherressourcen besteht einer der Aspekte der eingebetteten Programmierung im Gegensatz zu anderen Bereichen der Softwareentwicklung darin, dass der Programmierer häufig direkt mit der Hardware auf Registerebene umgeht - entweder auf dem Mikro selbst oder in einem angeschlossenen Peripheriegerät das Mikro über serielle Busse wie UART, SPI oder I2C. Aus diesem Grund werden eingebettete Low-End-Mikros normalerweise in C oder Assemblersprache programmiert.
Eingebettete Systeme haben häufig mit Echtzeitereignissen zu tun, daher verfügt ein eingebettetes Firmware-Programm normalerweise über viele Interrupt-Routinen und möglicherweise ein kleines RTOS (Echtzeit-Betriebssystem). Das Debuggen solcher Systeme erfordert häufig Hardware-Unterstützung mithilfe einiger dedizierter Leitungen im Mikro, sodass Haltepunkte von einem PC aus remote festgelegt werden können. Logikanalysatoren, Busanalysatoren und Oszilloskope sind zusätzliche Werkzeuge zum Debuggen dieser Systeme.
Aufgrund der Hardwareaspekte der Embedded-Entwicklung verfügen Entwickler häufig über einen elektronischen Hintergrund. (Ich habe Abschlüsse in EE und CS).