понедельник, 18 февраля 2019 г.

Arduino IDE или C/C++?

В этой статье я хочу сравнить среды и средства разработки, выявить их положительные и отрицательные стороны, а так же разобраться, с чего лучше начинать изучать микроконтроллеры.
Многие из тех, кто хочет познакомиться с микроконтроллерами, не знают с чего начать. Какой микроконтроллер выбрать начинающему, какой язык программирования, какую среду разработки? У каждого выбора есть свои плюсы и минусы. Разобраться во всем и сразу невозможно. Чем же руководствоваться при выборе? В первую очередь целью. Достаточно задать себе вопрос "Зачем мне это надо?". Итак, давайте сравним среду разработки Arduino с написанием прошивки для микроконтроллера на C/C++ в Atmel Studio, например.

Неоспоримый плюс Arduino IDE в легкости освоения. Для того, чтоб сделать первый шаг и моргнуть светодиодом, не нужно изучать язык программирования, не нужно изучать архитектуру микроконтроллера и заниматься его инициализацией. Но в этом кроется основной на мой взгляд минус Arduino IDE - нет понимания как работает микроконтроллер, для программиста он остается таким себе "черным ящиком". Столкнувшись с тем, что в реальном времени необходимо работать с большим массивом информации с внешних датчиков и управлять несколькими двигателями, программисту будет трудно написать код так, чтоб все работало точно и безотказно. Например, использовать прерывания по таймеру вместо ардуиновского delay.

В этом есть неоспоримый плюс написания прошивок на C/C++ - понимание работы микроконтроллера, его особенностей и периферии. Это дает возможность использовать микроконтроллер рационально, в большинстве случаев дает прирост производительности, что в свою очередь дает экономию на разрабатываемом приборе. Минус - время на изучение. Чтоб освоить с нуля язык, необходимо время, плюс изучение микроконтроллера. При переходе на другой микроконтроллер - надо изучать новый микроконтроллер, его регистры, периферию. При переходе на другую архитектуру - еще больше времени. С приходом опыта этот минус немного нивелируется и времени на освоение нового уходит все меньше и меньше, ибо ты уже как минимум с половиной из того, что надо изучить, сталкивался в предыдущих микроконтроллерах, но все же требуется некоторый мозговой штурм для изучения нового.

Еще один минус Arduino IDE - это то, как эта среда использует ресурсы микроконтроллера. Если необходимо много всего впихнуть в микроконтроллер или работать в режиме реального времени - то появляются трудности. Проблема решается выбором более мощного контроллера, что в свою очередь несет общее удорожание разрабатываемого прибора. Например, там, где можно было бы обойтись Attiny4313, придется ставить Atmega238. На C/C++ подобная проблема изначально отсутствует, так как среда разработки не добавляет в код то, чего туда не пишет программист, что в свою очередь позволяет более рационально использовать ресурсы микроконтроллера.

Один из плюсов C/C++ - нет фактически никаких ограничений по алгоритмам и кодам, кроме накладываемых ограничений самого микроконтроллера. Из-за этого в среде Arduino IDE очень часто встречаются вставки кода на C, когда гибкости Arduino language попросту не хватает.

Еще один неоспоримый плюс Arduino - множество примеров в свободном доступе. Платформа поддерживает очень большое число различный датчиков и контроллеров, для быстрого запуска нового датчика в большинстве случаев достаточно всего лишь скачать готовую библиотеку под этот самый датчик. Это очень сильно экономит время. Но в этом есть и определенный минус - все то же непонимание, как это все работает. Используя чужие наработки и не вникая в них, до конца не понимаешь, как работает тот или иной датчик.

Это основные плюсы и минусы двух разных подходов. Что касается того, стоит ли полностью отказываться от одного в пользу другого - однозначно нет. Для нормального изучения микроконтроллеров однозначно использовать C/C++, а вот для того, чтоб быстро запустить или проверить новое устройство - Arduino IDE.
В заключение хочу сказать о том, что выбор среды разработки в первую очередь должен давать ответ на вопрос "зачем мне это надо?". Например, что должен знать начинающий программист-микроконтроллерщик? Правильно, микроконтроллеры. С Arduino IDE вряд ли удастся добиться полного знания и понимания с чем работаешь. Но если нужно очень быстро создать прототип устройства, которое в дальнейшем можно будет легко воспроизвести кем угодно - то тут лучше взять ардуино.

Сам же я начинал писать на C/C++, активно пишу и сейчас, и не менее активно использую Arduino IDE. Для примера приведу микроконтроллер Attiny13a - код, написанный для него в Atmel Studio, будет занимать гораздо меньше места, чем тот же код написанный в Arduino IDE. В то же время когда мне пришли с алиекспресс датчики BMP280, для проверки их на работоспособность я использовал Arduino IDE с уже готовой библиотекой для этих датчиков - я потратил гораздо меньше времени, нежели потратил бы разрабатывая свои библиотеки на C в Atmel Studio. Потому я никогда не поддерживал и не буду поддерживать холиваров на тему "что лучше: Arduino language или C/C++?", у каждого способа и метода есть свой неповторимый функционал и назначение. Используя в равной мере оба способа там, где это надо, либо выбирая наиболее подходящий для конкретного случая - можно добиться гораздо лучших результатов, нежели ограничивая себя чем-то одним.