Что общего у рояля и millis()...

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
@Сотнег,
Это понятно. Но к чему это приводит? таскать рояль дважды. Удивляет меня то, что об этом что - за 10 лет никто не задумался?
Я и написал тут чтоб перестали воспринимать это как глобальную переменную. Это нифига не она. Причем функция еще и 100% содержит критическую секцию внутри. На 8-ми битах точно.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
Удивляет меня то, что об этом что - за 10 лет никто не задумался?
Потому что для этого нужно думать. Задумывались, почему в тот же analogWrite вторым параметром передается не ссылка на переменную, а значение? Ведь при использовании ссылки будет использоваться меньше памяти. Но всем пофиг. Как уже сказал, это обучающая платформа.
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
@Эдуард Анисимов,
Я не видел. Но знаю что для считывания 32 битной volatile переменной на 8-ми битной платформе не обойтись никак. Если знаете иной способ - расскажите.

@Геннадий П, я Вас удивлю - я даже не знал что analogWrite существует ))) Я в Ардуине чайнег. Но вообще передать переменную по значению почти всегда проще и быстрее и памяти меньше требует. В 32 битах все равно, там указатель и значение обычно одной разрядности. А в АВР указатель 16 бит, переменная скорее всего 8. Но это не точно, я про analogWrite только сейчас узнал. Видимо это управление ШИМ или что то подобное. Хотя в ЕСП может и в ЦАП писать.
 

Сотнег

★★★★★★★
15 Янв 2020
4,388
1,504
таскать рояль дважды. Удивляет меня то, что об этом что - за 10 лет никто не задумался?
А а мне вот кажется, что много, кто задумался, и все решили,
что вместо того, чтобы сотни раз впустую создавать (и уничтожать) локальную переменную
не стыдно разок вызвать millis() повторно.
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
@Сотнег,
То есть и переменную создать и еще и функцию дергать пару раз? Переменная создается в любом варианте. А вот функцию вызывают не в любом
 

Сотнег

★★★★★★★
15 Янв 2020
4,388
1,504
@Forgetweb,
я говорил про дополнительную переменную, куда вы предлагаете сохранять значение millis() перед if.
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
@Сотнег,
А как думаете что сравнивается в
if (millis() - tmr > TMD)
? Не указатель же на millis. Т.е. переменная все равно создается. Я даже знаю где - в регистрах с R16 по R19. Да просто попробуйте в пример добавить переменную. Не знаю сильно ли станет короче код, но вот работать будет быстрее точно.
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
@Эдуард Анисимов, ну а зачем писали то сюда? Впрочем тема не совсем об ардуине. Как в фильме - мы не называем район, потому что такая история могла произойти в любом районе(с) Кавказская пленница. Мог наврать, но смысл передан верно.)
 

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

★★★★★★✩
23 Сен 2019
2,413
976
58
Марий-Эл
@Forgetweb, Я отсюда начал. Помогал людям. Ардуину не программировал.
Сейчас никому не помогаю. Уровень предварительной подготовки упал. Скучно стало. Тема заинтересовала.
Такой ответ не вгоняет в когнитивный диссонанс?
 

Сотнег

★★★★★★★
15 Янв 2020
4,388
1,504
переменная все равно создается. Я даже знаю где - в регистрах с R16 по R19. Да просто попробуйте в пример добавить переменную. Не знаю сильно ли станет короче код, но вот работать будет быстрее точно.
Вообще-то нужно посмотреть, не добавит ли дополнительная переменная дополнительный код после компиляции.
По-видимому, нет, не добавит:
millis.png
 

Сотнег

★★★★★★★
15 Янв 2020
4,388
1,504
@Forgetweb,
для того, чтобы понять, зачем tmr = step нужно научиться слушать и понимать не только себя, но и собеседника.
 

Сотнег

★★★★★★★
15 Янв 2020
4,388
1,504
@Эдуард Анисимов,
если заменить повторное использование millis() на обращение к переменной ForgetwebsVAR,
это сэкономит 16 байт скомпилированного кода.

@Forgetweb,
если бы добавление этой переменной добавляло хотя бы байт кода на операции в основной цикл,
тогда за сотню "пустых" повторов исчерпалась бы вся выгода от такой оптимизации.
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
@Сотнег, Вы время с объемом не путаете? Пусть даже добавилось бы 4 байта - как это за сотню повторов исчерпается? Код работать будет быстрее это 100%. То, что он стал еще и короче - приятный бонус, не более.
 

Сотнег

★★★★★★★
15 Янв 2020
4,388
1,504
@Forgetweb,
если бы код основного цикла увеличился,
тогда код в целом начал бы работать медленнее.

Именно для этого я исключил из проверки часть кода,
выполняемую редко (if).
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
@Сотнег, Нет, не верно. Код может стать длиннее и при этом работать быстрее. Самый простой пример - развернуть цикл. А Ваша проверка вообще смысла не имела. Все что сделали - дали имя неявной переменной. И все.
 

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

★★★★★★✩
23 Сен 2019
2,413
976
58
Марий-Эл
Под ЕСП32 соберите. Там моргалка 600кб и 10кб ОЗУ.
Я и не возражаю. Я так понял, там работа идёт под операционкой. А использование операцинной системы под простые задачи то же нонсенс.
Поэтому на этом говне я не работаю. И не использую ядра, где такая мудотня.
 

Сотнег

★★★★★★★
15 Янв 2020
4,388
1,504
@Forgetweb,
к рассматриваемому куску кода это не относится.
Там всего 2 строчки поменяно.
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
@Сотнег, это к любому куску кода не относится. Связи объема и скорости в общем случае нет. Но тестировать нужно все же честно. То есть вместо миллис брать переменную там, где миллис вызывается второй раз.
 

Сотнег

★★★★★★★
15 Янв 2020
4,388
1,504
@Forgetweb,
если вы до сих пор не поняли, почему не было сделано tmr = ForgetwebsVAR; вместо tmr = millis();
то вам лучше в оптимизацию не играть.