Переполнение Millis - 2

Всем привет! на старом форуме была такая тема, но там уже нельзя задать вопросы, а в новом форуме такой темы не нашёл. Итак, стандартная проблема - millis() или в моём случае micros() обнуляется, но нужно при этом избежать ошибок в выполнении программы. Всё вроде понятно в старой теме, что в проверке if (millis()-prevTime>INTERVAL) отрицательных чисел не будет, сбоя не будет. НО. Интервал то при переходе через ноль в тот самый момент будет неправильный? например prevTime уже в самом конце 4 294 967 295, а millis() только вот стал равен 1 - тут же и сработает условие прямо сразу после предыдущей сработки, а если интервал должен был быть 5 сек, например? Или я чего-то не понимаю?

А вы проверяли? Сейчас проверил на ‘Arduino Nano’. Следующий код выводит результат “2”:

unsigned long prev = 4294967295;
unsigned long current = 1; // = millis()
  
unsigned long diff = current - prev;

Serial.println(diff);

Там переполнение происходит. Ошибка в рантайме при этом не возникает (вероятно, зависит от параметров компиляции).

Чтобы понятнее стало, для наглядности можете запустить обычный виндовый калькулятор, перевести его в программерский режим, сделать там обозначенное выше вычитание, а потом посмотреть на результат в двоичной системе, а именно - какое число там получилось в младших 4-х байтах (в моём Ардуино ‘unsigned long’ занимает 4 байта).

Не проверял, теоретизирую пока. Спасибо, я попробую всё это проверить по Вашим следам :slight_smile: Отпишусь обязательно!

Да, действительно, проверил на ардуино (у меня Mega2560), интересно вычитает эти два числа, выходит и правда интервал не будет нарушаться, всё отлично! в калькуляторе попробовал поставить режим программиста, вычел из единицы 4294967295 (что в двоичном будет 4 байта заполненных единицами), но результат вышел математический, а не такой, как у ардуино

Спасибо Вам большое за объяснения

Нет, это старшие байты заполнены единицами. Посмотрите на младшие. Ну и если интересно в чем суть, поищите какую-нибудь статью про представление целочисленных значений в памяти (в т.ч. отрицательных).

ага, почитаю. Ещё раз большое спасибо!

Нет нет да всплывёт …

Дак обстановка в мире нестабильная, постоянно все с ног на голову переворачивается. Стоит все же, периодически, поверку миллиса проводить.

1 лайк

Назначить дежурного по millis, утвердить график дежурств и инструкцию…

Не, сначала докторская, потом Нобелевка. За вклад в борьбу с переполнением

За вклад в борьбу с переполнением Сталинская премия полагается.

посмертно