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

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
@Сотнег, ну началось в деревне утро. Да , я не понял. Потому что Ваш тест кривой чуть более чем полностью. И я не понимаю смысла такого тестирования. Где всей разницы - дано имя переменной или нет. Причем переменная есть независимо от того, есть ли у нее имя. Зачем тестировать очевидное?
 

Сотнег

★★★★★★★
15 Янв 2020
4,388
1,504
Хотел попытаться объяснить на примере, но что-то пошло не так...
minus1.png
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
Да у Вас все смотрю идет не так. Что меня уже перестает удивлять. Я пишу программы под мк 20 лет и знаю что ничего не знаю. И постоянно учусь чему то. А тут я смотрю принцип другой - осмыслить и принять что то, что идет вразрез с тем что используешь невозможно. Это ардуина так влияет?
Вы этот -1 в исходный пример вставьте. А потом подумайте что же Вы на 1 то уменьшаете. Не переменную ли, хотя у нее имени и нет.
 

bort707

★★★★★★✩
21 Сен 2020
3,064
912
Всем ардуинщикам на...ть на оптимальность, лишь бы светодиод моргал
Не совсем так . Просто в ардуино на первом месте стоит универсальность и переносимость кода, а уже после этого эффективность.
В приведенном вами примере функция map() - более универсальное решение, чем деление на 4 или сдвиг.
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
@bort707, что такое - универсальное? Если мне надо уменьшить разрядность с 10 до 8 бит нужно применять мап которая кроме этого и увеличивать разрядность умеет? Только вот за универсальность придется заплатить. Тормозами и лишним флешем. Два сдвига займут по времени меньше, чем даже только подготовка к вызову функции! Тупо 4 параметра в регистры занести дольше, чем все решение на сдвигах. Кроме того вызов внешней функции ломает стратегию оптимизации компилятора. Тут еще будут потери.
Ну и простыми словами - если мне надо участвовать в гонке, я возьму гоночное авто, а не трактор, хотя он умеет и поля перепахивать, а гоночная машина не умеет.

@poty, я все же сравнил. Код из первого сообщения - 1068 байт.
А вот такой:
C++:
#define LED_1 9
#define LED_2 10
#define TMD 5 // задержка между шагами
void setup() {
  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);

}
uint8_t step = 0;
uint32_t tmr = 0;
void loop() {
  uint32_t time;

  time = millis();
  if (time - tmr > TMD)
  {
    tmr = time;
    analogWrite(LED_1, step);
    analogWrite(LED_2, step + 128);
    step++;
  }
}
1054 байта. Да, 14 байт экономии не много. Но 14 байт там, 14 тут... Ну и быстродействие растет.
 
Изменено:

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
@Эдуард Анисимов,
"
Serial.printanalogRead(POT0)>>2); Это не откомпилируется

Serial.printanalogRead(POT0)/4); Это тоже не откомпилируется. И уже есть ошибка. "
Серьезно?
arduino.png
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
Ну конечно, докопаться до скобок это важно? В сообщении исправленном прямо на форуме. Большинство вот поняли смысл.
 

Forgetweb

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

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

★★★★★★✩
23 Сен 2019
2,413
976
58
Марий-Эл
Мой отец говорил мне в детстве - старайся делать хорошо. Плохо может само получиться.
Перфекционизмом попахивает.
И в конце концов. Нафлудили тонну. И не смогли понять одного. Когда у тебя необходимые данные в процессе разработки могут плавать, сразу круто не напишешь. Приходится применять универсальный метод.
В том, что есть представленные Вами решения и они лучше, я не отрицаю. Но многим это недоступно. На слишком низкой ступени программирования они находятся. Да и то, о чём мы разговаривали, поняли единицы. И эти единицы применяют все уловки для снижения объёма прошивки. Им не нужно об этом рассказывать. Остальные будут использовать методы описанные в статьях.

Если помните, в школе нам говорили, что на "0" делить нельзя. Нельзя извлечь корень из отрицательного числа.
Но в институте нам уже сказали, что это можно делать и показали как.

Так же и здесь. Сайт для начинающих. Им даются универсальные методы. Позже они, кто захочет, узнают о том, что есть и другие методы.

Рассказывать первокласснику как устроен синхрофазотрон, нонсенс.

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

bort707

★★★★★★✩
21 Сен 2020
3,064
912
простыми словами - если мне надо участвовать в гонке, я возьму гоночное авто, а не трактор, хотя он умеет и поля перепахивать
вот именно. Так вот - ардуино это трактор. А вы развели целую дискуссию о том, что трактор плохо подготовлен для Формулы1.
Поймите, вы говорите про оптимизацию хорошие и правильные вещи, но когда вы применете все это к ардуино - получается троллинг.
 

bort707

★★★★★★✩
21 Сен 2020
3,064
912
как сделать прерывание, что бы оно было классом
бред какой-то. Сформулируйте нормально задачу, Эдуард.
Может вы имели в виду, как использовать метод класса как фунцию обработчик прерывания? - это описано многократно.
 

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

★★★★★★✩
23 Сен 2019
2,413
976
58
Марий-Эл
@bort707, Тут бабушка надвое сказала.
Трактор может пахать, а так же формулу обогнать.
Такой опыт есть.
НО !!!
Трактор при трогании с места, на некоторое время уделывает формулу. Вот дальше хуже.

@bort707, Я плохо ориентируюсь в формулировках.
Есть класс. Допустим UART. У него все методы описаны как классы.
Но прерывание статическая функция.
Если UART один, проблем нет. Если их 6, начинается жопа.
Нужно иметь возможность для каждого UART описать прерывание по разному. В одном случае нам нужен FIFO. В другом нужен DMA. В третьем ещё чего нибудь. В код библиотеки лезть нельзя. Поэтому было бы неплохо самому назначать прерывания. Допустим так. UART.setISR(myISR);
Может я сумбурно написал. Если интересно дам ссылку, где это может быть лучше описано.
 
Изменено:

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
@bort707, а что с Ардуино не так? Нормальный компилятор - GCC, язык - обычные плюсы. Да, неудобная среда, отсутствие отладки, но это не мешает писать нормальные, эффективные, не тормозные прошивки. Разруха не в ардуине, а в ардуинщиках. И теперь я понимаю почему - самый глухой тот, кто НЕ ХОЧЕТ слышать.
 

Сотнег

★★★★★★★
15 Янв 2020
4,388
1,504
В итоге - я во всем прав. Компилятор цифрами подтвердил.
Вы опять ничего не поняли...
На последнем сравнительном скриншоте компилятор сообщил нам, что цифре верить нельзя.
 

bort707

★★★★★★✩
21 Сен 2020
3,064
912
@Forgetweb, вы просто ломитесь в открытую дверь. Все, кто понимают в Си - оптимизируют код и без ваших советов. Язык ардуино не накладывает никаких ограничений на автора кода. Кому надо попроще - пишут через ардуинофункции, кому побыстрее - через регистры. За что вы тут агитируете, я вообще не понимаю.

Я хочу сказать, что вы пока вообще не понимаете сути экосистемы ардуино. Она не запрещает и не отвергает оптимизацию, но у нее совсем иные приоритеты. И эти ваши 14 байтов экономии стоят в системе ардуино где на 50м месте по значимости. Прежде чем устраивать революции, вы сначала разберитесь в существующем положении вещей. Например попробуйте написать пакет поддержки ардуино для какого-нить нового мк. Это у вас займет года два даже с вашим 20летним опытом - тогда и приходите.
 

bort707

★★★★★★✩
21 Сен 2020
3,064
912
Но прерывание статическая функция.
Если UART один, проблем нет. Если их 6, начинается жопа.
Никакой жопы. В статической функции делаете массив указателей на все экзепляры Уарт и выполняете для каждого уарта обработчик прерывания из его класса.
Остального в вашем описании не понял, но мне кажется это ключевое.
 

Forgetweb

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

poty

★★★★★★✩
19 Фев 2020
3,237
942

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

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
@poty, пробуйте. Пример как пример. В реальных программах все примерно так же. Но это хотя бы конструктивно - тест, проверка. Такая реакция нормальна.
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
Картинка с другого форума. Даже чертов бот не хочет таскать рояли...
 

Вложения

  • 210 KB Просмотры: 18

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
@Геннадий П, Становится интересно. Ну расскажите как надо было. Куда надо было засунуть объявление.
И что не нравится в том, что одна переменная static, а вторая нет.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
@Forgetweb, Ну да, привык подобные переменные объявлять глобально, до цикла. Да и почему вторая не static? Тут опять же на рояли каждый раз пишут надпись, что это "рояль".