Программирование встраиваемых систем (которым я занимаюсь более 30 лет) требует совершенно иного мышления, чем большинство других разработок программного обеспечения. Диапазон вычислительной мощности варьируется в широких пределах: от 8-разрядных микроконтроллеров, стоимость которых составляет 30 центов, до 32-разрядных микропроцессоров под управлением Linux или некоторых других распространенных ОС. В настоящее время я делаю проекты на обоих концах этого масштаба. Объем памяти кода на самых маленьких микросхемах может составлять всего несколько КБ, а объем оперативной памяти - всего несколько сотен байт. Среднесрочный 16-разрядный микропроцессор стоимостью 3 доллара может иметь 256 КБ памяти для хранения программ и 16 КБ ОЗУ.
Помимо ограниченных ресурсов памяти, одним из аспектов встроенного программирования, который отличается от других областей разработки программного обеспечения, является то, что программист часто имеет дело непосредственно с аппаратным обеспечением на уровне регистров - либо с самим микро, либо с периферийным устройством, подключенным к микро через последовательные шины, такие как UART, SPI или I2C. По этой причине встроенные микросхемы младшего класса обычно программируются на языке Си или ассемблере.
Встроенные системы часто имеют дело с событиями в реальном времени, поэтому встроенная программа встроенного программного обеспечения обычно имеет много подпрограмм прерывания и, возможно, небольшую ОСРВ (ОС реального времени). Для отладки таких систем часто требуется аппаратная помощь с использованием пары выделенных линий в микро, поэтому точки останова могут быть установлены удаленно с ПК. Логические анализаторы, шинные анализаторы и осциллографы являются дополнительными инструментами, используемыми для отладки этих систем.
Из-за аппаратных аспектов разработки встраиваемых систем разработчики часто имеют некоторый опыт работы с электроникой. (У меня есть степени в EE и CS).