Programowanie systemów wbudowanych (w które jestem zaangażowany od ponad 30 lat) wymaga zupełnie innego sposobu myślenia niż większość innych programów. Zakres mocy obliczeniowej jest bardzo zróżnicowany, od 8-bitowych mikrokontrolerów, które kosztują 30 centów w ilości, do 32-bitowych mikroprocesorów z systemem Linux lub innym popularnym systemem operacyjnym. Obecnie realizuję projekty na obu końcach tej skali. Pamięć kodu na najmniejszych mikrach może wynosić tylko kilka KB, a pamięć RAM ma tylko kilkaset bajtów. 16-bitowa mikroprocesor średniego zasięgu, kosztujący 3 USD w ilości, może mieć 256 KB pamięci do przechowywania programów i 16 KB pamięci RAM.
Oprócz ograniczonych zasobów pamięci, jednym z aspektów programowania wbudowanego, który jest inny niż w innych obszarach rozwoju oprogramowania, jest to, że programista często ma do czynienia bezpośrednio ze sprzętem na poziomie rejestru - albo na samym mikroprocesorze, albo na urządzeniu peryferyjnym podłączonym do mikro poprzez magistrale szeregowe, takie jak UART, SPI lub I2C. Z tego powodu wbudowane mikroskopy niskiej jakości są zwykle programowane w języku C lub asemblerze.
Systemy osadzone często radzą sobie ze zdarzeniami w czasie rzeczywistym, więc wbudowany program układowy zwykle ma wiele procedur przerwań i może mieć mały RTOS (system operacyjny w czasie rzeczywistym). Debugowanie takich systemów często wymaga pomocy sprzętowej przy użyciu kilku dedykowanych linii do mikro, dzięki czemu punkty przerwania można ustawić zdalnie z komputera. Analizatory logiczne, analizatory magistrali i oscyloskopy to dodatkowe narzędzia używane do debugowania tych systemów.
Ze względu na sprzętowe aspekty programowania wbudowanego, programiści często mają doświadczenie w dziedzinie elektroniki. (Mam stopnie w EE i CS).