Код: Выделить всё
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
}
Для начала давайте отойдём от 4 байтных значений, и уменьшим до одного байта. Смысла это не меняет, от слова совсем.
Допустим, сейчас функция вернула нам значение 253, а мы вызвали таймер с параметрами 250 и 20, т.е еще 17 милс осталось.
Что происходит в нашем случае?
Ответ для : if (currentTime>= startTime) {return (currentTime>=(startTime + period));}
Подставляем: if (253>= 250) {return (253>=(250 + 20));}, а т.к. 250 + 20 = 14, 253>=14, то мы получим истину!!! хотя время ещё не прошло!!!!
Вот именно здесь и происходит злая шутка с переходом через максимум!!!!
Ну нельзя прибавлять в ситуациях, когда число не бесконечно.
Как проверяют пройденное расстояние по простому одометру ? правильно, от того, сколько сейчас,
отнять сколько было при старте. даже если перед этим были все 9, кроме последней!
Просто единицу, которая "невидима" в "старшем" разряде мы игнорируем при подведении итога!
Возьмём альтернативу, которой я всегда заменяю штатную функцию.
Код: Выделить всё
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime = millis();
return (period <=(currentTime - startTime));
}
далее, через некоторое время, когда прошло "переполнение"
20 <= 10 - 250 - false, т.к. 10-250= 16!!!!
для неверующих приводил примеры, даже для ардуино скетч. попробуйте на win каркуляторе в режиме програмист, наконец.
Неужели я долбоящер? Если да, то нечего мне тут делать, наверное...