Вы в самом деле хотите стать программистом микроконтроллеров?
В этом тексте я напишу о буднях программиста МК в РФ.
Что вообще пишут программисты МК и на чем?
Основной язык программирования это С. Языку С уже более 50лет. Кроме микроконтроллеров С уже практические никому не нужен. Навыки программирования на С очень слабо конвертируются. В свое время, видимо на С написали компилятор для С++ и нужда в С для desktop как таковая отпала. A сам С остался для сборки артефактов для микроконтроллеров с экстремально малыми ресурсами. Хотя и сейчас большинство компаний в ЕС уже микроконтроллерные сборки собирают на С++ 17.
Иногда программистам MК приходится обсчитывать аналоговые цепи и вычислять какие-то сложные 8-этажные формулы и строить графики. Для этого практикуют бесплатный интерпретатор Python.
Главным образом программисты МК составляют Board Support Package, пишут драйверы для новых умных периферийных чипов, пишут загрузчики, портируют RTOS (ы) на разные процессорные ядра, пишут код-генераторы, скрипты сборки, составляют модульные тесты, изредка производят рефакторинг, часто чинят ошибки в Legacy коде, изредка что-то изменяют в коде Assembler (а), который запускается до вызова функции main ().
Иногда программист МК даже ничего не пишет сам вообще. Важно уже не сколько уметь программировать сколько уметь тестировать и собирать, улучшать из готового кода из интернета. Какие-то исходники можно взять из github или ядра Linux. Там есть код на многие темы. Драйверы для множества чипов. Важно уметь верифицировать найденные сорцы и аккуратно подключить их к нужной сборке.
Где работать?
В России программисты МК в основном работают в компаниях, которые делают госзаказ на военную технику. Основной источник работы — госзаказы и ОКРЫ.
Традиций в этой профессии в РФ исторически не сложилось. Разработка всюду похоже на анархию. Зачастую вам придется работать даже без технического задания. Задачи могут поставить так: «подружить микроконтроллер и айфон», «оживить плату», «подружить платы». Понимай как хочешь. Нет доверенной покрытой тестами кодовой базы на всю страну. То есть нет тех кирпичей из которых можно было бы гарантированно собирать программное здание. Нет никакой общей культуры разработки системного ПО.
Любое электронное устройство, которое вы будете делать скорее всего можно будет назвать одним словом: переходник. Типичное IoT устройство это с одной стороны, например, датчик температуры на шине I2C c другой стороны WiFi модуль. Телематика это тоже переходник: с CAN на LTE и т д. Всё что я делал в русской электронике 10лет подряд это переходники с одного интерфейса на другой интерфейс. Маршрутизаторы, модемы, телематика, СКУД (ы), аудиосистемы. Переходники. Переходники. Переходники.
Есть некоторая специфика программирования МК в РФ. Свою оригинальную электронику в России делать отказались еще в конце 60х. Был принят гос план копировать западные IBM (ы). В результате Россия стала полным акцептором IT технологий. Сегодня у России нет своего дешевого процессорного RISC/MIPS/PowerPC ядра, нет своего компилятора для известных ядер ARM, PowerPC, RISC -V. У РФ нет даже своего текстового редактора. Благо есть открытый софт (Linux и GCC), которым и пользуются российские компании. Страна полностью зависит от импорта микропроцессоров и ToolChain (а) для микропроцессоров. Микроконтроллеры активно покупают в Италии, Франции, США, Китае, Нидерландах, Канаде, Швейцарии. Toolchain покупают у Швеции (IAR), Германии (Keil), США (GHS).
В РФ передовые электронные разработки часть просто не доживают до серийного производства из-за эмбарго.
Россия страна санкционная. В российской организации могут решится начать разработку, которую можно реализовать только на одном единственном импортном чипе из Евросоюза. А вендор этого чипа наложит эмбарго не будет присылать вам полный datasheet и сами чипы так как РФ по его мнению является санкционной территорией. И в результате вы как программист микроконтроллеров ничего не можете сделать. Такая история у меня лично была уже 2жды.
В США ситуация полностью наоборот. Там не то, что есть полный цикл IT продуктов. Там еще есть каждый IT продукт в нескольких экземплярах, т.е. от нескольких вендоров. Микропроцессоры AMD/Intel, TI, Microchip. Софт операционных систем от MAC/Windows. Компиляторы TI, GHS. Текстовые редакторы от MS.
Работа программиста MK происходит как правило в гаражных или около гаражных условиях. Провода. Высокое напряжение. Много какого-то металлолома возле компьютеров. Хлам на столах с горочкой. Вероятно будешь работать по соседству с шумным охладительным оборудованием как как электронные платы надо подвергать климатическим испытаниям.
Начальство программистов микроконтроллеров в 3 случаях из 5ти в российских компаниях это в прошлом схемотехники. О программировании они знать ничего не хотят. Учится у них программированию не выйдет.
Российские компании не хотят ничего выдумывать. Предпочитают копировать то что уже есть на западе. Едва ли в РФ получится участвовать в какой-л уникальной прорывной разработке на микроконтроллерах. По настоящему грандиозных проектов в РФ скорее всего просто не удастся сделать из-за эмбарго. Проекты гаджетов с Kickstarter (а) или Crowd Supply вызывают больше восхищения чем то, что пытаются делать электронные компании в РФ со своими громадным громадным опытом.
В программировании микроконтроллеров большинство русских фирм даже не заботятся о коде как таковом вообще. Для их процессов кода как будто бы не существует. О коде не говорят. Код не изучают, не анализируют. Интерес представляет только физический прибор. Можно хранить исходники в открытом доступе и это никого не волнует. Исходники никого кроме разработчика не интересуют. В одной компании я видел как программист МК называл С функции именами литературных персонажей и это никого не волновало так как кроме него с кодом никто не работает. И как правило один человек делает софт для одного чипа. Его сорцы никто не контролирует и его код не инспектируют не тестируют не пере используют. Большинство разработчиков даже юнит тестов не делают. В результате во всех проектах может быть дичайший хаос и этого даже никто не заметит.
Второстепенная работа
Работа программирования МК тесно связана с электронными платами. Если вы программист МК, то скорее всего вы будете по уши в электронных платах. Вам придется не сколько программировать сколько исправлять разнородные аппаратные баги. Железо часто подводит. Вот пара примеров.
Программатор не видит target. Собрали стенд, положили SWD длинной 90 см и нет Link (а) с MCU. Когда кабель 12 см, то link есть. Потом статические электричество будет постоянно портить вам жизнь, разные разъёмы будут не контачить и прочее. Аппаратные проблемы будут еще до запуска кода.
Например плата работает под отладчиком, а при пере сбросе питания не стартует прошивка. На другой плате это не проявляется. И эта ситуация потребует неделю на выяснение и устранения причины. И так для каждого нового чипа и ToolChain (а). Свежие электронные платы с производства не любят работать. Предпочитают сразу сгорать. На программирование остается мало времени.
На сам процесс программирование уходит 20…10 процентов времени. В основном приходится что-то ремонтить, разбираться с пинами. Выяснять что куда подключено, проверять осциллографом наличие электрических сигналов, проходить по чек-листу. Не успеешь разобраться с одной платой, как тебе принесут еще две платы и надо будет вкуривать очередную схемотехнику на 30–60 страниц. А схемотехники даже блок-схему не нарисуют, сразу дают в лучшем случае Э3, а в обычном случае и вовсе принесут плату без доков и скажут, что надо ее запрограммировать.
Можно запросто неосторожно сжечь оборудование из-за неправильно подключенного заземления. Вы обязательно узнаете как пахнут искры. Можно потратить весь день на подключение лампочки или чтения состояния зашумленной кнопки. Копаться в разъемах. Лампочки тебя будут ослеплять. Моторы задевать.
Чтобы отлаживать код его надо исполнять. Если в коде баг и нет возможности исполнить код, то баг не исправить. Это как найти в лесу ногу, то не ясно что это и зачем. Понятно только когда эта нога видна в действии. Аналогично в понимании причины багов. Надо запускать код. А накладные расходы на запуск и исполнения микроконтроллерного кода при разработке на MCU в составе комплекса порой огромные.
Мало ресурсов
Программисты МК в принципе не пишут больших программ. Размер проекта ограничен несколькими сотнями килобайт памяти Nor Flash (а). Обычно 320KByte на всё. Вас будет преследовать постоянная нехватка Flash памяти. Особенно при разработке загрузчиков. Невозможность сделать полноценный загрузчик по всем интерфейсам. С RAM ситуация еще хуже. Вам повезет, если размер RAM будет в 4 раза меньше чем Flash (а). А частоты микроконтроллеров не превышают 200MHz, так как смысл МК это низкое энергопотребление.
Даже не мечтайте про удалёнку из Тайланда
Чтобы в принципе делать embedded software нужен физический доступ к оборудованию. Проверка сигналов осциллографом, подключение логического анализатора к I2S, измерение DMM (ом), работа с микроскопом для проверки, что микросхемы правильно припаяны. Анализ перегрева платы тепловизором. Это основное отличие программирования микроконтроллеров от, например, web программирования. Едва ли вообще можно эффективно работать в роли embedded удаленно. Это как удаленно красить стены или строить дом. Это профессия производственная и тут нужно физические первостепенное воздействие на прототип или изделие.
Образовательный BackGround
Самый полезный background для профессии программист микроконтроллеров я бы назвал профессию разнорабочий. Программирование микроконтроллеров это на 80–70% электротехника и только на 20–30% программирование. Надо будет делать прототипы и ремонтировать сгоревшие платы. Выяснять почему электронные платы с производства не включаются. Предстоит делать закупки, метаться по радиорынку, прокладывать проводку, чертить 2D и 3D детали, трассировать печатные платы, паять под микроскопом, измерять электрические сигналы, выпиливать, сверлить, фрезеровать, крутить разные отвертки, настраивать 3D принтер, пылесосить, ездить на автомобиле с ноутбуком на коленях и многое чего еще. Вас повезет, если вы вообще за неделю будете хоть что-то программировать в этой профессии программист микроконтроллеров.
Да и программы простые. Прочитать по ADC и что-н выполнить. Все что вам понадобится из теории computer science это теория конечных автоматов, структуры данных: массив, fifo, циклический массив, цифровые фильтры, триггер Шмидта и AES шифрование. Всё. Остальная теория будет скорее мешать, чем приносить пользу. Я ни разу не видел LIFO, двоичных деревьев AVL, красно-черных деревьев, косых деревьев в исходниках каких бы то ни было прошивок. Ни разу не видел хеш-таблиц, фильтров Блума, графов. Все это добро в большинстве не нужно в программировании МК.
Прошивки довольно простые программы. В них как правило нет никакого процессинга над данными. Всё сводится к тому, что надо GPIO мигать, кнопку прочитать, испустить PWM сигнал и прерывания по перепадам напряжений отловить. В микроконтроллерах нет нужды даже в алгоритмах сортировки. В сущности прошивки только прописывают регистры и считывают регистры. А это приводит к активации электрических цепочек внутри SoC (а). Со стороны вся цифровая электроника только и делает всего-навсего 4 простых действия:
1--установить на проводе 0V
2--установить на проводе 3.3V
3--считать с провода 0V
4--считать 3v с провода
Вот и всё. Easy.
В программировании МК не происходит ничего особенного. Как правило такие программы принимают пакеты из интерфейсов и что-то прописывают в интерфейсы или читают датчики и передают показания в интерфейсы. Принимают прошивку и прописывают ее в Flash память.
Программы для МК в основном нужны там, где надо быстро сигналы обрабатывать. Для управление любыми двигателями, для считывания датчиков физических величин. В таких вещах не должно быть никакой осечки и неожиданного поведения. Во встраиваемых системах не будет всех передовых технологий как MMU, Cache, динамического выделения памяти. Так как они не дают гарантии на время отклика. Есть правила MISRA, которые запрещают много интересного, например, динамическую память. Нет динамической памяти, а значит нет и абстрактных структур данных. Нет сортировки слиянием, быстрой сортировки. Ресурсов так мало, что быстрее отправить данные на сервер и расcчитать там чем рассчитывать что-то на MCU. Разработчик MCU обычно за год делают проект и переключаются на другой. В микроконтроллерном программировании всё очень топорно устроено. Как правило на один проект сажают одного человека. Командной работы нет. Поэтому такими программистами МК работаю как правило ортодоксальные интроверты.
В программировании МК как такового программирования-то мало. В основном задачи вида прочитать датчик и переслать значение в провода. Получить из проводов команду и включить лампочку. Получить из проводов массив и прописать его в энергонезависимую память и т.п.
Много работы с бумажками
Для программирования микроконтроллеров надо очень хорошо ориентироваться в множестве официальных документов. Вникать в с спецификацию компилятора (~1k страниц), стандарт языка С (~700–1k страниц), спецификацию процессорного ядра (~300 страниц), вникать в спеки каждой микросхемы (~1k…5k страниц) на печатной платы. Искать куда идут провода (~1–100 страниц). Придется как юрист очень много путаться в официальных бумагах.
Чего хорошего в профессии программист МК?
Плюс этой работы в том, что тут всё конкретно и завязано на физические величины. Всё можно измерить. Есть полный контроль за устройством. Никакого недоверенного кода. Никой OS которая вдруг начнет обновлять антивирус на МК нет. Всё можно оцифровать, любую физическую величину перевести в цифру. Всё упирается на физику и законы физики. Никто не будет спорить с законами физики. Софт произрастает от схемотехники. Схемотехника произрастает из физики. Достаточно посмотреть на схему устройства и уже становится понятно, что это и какое для неё должно быть firmware. Товар сразу видно, его можно потрогать, показать, покрутить. Язык Си по сравнению с другими языками простой как нож. Одни только функции и переменные. Самый древний язык из тех что еще используются ~50лет. Тут не будет никаких программных делегатов из C#, сборщиков мусора, исключений и виртуальных машин.
Вывод.
В целом профессия разработчика МК такая как я тут написал. Мало программирования и много проводов. Если у вас есть выбор и вы хотите программировать на разных языках и быть в теме классической программной теории, если вам 20…24 и вы решаете олимпиадные задачи с LeetCode и хотите использовать в работе современные и классические алгоритмы и структуры данных, то программирование MK вам едва ли подойдет. Тут просто не нужно ничего кроме FIFO и конечных автоматов. Займитесь Back-End (ом), Web (ом) нейросетями, мобильными приложениями, базами данных. С++ и то более живо развивается. Появились стандарты 11, 14, 17, 20, а plain С это 89, 99, 2011 и всё. По моим наблюдениям 3е из 5ти кто начинал с программирования MK спустя года переметнулись в другие программирования или совсем в другое. Программирование МК это для тех кто готов закатать рукава и замарать руки.
Если же вы всё же по каким-то причинам хотите программировать MCU, то старайтесь попасть в компанию, где делают тестирование, есть командная работа (3+ вкладчика), практикуется пере использование кодовой базы, есть планерки, инспекция программ, автосборки. И крайне важно, чтобы в компании отсутствовала секретность на схемотехнику и datasheet (ы). Там хотя бы будет выше вероятность сделать что-то по-настоящему ценное.
В общем делайте правильный выбор.