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

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

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

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

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

Первое что бросается в глаза — размер кода, если писать на обычном языке Arduino IDE то он выглядит немного компактнее. А если бы я взял какой-то более сложный код, например ReadAnalogVoltage который считывает напряжение на нулевом аналоговомпорте пине, преобразует его в вольты и выводит в сериал, если всё это прописать используя регистры микроконтроллера, то получится в несколько раз больше кода. Но в данном случае больше не всегда значит хуже, я бы даже сказал наоборот. Почему так? Об этом я расскажу ниже.
Так же обратите внимание на то, сколько памяти потребляют оба примера, код на языке ардуино «съедает» значительно больше памяти и давайте сейчас разберёмся почему так.
В папке среды разработки по пути \hardware\arduino\avr\cores\arduino лежит ядро Arduino, там есть файл wiring_digital.c, где собственно и прописана наша «прожорливая» функция digitalWrite, мы встретим там следующие строчки:
Вы только посмотрите, сколько работы она делает вместо того чтобы просто задать состояние порта(как например вот так PORTB = 32;). А сделано это неспроста, так как у ардуино низкий порог вхождения, как я высказался выше, тут присутствуют разные проверки аля «защита от дурака». Например, если новичок по глупости забыл задатьпорт пин как выход, чтобы тот не перешёл в состояние Hi-Z(о котором ещё новичок не подозревает, скорее всего) и таким образом отпугнул его при первой же ошибке. Но за это приходиться платить повышенным потреблением ресурсов, как вы сами видите.
А теперь давайте перейдём к осциллографу, как я и обещал в начале статьи.

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

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

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

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

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

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

Разумеется есть такое понятие как «правило хорошего тона», и себя нужно приучивать к этому с самого начала, но если есть такая фитча то почему бы её не пользоваться?
Ещё из удобств в Arduino IDE появилась возможность в настройках включать нумерацию строк и сворачивание кода:

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

Примерно так же к ардуино относится и мой кот Вася.
Собственно для этого я и сделал видео, где наглядно, при помощи осциллографа, покажу и расскажу, с моей точки зрения, почему так. Постараюсь высветлить явные плюсы и минусы темы 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);
}

Я думаю многим знаком этот пример, потому что это классическое упражнение «здравствуй мир», которое призвано максимально снизить порог вхождения в тему программирования микроконтроллеров 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;
}

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

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

Первое что бросается в глаза — размер кода, если писать на обычном языке 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;). А сделано это неспроста, так как у ардуино низкий порог вхождения, как я высказался выше, тут присутствуют разные проверки аля «защита от дурака». Например, если новичок по глупости забыл задать
А теперь давайте перейдём к осциллографу, как я и обещал в начале статьи.

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

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

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

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

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

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

Разумеется есть такое понятие как «правило хорошего тона», и себя нужно приучивать к этому с самого начала, но если есть такая фитча то почему бы её не пользоваться?
Ещё из удобств в Arduino IDE появилась возможность в настройках включать нумерацию строк и сворачивание кода:

Последний пункт заметно улучшает навигацию кода и уже немного, но приближает, к более профессиональным решениям.
К тому же Arduino IDE, как вы заметили, умеет «переваривать» не только свой язык но и Си и даже ассемблер.
P.S. Вообщем суммируя написанное в статье и сказанное в видеоролике выше, Сергей ПоделкинЦ хотел бы всем пожелать развиваться, ардуино это не предел тех возможностей которые даёт мир микроконтроллеров, правильно же говорит народная мудрость «Век живи — век учись».
Ссылки по теме:
Всё новое — хорошо забытое старое;
Свежая версия Arduino IDE лежит тут;
Arduino на википедии;
Как экономить память на Arduino?;
Все мои публикации на geektimes.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
А как относитесь к теме Arduino Вы?
40.92%Ардуино это круто469
41.8%Толерантно479
11.34%Ардуино это не то, где романтика, запах канифоли, целую ночь разводить плату130
5.93%Ардуино это зло.68
Проголосовали 1146 пользователей. Воздержались 205 пользователей.
