Ускорение ардуины или оптимизация кода?

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
Добрый день ребят. Я тут на просторах ютуба случайно нарвался на одно видео по ускорению ардуинки. Сначала подумал что это чепуха (нельзя впихнуть невпихуемое). Но при просмотре видео информация из ролика меня заинтересовала. Я думаю что ее можно скорее отнести к оптимизации кода (причем существенного!), чем к ускорению. Как думаете,имеет "право на жизнь" эта информация?

 

Сотнег

★★★★★★★
15 Янв 2020
4,365
1,494
@Leon111_09,
такое бывает, если вызов этой функции заменять на 1 строчку кода.
C-like:
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;
}
На
C-like:
PORTB |= (1<<7);
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
@Сотнег, Я это понял.Думаю,что за счет этой функции можно существенно сократить размер скетча. И,благодаря этому, расширить возможности более "мелких" мк.Типа тиньки и ей подобных мк.
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
только если какой-то мелкий скетч.
Я недавно (сравнительно недавно :)) сделал по проекту Алекса прогнозиста погоды на серве+ардуинка. Он там использовал 328-ю ардуинку. Я впихнул,точнее он (проект) влез в 168-ю. А сегодня подумал что если использовать эту функцию то можно было бы впихнуть и в 8-ю мегу.Что и уменьшило бы место и снизило бы расходы. В общем,расширило бы возможности других "невпихуемых" проектов в такие МК.
 

poty

★★★★★★✩
19 Фев 2020
3,230
940

@Leon111_09, код это не уменьшит, практически. Стандартные функции подгружены заранее и не уберутся даже если их не использовать.
Другое дело если не использовать библиотеки, а писать только нужный код.
 
  • Лойс +1
Реакции: Leon111_09

Bruzzer

★★★✩✩✩✩
23 Май 2020
473
133
Стандартные функции подгружены заранее и не уберутся даже если их не использовать.
У меня в IDE 1.8.13 на штатной "Arduino UNO" функция digitalRead убирается если ее не использовать.
Собственно проверил, т.к. сильно удивился - неужели не убираются?
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
473
133
@poty,
По разнице в размере, и по наличию отсутствию digitalRead в листинге lss.
C++:
volatile int vi = 0;
void setup() {
  vi = 0;
  //vi = digitalRead(0);
}
void loop() {
}
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
Стандартные функции подгружены заранее и не уберутся даже если их не использовать.
Компилятор не включает в конечный код неиспользованные функции, иначе простое моргание светодиодом раздувалось бы на огромные размеры.
 

poty

★★★★★★✩
19 Фев 2020
3,230
940

@Геннадий П, это если библиотеки использовать. Стандартные функции к этой категории не относятся.

@Bruzzer, и на сколько размер отличается?
 

bort707

★★★★★★✩
21 Сен 2020
3,056
910
сегодня подумал что если использовать эту функцию то можно было бы впихнуть и в 8-ю мегу.Что и уменьшило бы место и снизило бы расходы. В общем,расширило бы возможности других "невпихуемых" проектов в такие МК.
Народ, о чем сыр-бор? Об этой записи:
Вы что, впервые узнали о возможности оперировать пинами через регистры,?? :)
Вообще-то это очень широко используется в Ардуино-библиотеках.
А еще подобные макросы позволяют адресовать одновременно несколько пинов, чего вы с помощью digitalWrite() вообще никак не сделаете
 
  • Лойс +1
Реакции: Leon111_09

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
97
@Leon111_09,изучайте Си на микроконтроллерах и будет вам счастье)
Нет смысла оптимизировать то,что в принципе не предназначено для каких-то серъезных вещей. Ардуино лишь учебная база для начинающих. Конструктор. Да,легко собрать многие устройства,но они не ваши,ибо Вы просто пользуетесь чужими библиотеками,которые далеко не идеальны. А чаще и вовсе коряво написаны. Только знание Си даёт полную свободу и полёт фантазии.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,407
976
58
Марий-Эл
@Leon111_09, Это в компьютере настольном программисту не нужно знать, что там у него внутри. Да и то не каждому.
Программирование микроконтроллеров начинается с изучения его структуры и понимания как его узлы связаны друг с другом.
А изучение путём соединения плат друг с другом и использование чужих библиотек приведёт только к тому, что Вы просто запутаетесь. Так как половина работать не будет.
 
  • Лойс +1
Реакции: te238s

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
@te238s, @Эдуард Анисимов, Ребят,я это и так знаю.В силу возраста и здоровья мне все равно не светит хорошо изучить Си.Попалась на глаза интересная информация,решил поделиться с такими же как и сам-может кому и пригодится :).
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
Не надо использовать в реальном коде вот такое PORTB |= (1<<7);
Обычно любое действие имеет осмысленное название. Простой пример - допустим взвод 7 бита включает светодиод.
Тогда добавим дефайн - #define LedOn() PORTB |= (1<<7) и можно в тексте не задумываться где там этот светодиод, на каком он бите какого порта.
Если вдруг схема изменится и светодиод будет подключен в другое место - достаточно изменить одну строчку, а не перелопачивать весь текст программы. Можно и не через дефайн, а инлайновой функцией:
static inline LedOn(void) attribute((always_inline));
static inline LedOn(void)
{
PORTB |= (1<<7)
}
В обоих случаях используется как LedOn();
А неиспользуемые функции компилятор выбрасывает - ключик -ffunction-sections при сборке используется. Каждая функция в свою секцию помещается, неиспользуемые же секции линкер выкинет.