Початок кар’єри в Embedded-розробці. Які інструменти варто освоїти для роботи з мікроконтролерами

Привіт! Мене звати Максим, я працюю в GlobalLogic на посаді Associated C++ Developer. До компанії потрапив, як і більшість студентів, через РОС-проєкт. Маю вже рік комерційного досвіду, спеціалізуюся на C++, Embedded і розробці ПЗ під мікроконтролери.

У цій статті хотів би розповісти спеціалістам, які тільки починають свій шлях в Embedded-напрямі, якими були мої перші кроки та які базові інструменти варто опанувати для розробки під мікроконтролери.

Почнемо з бази: різниця між CPU і MCU

В Embedded-розробці часто доводиться працювати з мікроконтролерами (MCU), які мають свою власну архітектуру, що відрізняється від звичайних процесорів (CPU).

В чому взагалі різниця між CPU і MCU? CPU — це Central Processor Unit. Процесори в загальновідомих персональних комп’ютерах, які ми використовуємо повсякденно. Також існують мікроконтролери, які зазвичай зустрічаються в менших девайсах. Їх, як правило, називають constraint-девайси — тобто ті, що мають обмежені можливості.

Ці два типи обчислювальних чипів відрізняються тим, що процесори виконують лише обчислення, а мікроконтролери поєднують кілька функцій. Не лише обчислюють, але й зберігають інформацію, що робить їх багатофункціональними.

Які інструменти для розробки під мікроконтролери опанувати першими

До того, як я потрапив в Embedded-розробку, закінчив декілька базових курсів з IoT на Coursera та брав участь в Embedded-хакатоні. Хоча певне уявлення про напрям я вже мав, безпосередньо навичок було обмаль для роботи на реальному проєкті.

Щоб початківцю стати на шлях вивчення Embedded, варто добре розбиратися в ООП, процесі компіляції, знати мови програмування C/C++, і, що не менш важливо, мати бажання досліджувати та працювати в цьому напрямі.

Для базового розуміння добре підійдуть різні Arduino Kit, а також мікроконтролери від Espressif, наприклад, ESP32. Зокрема, потрібно добре володіти такими інструментами для розробки:

  • CMake.
  • GNU Make.
  • GNU Compiler Collection (gcc, g++).

Серед базових — саме CMake. Можливо, хтось вже стикався і знає про Gnu Compiler Collection (gcc), g++ інструменти, які використовуються в процесі компіляції під якусь цільову платформу. Але в основному такі компілятори призначені для операційних систем загального призначення на кшталт Linux.

Для компіляції коду в firmware, яка буде запущена на мікроконтролері, використовуються більш вузькоспрямовані компілятори типу ARM. А також інструменти як-то Gnu Make для управління процесом компіляції. До прикладу: якщо цільова платформа, яка повинна запускати написаний код, має мікроконтролер з ARM-архітектурою, то доцільно використовувати відповідний компілятор по типу arm-none-eabi.

Також, залежно від платформи, може змінюватись кількість інтерфейсів для взаємодії та безпосередньо «розпіновка» (pinout). Зробити процес компіляції більш універсальним можна з використанням директив (макросів), щоб включати в firmware тільки ті компоненти та ту частину коду, які підходять нашій цільовій платформі. Цей процес називається умовною компіляцією.

У Makefile зазвичай вказуються необхідні параметри, такі як змінні середовища або параметри при його запуску, щоб зробити процес компіляції більш гнучким. Це дозволяє макросам в коді вирішувати, чи включати певні частини коду, залежно від інформації в Makefile. Втім варто памʼятати: згідно з кращими практиками, не слід зловживати використанням макросів, пишучи код на C++. Це може призвести до непередбачуваної поведінки й надалі ускладнити процес дебагу безпосередньо коду. В такому випадку краще ініціалізувати значення «на стеці», використовуючи для цього окремий namespace.

Одне з практичних рішень в Embedded-розробці — це використання ESP-IDF фреймворку. Він полегшує розробку ПЗ під сімейство мікроконтролерів компанії ESP.

Окреслити основні переваги використання саме ESP-IDF фреймворку можна так:

  • Легкість використання — він бере на себе складний процес компіляції й створення build pipeline.
  • User friendly документація.
  • Багато офіційних прикладів коду — це ціла Вікіпедія. Можна зайти на сайт офіційної документації та знайти там приклади коду й документації по різних частинах. Саме тому для бізнесу це доволі валідна штука.
  • Інтеграція з іншими системами, підтримка багатьох протоколів;
  • Низька цінабезпосередньо мікроконтролерів ESP.

Особисто мені вже доволі великий проміжок часу доводиться працювати з ESP-IDF фреймворком, який показує високу гнучкість і великий функціонал для адаптації під свої потреби та інтеграції з іншими системами.

Процес компіляції у розробці

Процес компіляції може здатися доволі незвичним і складним для новачків, проте його необхідно зрозуміти, щоб стати кращим спеціалістом у майбутньому.

Ось з чого він складається:

  1. На першому етапі компіляції залучається препроцесор, який замінює директиви та константи реальними значеннями в коді. Всі ці значення будуть розміщені в такому сегменті пам’яті мікроконтролера, як bss storage, який зберігає в собі всі константні та неініціалізовані значення.
  2. На другому етапі код компілюється в object-файли з розширенням .o . Такі файли буквально містять в собі двійкові значення.
  3. На третьому етапі починає дію лінкувальник, ціль якого — об’єднати всі object-файли в один.
  4. І як завершальний етап всього процесу виконується робота локатора, який розміщує firmware на цільовій платформі.

Слід зазначити, що написаний нами код зберігається в енергонезалежній пам’яті, в code memory сегменті. А інформація про запуск нашого коду (application) — в сегментах енергозалежної пам’яті stack та heap.

Тут важливо розуміти організацію памʼяті, а саме розрізняти volatile та non-volatile storage. Перший тип пам’яті використовується для зберігання інформації, яка з кожним перезапуском буде стиратися. Іншими словами — енергозалежна пам’ять. Другий тип — енергонезалежний, і використовується він для зберігання критичної інформації, що не може бути втрачена. Прикладом енергозалежної пам’яті є RAM, а енергонезалежної — EEPROM, Flash та NVS.

Розуміння всіх цих процесів допоможе в створенні гнучкого build pipeline, який можна адаптувати під будь-які потреби.

Перші кроки в Embedded: кейс з практики

Раніше GlobalLogic розробили POC-проєкт, який мав на меті менеджмент енергії, що споживається на різних підприємствах та у багатоквартирних будинках. До прикладу: у нас є домашні пристрої, які споживають електроенергію. Щоб не виходити за певні ліміти, потрібно надавати пріоритети кожному з них. І кожен девайс — це певна плата, яка підключається до Raspberry Pi 3 сервера і взаємодіє з ним. А сервер вже розподіляв, чи надавати доступ до електромережі такому пристрою, чи ні.

Цей проєкт продовжував розвиватись. Одним з перших завдань моєї команди (і перших моїх завдань у напрямі Embedded загалом) стала імплементація рішення для його інтеграції з іншою платформою. Клієнти, які підключаються до сервера, були реалізовані на базі мікроконтролера Raspberry Pi Zero, а нам слід було зробити міграцію на Raspberry Pi Pico.

У чому полягав челендж? Існує інструмент Avahi, який є імплементацією zero-conf мережі та робить комунікацію між девайсами більш доступною, даючи змогу взаємодіяти девайсам за допомогою hostname.

Який принцип роботи цієї технології? Уявімо девайс, який підключений до мережі й має свою IP-адресу. Він хоче надіслати якийсь запит на сервер. На цьому етапі він може зіткнутися з проблемою, коли IP-адреса сервера в мережі постійно змінюється. Оскільки він міг під’єднатися раніше та отримати одну IP-адресу, а міг зробити це пізніше та отримати іншу, яка визначається маскою мережі. Завдяки hostname не потрібно знати IP-адресу нашого сервера, коли в мережі наявний DNS-сервер, що зберігає в собі інформацію про IP-адреси пристроїв і рівнозначні ним hostname.

Проблемою нашої адаптації під іншу платформу стало те, що Avahi Service, який працював з попередньою Raspberry Pi Zero платформою, не був сумісний з Raspberry Pi Pico.

Як ми вийшли з цієї ситуації? Змінили підхід взаємодії між клієнтами та сервером в мережі. Відтепер сервер мав статичну IP-адресу, що давало гарантію підключення до нього і незмінність його IP-адреси. На основі цього ми адаптували POC-проєкт під Raspberry Pi Pico мікроконтролери.

Досвід на проєкті дав мені можливість не лише ознайомитися з новими технологіями, а й спробувати глибше зрозуміти наявну архітектуру та адаптувати її під специфічні потреби. Що є досить важливою навичкою для Software Engineer загалом.

Висновки

Отже, розробка під мікроконтролери відрізняється від звичної розробки ПЗ тим, що має певні особливості своєї платформи. А також безпосередньо розробка залежить від багатьох факторів, як-то розмір пам’яті та тип мікроконтролера. Окреме місце займає процес компіляції, оскільки його розуміння є необхідним для розробки універсальних програм, які використовуватимуть всі спроможності цільової платформи та будуть гнучкими у використанні.

Початківцям порадив би вкластися фінансово у свої Embedded-знання і купити Arduino kit або ж ESP32 мікроконтролер. Це не стало б дорогою покупкою, проте дало б досвід роботи з мікроконтролерами та розуміння їх взаємодії.

Особисто для себе з подальших викликів в кар’єрі виділяю покращення розуміння в програмуванні, різних технологіях та роботу не лише з мікроконтролерами, а й з іншими платформами.

👍ПодобаєтьсяСподобалось9
До обраногоВ обраному6
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Не нужен вам ни С++ на ООП для Embedded.

Я працював раніше в ембеддед-розробці. Я написав код, а електронщик спаяв та передав плату для тестування. Але навіть абсолютно коректний код працював неправильно з тою платою. Як виявилось, плата була спаяна неправильно.

В ембеддед розробці коректність роботи коду не завжди залежить від роботи програміста, іноді причини можуть бути неочевидні.

знати мови програмування C/C++

(Stroustrup speaking):

Even I can’t answer every question about C++ without reference to supporting material (e.g. my own books, online documentation, or the standard). I’m sure that if I tried to keep all of that information in my head, I’d become a worse programmer. What I do have is a far less detailed — arguably higher level — model of C++ in my head.

на любій мові можна писати як на Паскалі

Початківцям порадив би вкластися фінансово у свої Embedded-знання і купити Arduino kit або ж ESP32 мікроконтролер. Це не стало б дорогою покупкою, проте дало б досвід роботи з мікроконтролерами та розуміння їх взаємодії.

Беріть одразу stm32, бо зараз це база. Берем програматор, bluepill девборду і все, або фірмову там нуклео якусь, де програматор розпаяний. Тим паче ми зараз живемо в кіберпанку, де stm32 коштує дешевше престарілого 8 бітного AVR контроллера.

беріть stm32 щоб вашому психологу було на що жити)))

взагалі рекомендую починати з ESP32
він дуже дешевий і потужний. І при цьому простий и дозволить познайомитись з МК так як вам довподоби (бачив навіть JS-інтерпритатори під компіляцию на ESP32)

далі, якщо ви опанували esp-IDF і не мае ніяких пролем з С, регістрами, е розуміння як все працюе і тд можна буде помацати щось із світу червоних очей

Ну, в stm32 є HAL тому можна почати і без регістрів, + є автогенерація бойлерплейту для вибраного МК/борди.

Так, в stm32 е кубик та HAL.
А також в’етнамскі флешбеки піся опанування всього цього.

Порадити stm32 початківцю це гарний спосіб відбити будь яке бажання влазити в embedded)

та ладно, stm32f103 як два пальці обіс..., якщо треба замість FT232 клона що внєзапно перестав робити після оновлення дров зробити COM port

без hal та кубіка, так
купа статей в інтернеті зараз, все просто, навіть під Ардуіно заводиться

Якщо робити все «серйозно», то вже на кубі попливеш. Потрібно дуже багато чого знати, щоб «почати» з STM32
І я мовчу про HAL і його приколи (особливо якщо потрібно ліби шити)

Якщо формошльоп як я зміг розібратися з усілякими adc, pwm та скліпати логіку dc-dc + прикрутити oled дисплейчик то і інші зможуть;) А далі там світ rtos, усіляких драйверів tcp/ip стеку і т.д. там вже мабуть ті нюанси налаштувань периферії не сильно то й вирішують:)
STM32 вибирав тому що поверхнево оцінив ринок і побачив їх що в дронах що в 3д принтерах що в іншій електроніці.
Але з ESP32 не грався тому не можу порівнювати, можливо там і справді легший старт+вони також доволі популярні. Єдине що — я б скіпнув ардуіно якщо є якийсь технічний бекграунд, бо це тупо витрачання часу.

Якщо після STM32 до психолога то ліпше в іншу професію йти. Нема там нічого складного. Радити Arduino для старту в розробці??? Це платформа для початківців.

Ну люди різні і з STM32 дійсно багато часу треба вбити щоб розібратись) в мене пішов місяць після ардуінки а ESP32 на ESP-IDF має хоч і більший тулчейн але загалом для старту суперова штука бо є все як в STM32 і плюсом HAL зрозуміліший і простіший хоч і не такий варіативний

для чого STM32? автомотів/індастріал/спейс кліматика, чи мало ногів на перехверії?

Зараз дійсно популярні IoT-рішення, і розробка на платформі ESP дуже зручна, оскільки там уже є вбудований Wi-Fi модуль. Якщо ж у певної моделі STM32 є вбудований Wi-Fi модуль, то це теж хороший варіант. Я згадував про Arduino kit не через саму платформу, а тому, що в ньому є багато сенсорів, і з ними можна вивчити багато базових речей на практиці.

STM32 із езернетом та яким lwip, але поцо?

Як елегантно із світу Embedded викинуті потужні MPU і залишені тільки MCU :)

Що ж, успіхів вам в Embedded без знання MPU ;-)

та ладно, а що його знати, щоб писати на ньому CRUD на JS?

Ну він тут і про FPGA не згадує, про верілог також не згадує, про те що крім мікроконтроллерів в ембеді є 2 десятки програмованих мікросхем різного призначення, і кожна з них потребує вивчення тисяч сторінок всякої нецікавої літератури.

а ще ЦОС, SDR та роботу із раідо PHY, данунах коли можна круди клепати без знання MPU

Ця стаття більше орієнтована на новачків у сфері Embedded. Особисто я ще не мав досвіду роботи з MPU, FPGA чи SoC, і такі проєкти зазвичай не доручають початківцям.

не бери дурного до голови а тяжкого в руки і беде тобі щестє

Уявімо девайс, який підключений до мережі й має свою IP-адресу. Він хоче надіслати якийсь запит на сервер. На цьому етапі він може зіткнутися з проблемою, коли IP-адреса сервера в мережі постійно змінюється. Оскільки він міг під’єднатися раніше та отримати одну IP-адресу, а міг зробити це пізніше та отримати іншу, яка визначається маскою мережі

може використовувати напр. Multiaddress як libp2p або IP6, не зрозуміло, чому IP адреса сервера змінюється, це що який хмарний сервіс нашару?

Ви праві, можна використовувати технології, як libp2p або IPv6, для вирішення таких проблем. Що стосується зміни IP-адреси, я мав на увазі, що сервери в локальних мережах часто отримують динамічні IP-адреси через DHCP, тому вони можуть змінюватися в залежності від того, коли пристрій підключається до мережі. Для хмарних сервісів зазвичай використовують DNS, щоб уникнути проблем із зміною IP.

ArduinoMDNS, або для локалки свій протокол для діскавері поверх UDP

Для базового розуміння добре підійдуть різні Arduino Kit, а також мікроконтролери від Espressif, наприклад, ESP32. Зокрема, потрібно добре володіти такими інструментами для розробки:

CMake.
GNU Make.
GNU Compiler Collection (gcc, g++).

Arduino Ide, Arduino-cli, Platform io

В наших краях тупікова галузь і з.п. на рівня рядового інженера, для фанатів ходити на завод через прохідну

На галерах є трохи ембедеду. Там зп ± типові айтішні

Если глобал уберет свои 3 вакансии по ембеддед, то на этом с эмбеддед все в Украине закончиться

Ajax, Squad, Samsung, Nvidia, Autotalk — це тільки продуктовий ембедед. А ще ембедед набирають всі найбільші галери країни. Нормально тут із ембеддедом ;-)

нормально це в порівнянні із Молдовою чи Монголією?

В Україні багато компаній спеціалізуються на ембедеді — уже згадані Ajax, Squad, Samsung, Autotalk, Nvidia, а також Ubiquity, Larch Networks, Newxel, PLVision — відділення останніх п’яти перерахованих компаній, які знаходяться в Україні, спеціалізуються на розробці ПЗ для мережевого обладнання.
Зараз ще багато є компаній які спеціалізуються на ембеддед для військового застосування.

там трохи не той ембедед, не теплий ламповий

А що таке теплий ламповий ембеддед? Платку ЛУТом зробити?

АІ з VR подружити джейсонами і іксемелами, це тру

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

Я не згадував в моїй відповіді платформу Arduino, не розумію доцільність вашого коментара, особисто я зараз вивчаю SoC платформи від Texas Instruments і моливості їхньої інтеграції з AI

Чому ви не використали mDNS/SSDP напряму? Там в простих випадках не дуже складний протокол, але це зручніше ніж фіксована адресса

На платформі, яку ми використовували, не було готової адаптації для mDNS/SSDP. Це змусило нас обрати інше рішення, яке було доступне та відповідало нашим вимогам.

Ви ж розробники, можна ж нагуглити протокол, або навіть реалізацію. Наскільки памʼятаю в гугл хромі mdns протокол займає десь 500-600 строк і залежіть тільки від сокета. Це ж краще ніж рішення з ранніх 2000х?

Embedded доволі широке поняття, це може буди і контролер, і якийсь модуль до ПК, а може буди і керування обладнанням під високою напругою. Тобто теж є своя специфіка. Наприклад керування двигуном, PWM, крокові двигуни, сервоприводи та ін. Питання не в тому, що в тебе замала потужність контролера, а в загалі розуміння умов праці всього того що ти під’єднав хоч до ПК, хоч до Arduino. Є процеси які повинні виконуватись в окремому потоку, або потрібне переривання чи інший івент. Розуміти що буде якийсь датчик або обладнання, а бібліотеки на нього нема. Або вона є і не працює, чи в загалі потрібно написати іншою мовою керування. Методи керування, зв’язку, I2C, I2S, SPI, UART та інш. Як перевірити все, знайти помилки фізичного підключення. Вже не кажу за перешкоди зв’язку, де переклавши дрота на сантиметр в сторону може стабільно класти зв’язок, або взагалі контролер.
Тому спочатку потрібно вирішити, що саме ви хочете програмувати, купувати необхідне обладнання та вчитись.

в реалиях дня сегодняшнего чистых CPU уже практически не осталось, все MCU или SoC

Щось стаття про все і ні про що. Це в GL заставляють щось написати перед промоушеном?:)

Наразі ми активно шукаємо embedded-авторів та самі пропонуємо їм створювати відповідні матеріали. Чекатимемо і вашу статтю на тему навчання, розвитку або конкретних технологій у Embedded :)) надсилати можна на пошту [email protected]

Цікаво, але дещо замалий об’єм для нашого формату. Бачу, це перша частина — як буде друга, надішліть, будь ласка, все разом нам на пошту (вказала її вище). Розглянемо детальніше

на тему навчання, розвитку або конкретних технологій у Embedded :))

а чим навчання у ембеді відрізняється від навчання взагалі?

Файно, що DOU цікавиться нашою галуззю. Сподіваюсь, одного дня ми тут отримаємо окремий піддомен, як це сталося з gamedev. Бажаю успіху в пошуку авторів

Іване, дякуємо за підтримку! Це справді так, вболіваємо за цю галузь та хочемо робити максимально корисні матеріали для людей, що прагнуть у ній розвиватись)

Номальна стаття, як для трейні
Не розумію тільки для чого молодій людині іти в дідівську професію.

Не розумію тільки для чого молодій людині іти в дідівську професію.

Субʼєктивно — це цікавіше ніж клепати круди в вебі. Але з точки зору «зусилля/$» це звичайно звучить як жарт:) Дока по одному stm32 g4 по обʼєму більше ніж по умовному Angular+TS, при цьому зверху це повинно бути приправлено C, базовими протоколами, базовими знаннями електроніки. Тож з практичної точки зору простіше за 2 години зробити таски по фронту і гратися з пет проектами скільки захочеш:)

до того ж ангулярщику на порядок легше працювати віддалено

з часів ковіду працюю віддалено, ніяких проблем, пошта і лаба девайсів із віддаленим доступом — рішає :)

не у всіх так, точніше у всіх не так

точно не у всіх — не так. знаю декількох, у кого — так же :)

Стаття більше орієнтована на новачків у сфері Embedded і не зачіпає складних концепцій.

Embedded розробка це не про інструменти, а про спосіб використання (коли щось вбудовано). Можна взяти звичайний десктоп, поставити туди вінду, написати софт на С# і підключити це до комбайну в чистому полі, щоб він автоматично працював. Якщо це разова активність, то з економічної точки зору, це оптимальний варіант. Але коли починається серія, то може виявитись що брати десктоп за 1к доларів це не дуже ок, а треба вкластись в 100 доларів, тоді починаються обмеження, типу вінду нізя, C# - нізя, ось вам голе залізо, розважайтесь. Але ми все ще залишаємось в домені embedded розробки. Власне це я до того, що інструменти для embedded і для desktop можут сильно пересікатись.

Embedded розробка це не про інструменти, а про

Даташити на 1000 сторінок :D

реально чуваки слава даташитам у ембеді! особливо і здебільшого і можливо навіть «майже виключно» саме «залізним»

Клієнти, які підключаються до сервера, були реалізовані на базі мікроконтролера Raspberry Pi Zero, а нам слід було зробити міграцію на Raspberry Pi Pico.

Отут було боляче.

Pico чи Zero, Java чи JavaScript, яка різниця...

Було на

Raspberry Pi Zero

, перенесли на

Raspberry Pi Pico

. Чи я питання не зрозумів?

Клієнти, які підключаються до сервера, були реалізовані на базі мікроконтролера Raspberry Pi Zero, а нам слід було зробити міграцію на Raspberry Pi Pico.

не підкажете як підключались до сервера на Рісо (на якій нема безпровідного зв"язку) ?

У РісоW є wifi, ще є усілякі адаптери на Ethernet.

Ну на девборді є, але то просто есп 8266. Але нащо брати дві сумнівні мікрухи, коли є одна есп, яка заміняю цю пару, невідомо. Але дебільні замовлення в електроніці не рідкість. Як і використання в 21 столітті дорогущих 8 бітних AVR, коли стм32 дешевше. Але діди пердуни не вміють працювати з чим, того беріть авр, скажіть дякую, що не мк51

діди-пердуни використовують те що затверджено в номенклатурі,
а модне і неперепровірене це шлях молодих (давайте перепишем все з нуля)

Підписатись на коментарі