«Старички» - это люди с большим опытом использования юникс-систем и разработки под них. То есть - мы.
МИКРОКОНТРОЛЛЕРЫ
Мы все, так или иначе, сталкивались с разработкой под микроконтроллеры. Какие для этого есть классические инструменты? Например, для платформы Atmel - если мы разрабатываем из-под Linux, то инструменты все те же, которые используются для разработки под сам Linux! У нас есть avr-gcc, есть тот же самый GNU Make, плюс к этому нужна программа, которая будет работать с программатором и записывать прошивку в микроконтроллер. В Linux это консольная утилита, конечно же. Например, avrdude.
При помощи этого набора консольных (!) утилит писались проекты, в любом редакторе, в любом IDE. Это было очень удобно, эффективно и красиво.
Но! Мы немного забыли о том, что все это, и использование Linux в первую очередь, сильно имеет крен в сторону профессиональной разработки. Сложно представить какого-нибудь любителя-дачника, который хочет сделать автоматическую поливалку парника, и ради этого начинает учить bash и GNU Make. Естественно, он использует Windows, и там несколько другие подходы. В Windows весьма неудобно работать с набором консольных утилит, да это и не принято, поэтому там мы ставим один такой монстро-GUI-бандл всего, под названием IDE. Вместо божественного Vim! И этот бандл, он как бы, ест ресурсы! И куда менее удобен чем Vim, в качестве редактора кода. Вот этот момент сразу запомним - в Linux у нас упор на консольные утилиты, в Windows нам нужна цельная GUI среда которая делает все. И эта среда будет жирная.
Но есть в embedded сфере еще более серьезная проблема. Вот допустим, вы написали код поливалки парника для Atmega8. А я решил его использовать тоже, но у меня STM32F407. Куда мне засунуть ваш код? То есть - решения получаются непортируемы между разными микроконтроллерами. Даже в пределах одной платформы! А основной принцип программирования нам что говорит - надо переиспользовать код!
И вот тогда, некоторые умные люди взяли и сделали такую штуку как
ARDUINO
Как понять, что это такое? Тут надо немного пошевелить мозгами. Это не совсем то, чем оно кажется с первого взгляда. Вы считаете, что Arduino - это вот такая отладочная платка, UNO, с микроконтроллером AVR на ней? Да, в том числе и она, но смысл то вообще не в этом! Посмотрите как выглядит Arduino UNO - там есть гребенка с пинами GPIO (дискретные входы-выходы), есть гребенка с аналоговыми ножками (входами АЦП), есть ножки UART, SPI, I2C. И (!!!) их расположение на плате - это стандарт! Это де-факто стандарт всей этой сферы. А дальше, есть море всех вот этих плат расширения к Arduino, которые просто втыкаются в эти СТАНДАРТНЫЕ гребенки!
С программной стороны, что это такое? Платформа Arduino - это набор C++ библиотек, предоставляющий СТАНДАРТНЫЙ АБСТРАГИРОВАННЫЙ ОТ РЕГИСТРОВ API для работы с вот этими вот СТАНДАРТНЫМИ ножками Arduino!
А теперь - фокус-покус! Зачем все это нужно нам? Представьте теперь, что я не хочу микроконтроллер Atmega328, а хочу STM32F411, который на порядок круче. Но - при этом я хочу втыкать в него все эти мириады плат расширения, которые понаделали для Arduino. И я хочу брать драйверы для всех этих плат, которые УЖЕ написали для Arduino. Удобно же? Но как это возможно? Микроконтроллер вообще другой!
И вот тут, еще более умные люди, чем те, кто придумал Arduino изначально (а может и они сами, я не вникал), посмотрели внимательно на платформу Arduino и на ее СТАНДАРТ. Ножки, которые есть на гребенках Arduino UNO, есть на всех микроконтроллерах всех платформ! Они есть везде, если это не восьмипиновое чудо, конечно. Но и для него есть варианты.
API платформы Arduino это что? Смотри выше. СТАНДАРТНЫЙ АБСТРАГИРОВАННЫЙ ОТ РЕГИСТРОВ API. Значит, все это может работать на любой аппаратной платформе! Нужно только перенести библиотеки Arduino, реализующие все это, на любую целевую платформу. А дальше, любая программа на C++, которой достаточно вот этого базового СТАНДАРТА, начинает работать на любом микроконтроллере вообще! У нас наконец-то, один и тот же код начинает переноситься между микроконтроллерами. Наступает светлое коммунистическое будущее.
КАК ТЕПЕРЬ ПОНЯТЬ ARDUINO
То есть, современное Arduino - это программная платформа, которая реализует базовый АБСТРАГИРОВАННЫЙ ОТ РЕГИСТРОВ API для всех основных платформ микроконтроллеров. Сюда входит AVR, STM32, ESP32, Raspberry Pi Pico, еще куча всего, в том числе одноплатники с Linux внутри! Да да, смеющиеся над ардуинкой, попуститесь! Эти скетчи, компилируются и работают как приложение линукса. Если у вас такая платформа.
И где-то на задворках всего этого многообразия, есть та самая Arduino UNO с атмегой. Если вы хотите именно ее, то пожалуйста.
А есть, например, такая плата как Nucleo-64. На ней стоит мощный современный микроконтроллер STM32F411, но гребенки… вот сюрприз! Они такие же точно, как у Arduino UNO! То есть все ардуиновские платы расширения втыкаются в нее как в родную.
А ЕСЛИ МНЕ ЭТОГО МАЛО???
И вот он самый главный вопрос человека, знакомящегося с Arduino после 20-летнего опыта хардкор-разработки на регистрах. А если мне мало этого вашего БАЗОВОГО API? Что если мне на STM32F411 надо настроить 6 каналов АЦП в режиме циклического DMA, с запуском преобразования от таймера TIM2, и с периодической вставкой еще 3 инжектированных каналов в этот регулярный набор? ХДЕ В ВАШЕЙ АБДУРИНО ПЛАТФОРМЕ ФУНКЦИЯ КОТОРАЯ ЭТО ДЕЛАЕТ? А? А? А? Как мне через analogRead ардуиновский сделать ВОТ ЭТО?
А никак. Тут нужно понять ключевую, важнейшую вещь! Платформа Arduino работает ПОВЕРХ нативной платформы! Не ВМЕСТО нее, а именно ПОВЕРХ! То есть, функции Arduino внутри себя дергают функции нативной платформы, или регистры, проще говоря. Для STM32 это HAL, для ESP32 это ESP-IDF, и так далее. Для AVR это просто регистры AVR.
То есть, ВСЕ возможности, все функции, все регистры нативной платформы, доступны вам ВМЕСТЕ с API Arduino! Натив никуда не девается! Вы можете прямо в Arduino IDE, прямо в скетче ардуиновском, обратиться к любому регистру, или к любой функции нижележащей платформы! Вы можете ВООБЩЕ не использовать API Arduino в скетче, только натив! Вот это надо ОЧЕНЬ ЧЕТКО ПОНЯТЬ. Если вам не понятно, как продраться через абстракции Arduino, значит просто в этих абстракциях нужных нюансов нет, потому что они платформо-специфичны, а Arduino - это кроссплатформа между микроконтроллерами! Тогда, вы просто берете и напрямую обращаетесь к возможностям нативной платформы. К любым.
Но - если все так хорошо, почему все так плохо? Почему все так хейтят Arduino? Потому что - Arduino IDE. Это фуфло, очень неудачная IDE. И очень жирная. Она все портит, рушит всю красоту. Что же тогда делать? Вспоминаем теперь, что мы на Linux, и у нас - крен в сторону консольных утилит! То есть, мы должны выбросить неудачную IDE, и работать с консольными утилитами, как мы и привыкли.
И, внимание!!! Не обязательно выбрасывать саму платформу Arduino и фигачить на регистрах через avrdude в эти платы, как обычно все деды предлагают! Выборосить надо только IDE. С остальным уже можно работать и извлекать пользу.
На этом закончим с философией, в Части 2 поговорим о практике эффективного применения этой платформы юникс-ветераном.