A programação de sistemas embarcados (na qual trabalho há mais de 30 anos) requer uma mentalidade bastante diferente da maioria dos outros tipos de desenvolvimento de software. O alcance da capacidade de computação varia muito, de microcontroladores de 8 bits que custam 30 centavos em quantidade a microprocessadores de 32 bits executando Linux ou algum outro sistema operacional comum. Atualmente, estou fazendo projetos nos dois extremos desta escala. A memória de código nos micros menores pode ter apenas alguns KB, com apenas algumas centenas de bytes de RAM. Um micro de 16 bits de gama média e custando US $ 3 em quantidade pode ter 256 KB de armazenamento de programa e 16 KB de RAM.
Além dos recursos limitados de memória, um dos aspectos da programação incorporada que é diferente de outras áreas do desenvolvimento de software é que o programador geralmente lida diretamente com o hardware no nível do registro - seja no próprio micro ou em um periférico conectado a ele. o micro via barramentos seriais como UART, SPI ou I2C. Por esse motivo, os micros embarcados low-end geralmente são programados em linguagem C ou assembly.
Os sistemas embarcados costumam lidar com eventos em tempo real; portanto, um programa de firmware incorporado geralmente possui muitas rotinas de interrupção e, possivelmente, um pequeno RTOS (SO em tempo real). A depuração desses sistemas geralmente requer assistência de hardware usando duas linhas dedicadas no micro, para que os pontos de interrupção possam ser definidos remotamente a partir de um PC. Analisadores lógicos, analisadores de barramento e osciloscópios são ferramentas adicionais usadas para depurar esses sistemas.
Devido aos aspectos de hardware do desenvolvimento incorporado, os desenvolvedores geralmente têm algum conhecimento em eletrônica. (Eu tenho diplomas em EE e CS).