La programación de sistemas integrados (en los que he estado involucrado durante más de 30 años) requiere una mentalidad bastante diferente a la de cualquier otro tipo de desarrollo de software. El rango de potencia de cómputo varía ampliamente, desde microcontroladores de 8 bits que cuestan 30 centavos en cantidad hasta microprocesadores de 32 bits que ejecutan Linux u otro sistema operativo común. Actualmente estoy haciendo proyectos en ambos extremos de esta escala. La memoria de código en los micros más pequeños solo puede ser de unos pocos KB, con solo unos pocos cientos de bytes de RAM. Un micro de 16 bits de rango medio que cuesta $ 3 en cantidad podría tener 256 KB de almacenamiento de programas y 16 KB de RAM.
Además de los recursos de memoria limitados, uno de los aspectos de la programación incorporada que es diferente a otras áreas de desarrollo de software es que el programador a menudo trata directamente con el hardware a nivel de registro, ya sea en el micro o en un periférico conectado a el micro a través de buses seriales como UART, SPI o I2C. Por esta razón, los micros integrados de gama baja generalmente se programan en lenguaje C o ensamblador.
Los sistemas integrados a menudo se enfrentan a eventos en tiempo real, por lo que un programa de firmware incorporado generalmente tiene muchas rutinas de interrupción y posiblemente un pequeño RTOS (SO en tiempo real). La depuración de tales sistemas a menudo requiere asistencia de hardware utilizando un par de líneas dedicadas en el micro para que los puntos de interrupción se puedan establecer de forma remota desde una PC. Los analizadores lógicos, analizadores de bus y osciloscopios son herramientas adicionales utilizadas para depurar estos sistemas.
Debido a los aspectos de hardware del desarrollo integrado, los desarrolladores a menudo tienen algo de experiencia en electrónica. (Tengo títulos en EE y CS).