Почему многие не любят Arduino

от автора

Не задумывались ли вы, почему специалисты/профессионалы в области микроконтроллеров и автоматизации относятся к тем, кто работает с Arduino примерно так, как будто они занимаются чем-то не серьёзным, вроде игры в песочнице?


Примерно так же к ардуино относится и мой кот Вася.

Собственно для этого я и сделал видео, где наглядно, при помощи осциллографа, покажу и расскажу, с моей точки зрения почему так. Постараюсь высветлить явные плюсы и минусы темы Arduino:



Для начала, следует сказать, что Arduino это не так уж плохо как может показаться. Именно благодаря ардуино появилось на свет множество самых разных проектов, которые бы так и не воплотились в жизнь, из за очень большого количества информации, которую нужно «переварить» чтобы их реализовать. Ни для кого не секрет что на ардуино делать какие-то устройства значительно проще, да и к тому же быстрее. Именно за этого я и начал увлекаться темой микроконтроллеров. И постепенно я начал перерастать всякие digitalWrite(13, HIGH); и переходить на PORTB = 32;, так как желание повышения производительности моих девайсов возрастало.

Вот так выглядит код обычной «мигалки» на привычном для «ардуинщика» языке:

Открыть спойлер

//Привет geektimes  void setup() {   pinMode(13, OUTPUT); }  void loop() {   digitalWrite(13, HIGH);   delay(1000);   digitalWrite(13, LOW);   delay(1000); } 

image

Я думаю многим знаком этот пример, потому что это классическое упражнение «здравствуй мир», которое призвано максимально снизить порог вхождения в тему программирования микроконтроллеров Arduino.

Давайте же посмотрим как это бы выглядело если мы пошли путём не наименьшего сопротивления используя регистры микроконтроллера:

Открыть спойлер

//Привет geektimes  #include <avr/io.h> #include <util/delay.h>  int main( void ) {   DDRB |= (1 << 5);     // вывод PB5 как выход   while (1) { // вечный цикл, аналог loop()      PORTB &= ~(1 << 5); // низкий уровень на выводе PB5     _delay_ms(1000); // задержка 1000 миллисекунд      PORTB |= (1 << 5);  // высокий уровень на выводе PB5     _delay_ms(1000);   }   return 0; } 

image

Данные примеры потребляют 1030 и 176 байт в Flash, то есть проигрыш в этом плане у ардуиншиков почти в 6 раз. Я специально во втором примере добавил комментарии что какая строчка делает, чтобы упростить понимание происходящего. Да, можно было полностью расписать что да как работает, но моя статья не об этом, так что задаю вам вектор для развития, ардуинщики.

Сейчас речь пойдёт о использовании ресурсов микроконтроллера, которые не безграничны и если их бездумно расходовать то они приведут в лучшем случае к непонятным ругательствам среды разработки, а в худшем — дней разбирательств почему оно корректно не работает, сотни итераций кода в уме, строчка за строчкой, а причиной этого может оказаться мистика срыв стека микроконтроллера.

image

Но давайте вернёмся к нашим баранам среде разработки Arduino IDE.
Обратите внимание на использование памяти в двух примерах, чтобы вам не метаться по страничке вверх вниз, вот два кода на одном скрине:

image

Первое что бросается в глаза — размер кода, если писать на обычном языке Arduino IDE то он выглядит немного компактнее. А если бы я взял какой-то более сложный код, например ReadAnalogVoltage который считывает напряжение на нулевом аналоговом порте пине, преобразует его в вольты и выводит в сериал, если всё это прописать используя регистры микроконтроллера, то получится в несколько раз больше кода. Но в данном случае больше не всегда значит хуже, я бы даже сказал наоборот.

Так же обратите внимание на то, сколько памяти потребляют оба примера, код на языке ардуино «съедает» значительно больше памяти, давайте разберёмся почему так.

В папке среды разработки по пути \hardware\arduino\avr\cores\arduino лежит ядро Arduino, там есть файл wiring_digital.c, где собственно и прописана наша прожорливая функция digitalWrite, и мы встретим там следующие строчки:

void digitalWrite(uint8_t pin, uint8_t val)

void digitalWrite(uint8_t pin, uint8_t val) { 	uint8_t timer = digitalPinToTimer(pin); 	uint8_t bit = digitalPinToBitMask(pin); 	uint8_t port = digitalPinToPort(pin); 	volatile uint8_t *out;  	if (port == NOT_A_PIN) return;  	// If the pin that support PWM output, we need to turn it off 	// before doing a digital write. 	if (timer != NOT_ON_TIMER) turnOffPWM(timer);  	out = portOutputRegister(port);  	uint8_t oldSREG = SREG; 	cli();  	if (val == LOW) { 		*out &= ~bit; 	} else { 		*out |= bit; 	}  	SREG = oldSREG; } 

Вы только посмотрите, сколько работы она делает вместо того чтобы просто задать состояние порта. А сделано это не просто так, так как у ардуино низкий порог вхождения, как я высказался выше, тут присутствуют разные проверки аля «защита от дурака». Например если новичок по глупости забыл задать порт пин как выход, тот не перешёл в состояние Hi-Z и таким образом отпугнул отпугнул его при первой же ошибке, но за это приходиться платить повышены потреблением ресурсов.

А теперь давайте перейдём к осциллографу как я и обещал в начале статьи.

image

У меня есть две идентичные китайские Arduino Pro Mini которые размещены на одной и той же макетной плате, давайте прошьём одну из них «мигалку» только без задержек:

image

Один пример написан на языке ардуино, а второй работает непосредственно с регистрами, смотрим что из этого получилось:

image

Синий луч осциллографа(КАН2) — это обычный ардуиновский код, как можно видеть, частота переключений из логической единицы в логический ноль у жёлтого луча(КАН1) больше:

image

2.67 против 0.094 МГц, разумеется что емкость порта микроконтроллера не даёт получить чистый меандр как в случае кода ардуино, но если присмотреться, то и там фронты далеко не чистые:

image

Получается проигрыш производительности в данном случае — 28 раз. Разумеется что это не значит, что ардуино работает в 28 раз медленнее, но я считаю, что для наглядности, это лучший пример того, за что не любят ардуино.

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

image

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

Должен признаться я и сам «ардуиншик», и работаю по большей с Arduino платами, например копия Pro Mini у китайцев стоит не так уж дорого, разумеется что дешевле «голого» микроконтроллера, но как я уже сказал выше, не всегда находиться время и желание заниматься разводкой платы с нуля, лично проще интегрировать в проект Arduino плату.

Так же я люблю работать из средой разработки Arduino IDE, не взирая на её ограничения и неудобства, она может запуститься сразу, без каких либо настроек, просто скачал ZIP архив, распаковал куда нужно и всё, можно приступать к работе, к тому же занимает не особо много места если сравнивать с более профессиональным софтом, например Atmel Studio. И ещё тут есть одна полезная фишка — автоформатирование(комбинация клавиш Ctrl+T):

image

Разумеется есть такое понятие как «правило хорошего тона», и себя нужно приучивать к этому с самого начала, но если есть такая фитча то почему бы её не пользоваться?

Так же из удобств в Arduino IDE появилась возможность в настройках включать нумерацию строк и сворачивание кода:

image

Последний пункт заметно улучшает навигацию кода и уже немного, но приближает к более профессиональным решениям.

Ещё Arduino IDE, как вы заметили, умеет «переваривать» не только свой язык но и Си и даже ассемблер.

Ссылки:
Всё новое — хорошо забытое старое;

Свежая версия Arduino IDE лежит тут;

Arduino на википедии;

Как экономить память на Arduino?;

Все мои публикации на geektimes.

P.S. Вообщем суммируя написанное в статье и сказанное в видеоролике выше Сергей ПоделкинЦ хотел бы всем пожелать развиваться, ардуино это не предел тех возможностей которые даёт мир микроконтроллеров, правильно же говорит народная мудрость «Век живи — век учись».

А как относитесь к теме Arduino Вы?

Никто ещё не голосовал. Воздержавшихся нет.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

ссылка на оригинал статьи https://geektimes.ru/post/255422/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *