Pull to refresh

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

Reading time5 min
Views103K
Не задумывались ли вы, почему специалисты/профессионалы в области микроконтроллеров и автоматизации относятся к тем, кто работает с 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;
}



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

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

image

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

image

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

image

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

image

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

image

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

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

image

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

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

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

image

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

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

image

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

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

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

Ссылки по теме:

Всё новое — хорошо забытое старое;

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

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

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

Все мои публикации на geektimes.
Only registered users can participate in poll. Log in, please.
А как относитесь к теме Arduino Вы?
40.93% Ардуино это круто467
41.98% Толерантно479
11.22% Ардуино это не то, где романтика, запах канифоли, целую ночь разводить плату128
5.87% Ардуино это зло.67
1141 users voted. 205 users abstained.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
Total votes 40: ↑26 and ↓14+12
Comments157

Articles