Как стать автором
Обновить

Вы в самом деле хотите стать программистом микроконтроллеров?

Программирование микроконтроллеров *Карьера в IT-индустрии Производство и разработка электроники *Электроника для начинающих

В этом тексте я напишу о буднях программиста МК в РФ.

Что вообще пишут программисты МК и на чем?

Основной язык программирования это С. Языку С уже более 50лет. Кроме микроконтроллеров С уже практические никому не нужен. Навыки программирования на С очень слабо конвертируются. В свое время, видимо на С написали компилятор для С++ и нужда в С для desktop как таковая отпала. A сам С остался для сборки артефактов для микроконтроллеров с экстремально малыми ресурсами (для automotive ECU, SIM карт). Хотя и сейчас большинство компаний в Евросоюзе уже давно как и микроконтроллерные сборки собирают на С++ 17 и выше. 

Еще программистам MК приходится обсчитывать аналоговые цепи и вычислять какие-то сложные 8-этажные формулы и строить графики. Для этого практикуют бесплатный интерпретатор Python.

Главным образом программисты МК составляют Board Support Package, пишут драйверы для новых умных периферийных чипов c управлением по интерфейсам I2C/SPI/MDIO/1Wire/UART/SMBus/PMBus, пишут загрузчики, портируют RTOS(ы) на разные процессорные ядра, пишут код-генераторы, скрипты сборки, составляют модульные тесты, изредка производят рефакторинг, часто чинят ошибки в Legacy коде, изредка что-то изменяют в коде Assembler(а), который запускается до вызова функции main().

Иногда программист МК даже ничего и не пишет сам вообще. Важно уже не сколько уметь программировать сколько уметь тестировать и собирать, улучшать из готового кода из интернета. Какие-то исходники можно взять из github или ядра Linux. Там есть код на многие темы. Драйверы для множества чипов.  Важно уметь верифицировать найденные сорцы и аккуратно подключить их к нужной сборке.

Где работать?

В России программисты МК в основном работают в компаниях, которые делают госзаказ на военную технику. Основной источник работы - госзаказы и ОКРЫ. Конечный программист МК как правило даже не знает, что за комплекс разрабатывается в организации. Все платы называются "вычислительный модуль". ТЗ для программиста МК под запретом.

Традиций в этой профессии в РФ исторически не сложилось. Разработка всюду похоже на анархию. Зачастую вам придется работать даже без технического задания. Задачи могут поставить так: “подружить микроконтроллер и айфон”, “оживить плату”, “подружить платы”. Понимай как хочешь. Нет доверенной покрытой тестами кодовой базы на всю страну. То есть нет тех кирпичей из которых можно было бы гарантированно собирать программное здание. Нет никакой общей культуры разработки системного ПО.  Нет общей терминологию. Везде свой внутренний фольклор.

Что разрабатывать?

Любое электронное устройство, которое вы будете делать скорее всего можно будет назвать одним словом: переходник. Типичное IoT устройство это с одной стороны, например, датчик температуры на шине I2C c другой стороны WiFi модуль. Телематика это тоже переходник: с CAN на LTE и т д.  Всё что я делал в русской электронике 10лет подряд это переходники с одного интерфейса на другой интерфейс. Маршрутизаторы, модемы, телематика, СКУД(ы), аудиосистемы, IoT. Переходники. Переходники. Переходники.


Есть некоторая специфика программирования МК в РФ. Свою оригинальную электронику в России делать отказались еще в конце 60х. Был принят гос план копировать западные IBM(ы). В результате Россия стала полным акцептором IT технологий. Сегодня у России нет своего дешевого процессорного RISC/MIPS/PowerPC ядра, нет своего компилятора для известных ядер ARM, PowerPC, RISC -V. У РФ нет даже своего текстового редактора. Благо есть открытый софт (Linux и GCC), которым и пользуются российские компании. Страна полностью зависит от импорта микропроцессоров и ToolChain(а) для микропроцессоров. Микроконтроллеры активно покупают в Италии, Франции, США, Китае, Нидерландах, Канаде, Швейцарии. Toolchain покупают у Швеции (IAR), Германии(Keil), США(GHS).

В РФ по-настоящему передовые электронные разработки часто попросту не доживают до серийного производства банально из-за очередного эмбарго.

Россия страна санкционная. В российской организации могут запросто решится начать разработку, которую можно реализовать только на одном единственном импортном чипе из Евросоюза. А вендор этого чипа наложит эмбарго либо сразу либо потом и не будет присылать вам полный datasheet и сами чипы так как РФ по его мнению является санкционной территорией. И в результате вы как программист микроконтроллеров вообще ничего не сможете с этим сделать. Такая история у меня лично была уже дважды. 

В США ситуация диаметрально наоборот. Там не то, что есть полный цикл IT продуктов. Там еще есть каждый IT продукт в нескольких экземплярах, т.е. от нескольких вендоров. Микропроцессоры AMD, Intel, TI, Microchip. Софт операционных систем от MAC, Windows. Компиляторы TI, GHS. Всеми любимый текстовый редактор VS Code от Microsoft.

Работа программиста MK происходит как правило в гаражных или около гаражных условиях. Провода. Высокое напряжение. Много какого-то металлолома возле компьютеров. Хлам на столах с горочкой. Вероятно будешь работать по соседству с шумным охладительным оборудованием так как электронные платы надо подвергать климатическим испытаниям. 

Начальство программистов микроконтроллеров в 3-x случаях из 5-ти в российских компаниях это в прошлом схемотехники. О программировании они знать ничего не хотят, не любят программировать. Учится у них программированию не выйдет. 

Российские компании не хотят ничего выдумывать. Предпочитают копировать то, что уже есть на западе. Едва ли в РФ получится участвовать в какой-либо уникальной прорывной разработке на микроконтроллерах. По настоящему грандиозных проектов в РФ скорее всего просто не удастся сделать из-за эмбарго. Проекты гаджетов с Kickstarter(а) или CrowdSupply вызывают больше восхищения и трепета чем то, что пытаются делать электронные компании в РФ со своим громадным опытом.   

В программировании микроконтроллеров большинство русских фирм даже не заботятся о коде как таковом вообще. Для их процессов внутри организации кода как будто бы и не существует вовсе. О коде не говорят. Код не изучают, код не анализируют. Интерес представляет только физический прибор. В большом почете схемотехники и конструкторы. А исходники можно вообще хранить в открытом доступе и это никого не волнует. Исходники микроконтроллера никого кроме 1го разработчика не интересуют. В одной российской организации я видел как программист микроконтроллеров называл С функции именами литературных персонажей и это никого вообще не волновало так как кроме него с этим кодом никто не работает. А он хотел быть незаменимым. И как правило один человек делает прошивку для одной платы. Другой программист делает прошивку для другой платы. Каждый пишет свою бажную версию fifo, swap, циклического буфера, цифрового фильтра, загрузчика, reverse_byte, CRC8, crc16, crc24, crc32 и пр. зачастую даже без юнит тестов. Повторяемость кода достигает количества программистов в организации умноженная на 100%. Обычно это 500%...700%. Их сорцы никто не контролирует, их код не инспектируют, не тестируют, не переиспользуют. Большинство разработчиков даже юнит тестов не делают. В результате во всех микроконтроллерных проектах может быть дичайший хаос и этого даже никто не заметит.  Это особенность российской программистской культуры ведения R&D.

Второстепенная работа

Работа программирования МК тесно связана с электронными платами. Если вы программист МК, то скорее всего вы будете по уши в электронных платах. Вам придется не сколько программировать сколько исправлять разнородные аппаратные баги. Железо часто подводит. Вот пара примеров. 

Программатор не видит target. Собрали стенд, положили SWD длинной 90 см и нет Link(а) с MCU. Когда кабель 12 см, то link есть. Потом статические электричество будет постоянно портить вам жизнь, разные разъёмы будут не контачить и прочее. Аппаратные  проблемы будут еще до запуска кода. 

Например плата работает под отладчиком, а при пересбросе питания не стартует прошивка. На другой плате это не проявляется. И эта ситуация потребует неделю на выяснение и устранения причины. И так для каждого нового чипа и ToolChain(а). Свежие электронные платы с производства не любят работать. Предпочитают сразу сгорать. На программирование после починки плат остается мало времени.

На сам процесс программирование уходит 10...20% времени. В основном приходится что-то ремонтить, разбираться с проводами. Выяснять что куда подключено, проверять осциллографом наличие электрических сигналов, проходить по чек-листу. Не успеешь разобраться с одной платой, как тебе принесут еще две платы и надо будет вкуривать очередную схемотехнику на 30-60 страниц. А схемотехники даже блок-схему не нарисуют, сразу дают в лучшем случае электрическую принципиальную схему (Э3) в виде фотографии *.JPG, а в обычном случае и вовсе принесут плату без доков и скажут, что надо оживить плату.

Можно запросто неосторожно сжечь оборудование из-за неправильно подключенного заземления. Вы обязательно узнаете как пахнут искры. Можно потратить весь день на подключение лампочки или чтения состояния зашумленной кнопки. Копаться в разъемах. Лампочки тебя будут ослеплять. Моторы задевать. 

Чтобы отлаживать код его надо исполнять. Если в коде баг и нет возможности исполнить код, то баг не исправить. Это как найти в лесу отдельно лежащую человеческую ногу, то не ясно что это и зачем. Понятно только когда эта нога видна в действии. Аналогично в понимании причины багов. Надо запускать код. А накладные расходы на запуск и исполнения микроконтроллерного кода при разработке на 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 это теория конечных автоматов, PID регуляторы, самые базовые структуры данных (массив, FIFO(шка), циклический массив), цифровые фильтры, триггер Шмидта и AES шифрование. Пожалуй всё. Остальная теория будет вам скорее мешать, чем приносить пользу. Я ни разу не видел LIFO, двоичных деревьев AVL, красно-черных деревьев, косых деревьев  в исходниках каких бы то ни было прошивок. Ни разу не видел хеш-таблиц, фильтров Блума, графов. Все это добро в большинстве своем просто не нужно в программировании МК.

Прошивки довольно простые программы. В них как правило нет никакого процессинга над данными. Всё сводится к тому, что надо GPIO мигнуть, кнопку прочитать, испустить PWM сигнал и прерывания по перепадам напряжений отловить. В микроконтроллерах нет нужды даже в алгоритмах сортировки. В сущности прошивки только прописывают константы в регистры и считывают регистры SoC(а). А это приводит к активации электрических цепочек внутри SoC(а). Со стороны вся цифровая электроника только и делает всего-навсего 4 простых действия:

1--установить на проводе 0V

2--установить на проводе 3.3V

3--считать с провода 0V

4--считать с провода 3.3V
Вот и всё. Easy.

В программировании МК не происходит ничего особенного. Как правило такие программы принимают пакеты из интерфейсов и что-то прописывают в интерфейсы или читают датчики и передают показания в интерфейсы. Принимают прошивку и прописывают ее в Flash память. 

Программы для МК в основном нужны там, где надо быстро сигналы обрабатывать. Для управление любыми двигателями, для считывания датчиков физических величин. В таких вещах не должно быть никакой осечки и неожиданного поведения. Во встраиваемых системах не будет всех передовых технологий как MMU, Cache, динамического выделения памяти. Так как они не дают гарантии на время отклика.  Есть правила MISRA, которые запрещают много интересного, например, динамическую память. Нет динамической памяти, а значит нет и абстрактных структур данных. Нет сортировки слиянием, быстрой сортировки.  Ресурсов так мало, что быстрее отправить данные на сервер и расcчитать там чем рассчитывать что-то на MCU. Разработчик MCU обычно за год делают проект и переключаются на другой. В микроконтроллерном программировании всё очень топорно устроено.  Как правило на один проект сажают одного человека. Командной работы нет. Поэтому такими программистами МК работаю как правило только ортодоксальные интроверты. 

В программировании МК как такового программирования-то мало. В основном задачи вида прочитать датчик и переслать значение в провода. Получить из проводов команду и включить лампочку. Получить из проводов массив и прописать его в энергонезависимую память и т.п. 

Много работы с бумажками

Для программирования микроконтроллеров надо очень хорошо ориентироваться в множестве официальных документов. Вникать в спецификацию компилятора (~1k страниц), стандарт языка С (~700-1k страниц), спецификацию процессорного ядра (~300 страниц), обязательно ознакомиться с перечнем ошибок проектирования кристалла (~20 страниц), вникать в спеки каждой микросхемы (~50...5k страниц) на печатной плате. Искать куда идут провода(~1-100 страниц). Придется как юрист очень много пылиться в чтении официальных документов.

Чего вообще хорошего в профессии программист микроконтроллеров?

Плюс этой работы в том, что тут всё конкретно и завязано на физические величины. Всё можно измерить. Есть полный контроль за устройством. Никакого недоверенного кода. Никой OS, которая вдруг начнет обновлять антивирус на МК нет. Всё можно оцифровать, любую физическую величину перевести в цифру. Всё упирается на физику и законы физики. Никто не будет спорить с законами физики. Софт произрастает от схемотехники. Схемотехника произрастает из физики. Достаточно посмотреть на схему устройства и уже становится понятно, что это и какое для неё должно быть firmware. Товар сразу видно, его можно потрогать, показать, покрутить. Язык Си по сравнению с другими языками простой как ножик. Одни только функции и переменные. Самый древний язык из тех что еще используются ~50лет. Тут не будет никаких программных делегатов из C#, сборщиков мусора, исключений и виртуальных машин.

Вывод.
В целом профессия разработчика МК такая как я тут написал. Мало программирования и много проводов. Если у вас есть выбор и вы хотите программировать на разных языках и быть в теме классической программной теории, если вам 20..24 и вы решаете олимпиадные задачи с LeetCode и хотите использовать в работе современные и классические алгоритмы и структуры данных, то программирование MK вам едва ли подойдет. Тут просто не нужно ничего кроме FIFO и конечных автоматов. Займитесь Back-End(ом), Web(ом) нейросетями, мобильными приложениями, базами данных. С++ и то более живо развивается. Появились стандарты  11, 14, 17, 20, а plain С это 89, 99, 2011 и кажется всё. По моим наблюдениям за 10 лет в среднем 3е из 5ти кто начинал с программирования MK спустя 3 года переметнулись в другие программирования или совсем в другое. Программирование МК это для тех кто готов закатать рукава, замарать руки и регулярно выходить из зоны комфорта.

Если же вы всё же по каким-то причинам хотите программировать MCU, то старайтесь попасть в компанию, где делают модульное тестирование сорцов, есть командная работа (3+ вкладчика), практикуется пере использование кодовой базы, есть планерки, инспекция программ, автосборки. И крайне важно, чтобы в компании отсутствовала секретность на схемотехнику и datasheet(ы) и техническое задание. Там хотя бы будет выше вероятность сделать что-то по-настоящему ценное.

В общем делайте правильный выбор.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы программировали МК?
75.72% да 418
24.28% нет 134
Проголосовали 552 пользователя. Воздержались 34 пользователя.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы программируете МК на С?
64.22% да 298
35.78% нет 166
Проголосовали 464 пользователя. Воздержались 65 пользователей.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы программируете МК на С++?
36.26% да 165
63.74% нет 290
Проголосовали 455 пользователей. Воздержался 71 пользователь.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Какой компилятор вы используете для сборки артефактов для МК?
8.41% IAR 27
16.2% Keil 52
66.04% GCC 212
0.62% GHS 2
6.54% Clang 21
2.18% TI 7
Проголосовал 321 пользователь. Воздержались 148 пользователей.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Какое процессорное ядро вы программировали?
58.63% ARM 214
0.27% PowerPC 1
2.74% MIPS 10
3.01% RISC-V 11
3.56% x86 13
23.56% AVR 86
6.58% Xtensa 24
0.82% 8051 3
0.82% PIC 3
0% командоаппараты 0
Проголосовали 365 пользователей. Воздержались 142 пользователя.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы собираете артефакты из-под IDE?
55.69% да 191
44.31% нет 152
Проголосовали 343 пользователя. Воздержались 122 пользователя.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы собираете артефакты из Make/CMake файлов?
46.31% да 157
53.69% нет 182
Проголосовали 339 пользователей. Воздержались 115 пользователей.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы собираете артефакты из Make файлов?
38.33% да 23
61.67% нет 37
Проголосовали 60 пользователей. Воздержались 23 пользователя.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы собираете артефакты из СMake файлов?
37.5% да 21
62.5% нет 35
Проголосовали 56 пользователей. Воздержались 23 пользователя.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы собираете артефакты для МК из Ninja файлов?
9.43% да 5
90.57% нет 48
Проголосовали 53 пользователя. Воздержались 23 пользователя.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Какой текстовый редактор вы используете?
16.67% Eclipse 8
25% Notepad++ 12
14.58% Vim 7
2.08% Kate 1
10.42% Sublime 5
0% Geany 0
33.33% MS VS Code 16
35.42% Другой 17
0% CLion 0
0% Еmacs 0
0% CodeBlocks 0
Проголосовали 48 пользователей. Воздержались 14 пользователей.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Какой вы используете терминал COM порта?
25% HTerm 1
50% TeraTerm 2
0% Putty 0
25% Terminal 1
0% Serial Kingdom 0
50% другой 2
Проголосовали 4 пользователя. Воздержавшихся нет.
Теги:
Хабы:
Всего голосов 86: ↑72 и ↓14 +58
Просмотры 12K
Комментарии Комментарии 81