Я бы сказал, что изучение встраиваемых систем — это бесконечный процесс. Как только вы войдете в эту область, обучение должно быть непрерывным, иначе вы не сможете выжить. Это также сильно отличается от обычной области программирования, в которой вы считаете само собой разумеющимся требования к памяти и вычислительным ресурсам. Добро пожаловать в мир, где 128 КБ ОЗУ по-прежнему считаются «ОГРОМНЫМИ».

Откровенно говоря, от хорошего инженера по встраиваемым системам ожидается, что он будет знать много низкоуровневых подробностей о программировании, а также базовое оборудование и архитектуру процессора. Информация, представленная здесь, более актуальна для людей, которые больше интересуются разработкой встроенного ПО, но применима и к большинству других направлений встраиваемых систем.

Вот 5 простых шагов, чтобы подняться:

  1. Изучите программирование на C:

«Хорошо, я немного знаю C. Я делал на нем программы hello world, использовал циклы, ряды Фибоначчи и много чего еще. Этого достаточно?

Подход к изучению языка Си должен отличаться от того, чему нас учили на базовом уроке программирования. Помимо точки зрения приложения, вы должны уделять больше внимания низкоуровневым деталям, таким как процесс компиляции, карта памяти и т. д.

Вам нужно задать несколько вопросов:
«Что происходит, когда я компилирую свою программу?», «Что происходит с объявленными мной переменными?», «Как связаны между собой мои функции?», «Как глобальные переменные сохраняются?» и т.д.
Используйте vi/vim или emacs в качестве редактора и набора инструментов GCC для программирования на C. Научитесь отлаживать код и исполняемый файл с помощью отладчика GDB.

Предлагаемые книги: Язык программирования C (Брайан В. Керниган и Деннис М. Ричи), C in Depth С. К. Шриваставы, Programming Embedded Systems: With C and GNU Development Tools, 2-е издание Майкла Барра, Практическое программирование на C Стива Куаллайна.

Note: All these books follow different standards of C language.
Do not confuse and always refer to the standard reference manual of 
C language if in any doubt.

2. Изучите основы аналоговой и цифровой электроники
Без базовых знаний вышеперечисленного вы не можете даже думать о запуске проекта. Хорошо разбирайтесь в них, поскольку они помогут вам понять взаимодействие аппаратного обеспечения с процессором или контроллером. Вкратце следующие термины не должны быть для вас жаргоном:
(Система счисления (двоичная, шестнадцатеричная), цифровая логика, ТТЛ, логика КМОП, полупроводниковая память, подтягивающие и подтягивающие резисторы, двухтактная конфигурация, часы и счетчики, нарастающий фронт, спадающий фронт, запуск по уровню, цифровая логика с запуском по фронту,
базовая конструкция источника питания, характеристики линий передачи и т. д.)
Вы можете либо просмотреть учебные пособия в Интернете, либо приобрести базовая книга по электронике для него.

3. Узнайте о микроконтроллере
Выберите микроконтроллер по вашему выбору и изучите особенности его программирования и архитектуры. Я бы порекомендовал вам начать с микроконтроллеров серии AVR, а затем перейти к Cortex-M, как только вы освоитесь с AVR. AVR, я бы посоветовал прочитать книгу «Микроконтроллер AVR и встроенные системы с использованием сборки MAMazidi»
После того, как вы закончите с вышеизложенным, перейдите к серии Cortex-M3. Я рекомендую вам выбрать LPC1769 LPCXpresso Board от Embedded Artists. Он поддерживает arm-GCC, имеет встроенный отладчик для легкой отладки. «Полное руководство по ARM Cortex-M3 и Cortex-M4, третье издание, написанное Джозефом Ю», безусловно, лучшая книга по микроконтроллерам серии Cortex, которую я когда-либо читал.
Установите хорошую IDE и инструментальную цепочку, которые поддерживаются вашим микроконтроллер. Я бы порекомендовал вам выбрать LPCXpresso от NXP на базе Keil или Eclipse.
Ознакомьтесь с техническими описаниями микроконтроллера и платы, которые вы приобрели, и начните проводить небольшие эксперименты и освойте низкоуровневое программирование. Узнайте о таймерах, прерываниях, периферийных устройствах, протоколах и т. д. Узнайте о методах отладки (поверьте мне, вы будете в основном проверять и отлаживать программное обеспечение, которое вы или кто-то другой написал в отрасли).

4. Мини-проект
Используя полученные выше знания, создайте небольшой проект, охватывающий различные темы, затронутые вами в предыдущих экспериментах. Постарайтесь закрепить все, что вы узнали в предыдущих пунктах. Попробуйте использовать как минимум 2 протокола (USART, SPI, I2C и т. д.) и создайте что-то близкое к реальной системе. Старайтесь использовать как минимум 2 сенсора.
После этого проекта вы хорошо познакомитесь с прошивкой и кодированием на «голом железе». Это то, что в основном требуется для начала проектирования встроенных систем.
Когда вы закончите с этим, вы поймете, что как только вы начнете увеличивать сложность программы и дизайна встроенной системы, обычные методы программирования неэффективны.

5. Начните изучать концепции операционной системы
Изучение сложных микропрограмм и встроенного программного обеспечения было бы неполным без надлежащего использования методов операционной системы. Начните изучать Linux в качестве основы, а затем начните изучать программирование на уровне системы Linux. После того, как вы закончите с программированием на уровне приложений, начните изучать разработку ядра Linux. Освоившись с основами разработки ядра, переходите к изучению драйверов устройств.
Я рекомендую следующие книги:
«Концепции операционной системы». Авраам Зильбершатц, Питер Бэр Галвин и Грег Ганье».
«Разработка ядра Linux, 3-е издание, Роберт Лав»
«Драйверы устройств Linux, 3-е издание»

Итак, для начала это все, в следующий раз я подробно остановлюсь на вышеупомянутых моментах. А пока берегите себя 🙂.