Добрый день, уважаемые читатели! В данной статье порассуждаем о том, как и на чем программировать популярные “сетевые” микроконтроллеры ESP8266 и ESP32. То есть какие IDE (Integrated Development Environment) и фреймворки можно и нужно использовать для создания своих собственных прошивок. Я постараюсь сделать сей обзор максимально непредвзято, дабы вы смогли выбрать для себя максимально подходящий инструмент.
Для кого эта статья? Она предназначена в первую очередь для тех, кто впервые столкнулся с ESP и хочет разобраться, с помощью каких инструментов их можно самостоятельно программировать. Не использовать чужие готовые прошивки, а именно программировать, то есть создавать свои собственные прошивки.
Готовые прошивки
Прежде чем мы перейдем к обсуждению тонкостей программирования, я хотел бы небольшое отступление. Дело в том, что Вам совсем не обязательно учиться программировать, чтобы заставить эту хреновину работать. Существует довольно большое множество готовых прошивок, когда-то и кем-то уже написанных, и очень даже популярных. От Вас потребуется только выполнить необходимые для решения ваших задач настройки. Данная статья совсем не о готовых прошивках, но присмотритесь к списку, возможно это именно то, что Вы искали (приведенный список явно не полный и служит только для предварительного ознакомления):
На этом тему готовых прошивок для ESP на данном сайте считаю исчерпанной полностью, совесть моя чиста, и мы возвращаемся к самостоятельному программированию.
Но это была только присказка, сказка будет впереди…
Инструменты для разработки, терминология
Для тех, кто впервые сталкивается с программированием, давайте чуть-чуть остановимся на необходимых терминах и инструментах для программирования. Для знакомых с программированием МК эту главу можно смело пропустить.
Любые популярные средства для программирования ESP можно разбить на несколько составных частей:
- IDE – собственно редактор кода
- Компилятор – то что переведет ваш код в читаемом языке в машинные коды
- Freamework (платформа), SDK – набор системных библиотек, жестко привязанных производителем к используемому “железу”
То есть IDE != платформа, хотя они и часто связаны.
Если говорить очень упрощенно (да и не совсем правильно), то для того, чтобы построить дом, вам потребуются: чертеж дома (ваш исходный код), компилятор (бригада строителей) и кирпичи и иные стройматериалы (фреймворк, платформа). Об них и проговорим ниже.
IDE
Для того, чтобы писать код, нужен основной инструмент программиста – редактор кода (или какой-либо другой инструмент для программирования). Чаще всего их называют IDE (что расшифровывается как Integrated Development Environment — интегрированная среда разработки) — это программное приложение, которое позволяет разработчикам писать, отлаживать и тестировать код, используя при этом один или сразу несколько языков программирования. IDE, как правило, включает в себя собственно редактор кода, компилятор и, возможно, отладчик (что упрощает процесс разработки программного обеспечения). В принципе, в некоторых языках программирования можно легко и блокнотом обойтись, но для микроконтроллеров это не катит.
IDE могут быть рассчитаны на работу как с одним определенным семейством микроконтроллеров (например: Atmel AVR Studio, CubeIDE, Espressif IDE и т.д.), так и одновременно с самыми разными языками и микроконтроллерами (например: ArduinoIDE, Visual Studio Code и т.д.). Первую группу IDE назовем специализированными, ну а вторую группу IDE вполне можно называть универсальными.
Компилятор
IDE сама по себе не может “заставить” микроконтроллер работать. Процессор не человек, он не понимает слов, он понимает “машинный код” – только свои команды, определенные инженерами на этапе его создания. Для того, чтобы перевести ваш текст, написанный на том или ином языке программирования (исходный код), в понятный процессору двоичный код нужен компилятор или иногда интерпретатор:
- Компилятор (англ. compiler – составитель, собиратель) читает всю программу целиком, делает ее перевод в машинный код и создает законченный вариант программы на машинном языке, который затем загружается в микроконтроллер и выполняется. При каждом новом запуске программы всегда выполняется уже ранее скомпилированный вариант программы.
- Интерпретатор (англ. interpreter – истолкователь, устный переводчик) переводит и выполняет программу строка за строкой. В этом случае при каждом запуске программы интерпретатор заново преобразует ваши строчки в машинный код и исполняет их. Очевидно, что для этого требуется гораздо больше времени и усилий, поэтому на микроконтроллерах применяется редко (а на больших и мощных контуперах – легко, особенно в скриптовых языках программирования).
На процессе компиляции стоит остановить ваше внимание более подробно. В большинстве случаев для ESP32 и ESP8266 используется именно компиляторы.
Процесс перевода человеко-читаемого исходного кода программы (поэтому их ещё часто называют “исходники” или “sources“) называется “компиляцией” или иногда “сборкой” программы. В английском варианте это могут быть “compile” или “build“. Примечание автора: здесь я пошел на сознательное нарушение истины, так как процессы компиляции и сборки несколько отличаются друг от друга – но в контексте данной статьи нам эти отличия не важны; но важно то, что в разных IDE вы можете встретить и то и другое, и это будет примерно одно и то же.
Что ж, допустим исходный код мы успешно (без ошибок) скомпилировали в файл-образ, теперь нам нужно загрузить его в микроконтроллер и заставить выполняться. Собственно процесс записи этого образа в энергонезависимую память устройства часто называется “прожигом” или “прошивкой” или “загрузкой“, а в англицкой терминологии – “upload” или “flash“. Если вам интересно, откуда взялись эти термины, можно почитать здесь. После этого процессор уже может запустить вашу программу, как правило это происходит уже после перезапуска микроконтроллера. Скомпилированную программу тоже часто называют “прошивкой”, поэтому “прошивка” – это может быть и процесс загрузки кода в микроконтроллер и сам скомпилированный код.
Как правило, микроконтроллеры имеют на борту некоторый объем энергонезависимой flash-памяти, который как раз и используется для хранения скомпилированной версии программы, а также для хранения различных “постоянных” данных. Но в случае с ESP не все так просто. Даже “навороченная” ESP32 первого поколения имеет “на борту” всего 448 килобайт ROM, а новые серии (-S, -C) и того меньше. Меньше чем RAM! Ужас!
Но не всё так страшно. Дело в том, что на продукции Espressif для хранения исполняемого кода и данных используется дополнительный чип flash-памяти, который подключен к процессору по шине HSPI, и для этого используются некоторые GPIO, которые вы не можете использовать в своих проектах для чего-то иного. Насколько я понимаю (хотя я глубоко не исследовал эту тему – а зачем?) чип flash памяти может быль либо интегрирован в собственно SoC (embedded), либо распаян снаружи SoC в виде обычной микросхемки (внутри модуля или на плате) – поправьте меня если я ошибаюсь. Поэтому говоря про энергонезависимую постоянную память в случае ESP используют именно термин flash-память, а не ПЗУ/ROM, так как “истинный” ROM используется для немного другого.
Далее загруженную прошивку нужно запустить на выполнение. Делается это автоматически, при следующем запуске микроконтроллера. Для ESP разработчики предусмотрели два варианта – с загрузчиком (bootloader) и без оного. Для чего нужен этот загрузчик? Это специальная мини-программа, которая считывает вашу прошивку из flash-памяти, проверяет её и запускает на выполнение. Она же реализует выбор прошивки и в случае OTA. В большинстве случаев используется именно загрузчик, но в некоторых случаях можно использовать вариант исполнения и без загрузчика (или написать загрузчик самому).
Framework / Платформа / SDK / API
Как правило, только одного редактора (IDE) и компилятора ещё не достаточно для того, чтобы вот так “взять и начать программировать”. Ну то есть можно, но ничего не заработает. Нужен набор неких “системных” библиотек и функций, который предоставит вам базовый функционал, из которого вы начнете строить свою прошивку. Эта часть необходимого инструментария называется либо framework (платформа для разработки приложений), либо SDK (software development kit — набор для разработки программного обеспечения).
Может это не совсем и правильно с академической точки зрения, но в данной статье я буду использовать термины framework, платформа и SDK как взаимозаменяемые, для лучшей читаемости текста (это модное словечко framework хрен выговоришь, и SDK мне больше нравится) – примечание автора.
Иногда SDK можно разделить на несколько разных API (application programming interface), то есть наборов функций или классов на определенную тематику. Даже если вам, кажется, что вы ничего дополнительно не устанавливали в свою IDE, то это совсем не значит, что ни одного фреймворка или SDK там уже не было до вас.
SDK предоставляет вам как программисту такие функции, как:
- как настроить ножку в нужный режим
- как дергать ножкой или читать её состояние
- как отправить пару байт другу по той или иной шине
- как подключить к сети WiFi
- и т.д. и т.п.
Разные SDK / фреймворки предоставляют вам разные языки программирования и разный уровень детализации: например кирпичи или монолитные панели “с завода”. Из панелей стоить быстро и удобно, никто не спорит, но что ни строй – всё равно выходит пятиэтажная хрущевка, жить в которой бывает не очень уютно. Из кирпичиков строить долго и нудно, но можно построить красивый и уютный особняк (и, кстати, никто не запрещает вам заранее “склеивать” кирпичи в панели нужной именно вам формы самостоятельно, и использовать в других проектах быстро и удобно).
А вот что выбрать именно Вам – для этого как раз и задумывалась данная статья. Я попытался сделать обзор-сравнение IDE, максимально отстраняясь от собственных предпочтений, дабы вы могли сделать правильный выбор. Но, поскольку я в данный момент использую только PlatfromIO, мне, возможно, сложно судить об других IDE.