La programmation de systèmes embarqués (dans laquelle je travaille depuis plus de 30 ans) nécessite un état d'esprit très différent de la plupart des autres types de développement logiciel. La plage de puissance de calcul varie considérablement, des microcontrôleurs 8 bits qui coûtent 30 cents en quantité aux microprocesseurs 32 bits exécutant Linux ou un autre système d'exploitation courant. Je fais actuellement des projets aux deux extrémités de cette échelle. La mémoire de code sur les plus petits micros peut n'être que de quelques Ko, avec seulement quelques centaines d'octets de RAM. Un micro 16 bits de milieu de gamme coûtant 3 $ en quantité peut avoir 256 Ko de stockage de programme et 16 Ko de RAM.
Outre les ressources mémoire limitées, l'un des aspects de la programmation intégrée qui est différent des autres domaines du développement logiciel est que le programmeur traite souvent directement avec le matériel au niveau du registre - soit sur le micro lui-même, soit dans un périphérique connecté à le micro via des bus série comme UART, SPI ou I2C. Pour cette raison, les micros intégrés bas de gamme sont généralement programmés en C ou en langage assembleur.
Les systèmes embarqués sont souvent confrontés à des événements en temps réel, donc un programme de firmware embarqué a généralement de nombreuses routines d'interruption et éventuellement un petit RTOS (OS en temps réel). Le débogage de tels systèmes nécessite souvent une assistance matérielle à l'aide de quelques lignes dédiées dans le micro afin que les points d'arrêt puissent être définis à distance depuis un PC. Les analyseurs logiques, les analyseurs de bus et les oscilloscopes sont des outils supplémentaires utilisés pour le débogage de ces systèmes.
En raison des aspects matériels du développement embarqué, les développeurs ont souvent des connaissances en électronique. (J'ai des diplômes en EE et en CS).