Multi-Set.ru - Форум - Показать сообщение отдельно - Тойота Дуэт(EJ-VE). Большой расход, норма или родовая травма?!
Показать сообщение отдельно
  #207  
Старый 17.11.2019, 20:18
Zabl Zabl вне форума
advir
 
Регистрация: 19.04.2017
Сообщения: 101
По умолчанию

Всем здоровья ! Времени нет вовремя отвечать. Пожалуй начну с Агнеса и его "сказок".
Агнес, вечные двигателя получаются из за ошибок измерения, а значит невежества измеряющих ! Вы опять не попали. Ардуино не так прост, как кажеться. Сейчас вам покажу, как сделать сказку былью. А вашу быль в 13 вызовов Serial.print в 1 мс, превратить в сказку . Признаюсь честно, озадачили вы меня сильно. Действительно, ваш скетч даёт таки превосходные результаты, далёкие от 1 мс на вызов. В интернете, в двух местах видел значения в районе 1 мс. Так же есть совет не "озадачивать" ком-порт на время большее чем время петли loop(конкретики нет). Так же можно найти утверждение, что сериал.принт сбивает время системного таймера millis(). И всё это правда !
Замечательно, что вы выложили открытый скетч, с комментариями, весьма оригинальный к тому же. Мне потребовался целый день, что бы понять что к чему(вот такой я тормоз). Ваш скетч вполне нормальный, стеснятся не нужно, но вот задачу он выполняет действительно сказочную ! Он измеряет количество вызовов ком порта в первую миллисекунду жизни ардуино. Фактически, ваш скетч живет всего одну мс и умирает. В реальных задачах в ком-порт посылают данные гораздо дольше. Измените ваш код так, что бы он работал гораздо дольше, и вы сами увидите как сказка превращается в быль !
Вот ваш код который я изменил, в меру своей распущенности.
Код HTML:
void setup() { Serial.begin(115200); // задаём скорость порта unsigned long t1 = 1; // эту переменную будем выводить unsigned long t2 = millis(); // хватаем текущее время как есть while (t2 == millis()) { // здесь ничего не делаем, а просто // ждём начало следующей миллисекунды } t2 = millis(); // вот теперь есть почти самое начало миллисекунды t2 = t2 + 10000 ;//добавляем мс в работу петли while (t2 >= millis()) { // выполняем цикл Serial.print (t1++); Serial.print (" "); Serial.println(millis()); } Serial.print("--- End ---"); // действительно, сказочке конец } void loop() { // Тут делать нечего }
В петле три вызова сериал.принт , значит три значения залетает в ком порт. Результаты проверки - в первую мс петля отрабатывает 7 раз по 3 значения = 21 значение за 1 мс(поразительный результат)! Во вторую мс уже 5*3=15 значений. А вот за десять секунд, на скорости 300 бод петля отработает 47 раз = 212 мс на вызов 3-х сериал принт . И ардуино "потеряет" целых 2 секунды своего времени. Проверил на этой скорости один Serial.println (t1++) = 94 раза за 10 сек = 106 мс на вызов одного . И пустой Serial.println (); = 184 вызова за 10 секунд =54 мс на вызов. Скорость работы "петли" с сериал.принт зависит от выбранной скорости передачи, на моей системе максимальная скорость была на 230400 бод и составила 20000 циклов с тремя сериал.принт (=0,5 мс), но начал подтормаживать монитор порта и Ардуино ИДЕ. На скорости 115200 бод вызов 3-х сериал.принт занимает "сказочные" 0,920 мс из интернета и тормозов в работе АрдуиноИДЕ нет. Причём более высокая скорость работает не у всех и не всегда. Так что 1 мс это вовсе не сказка, а суровая реальность ардуино.

Результаты исследования.
скорость передачи Serial.print2.jpg
Ответить с цитированием