Переполнение в millis(), которого нет. Ардуино


. . . или как я получил пинка от профи, все началось с Определение структуры в библиотеке, но надавали мне именно за проверку переполнения в счетчике millis()

Начинающие, как я, после первого удачного мигания светодиодом при помощи функции delay() пробуют добавить функциональность в алгоритм и тут же сталкиваются с сущностью функции delay() - задержка и этим все сказано. Алгоритм в МК (микроконтроллер) просто останавливает свое выполнение, а мог бы продолжить выполняться и только в определенные моменты времени переходить к тем или иным действиям.

Решается эта проблема конечно же с помощью функции millis()Собственно правильное решение приведено здесь -  Мигаем светодиодом без delay().

Причина правильной работы для меня не была очевидной, поскольку я не знал как срабатывает "-" в МК, поэтому писал дополнительные проверки на переполнение счетчика millis(), но это оказалось абсолютно не нужным.
Другими словами переполнение не влияет на увеличении дельты - это и есть ключ к понимаю!


Пример №1 для uint32_t:
показывается счет выражения "а-b" при переполнении счетчика "а",
"а" условно соответствует millis():



Именно поэтому "if(currentMillis - previousMillis > interval)- отлично работает без контроля переполнения!  


Пример №2 для int:
01#include <Printing.h>
02
03void setup() {
04    Serial.begin(57600);
05    int  a = (digitalRead(3) + 1) * 32760, b = 32760;
06    for (int i = 0; i < 20; i++, a++)  {
07        printf("a=%d  b=%d  (a-b)=%d\r\n", a, b, a - b);
08    }
09}
10void loop() {}
Результат:
01a=32760  b=32760  (a-b)=0
02a=32761  b=32760  (a-b)=1
03a=32762  b=32760  (a-b)=2
04a=32763  b=32760  (a-b)=3
05a=32764  b=32760  (a-b)=4
06a=32765  b=32760  (a-b)=5
07a=32766  b=32760  (a-b)=6
08a=32767  b=32760  (a-b)=7
09a=-32768  b=32760  (a-b)=8
10a=-32767  b=32760  (a-b)=9
11a=-32766  b=32760  (a-b)=10
12a=-32765  b=32760  (a-b)=11
13a=-32764  b=32760  (a-b)=12
14a=-32763  b=32760  (a-b)=13
15a=-32762  b=32760  (a-b)=14
16a=-32761  b=32760  (a-b)=15
17a=-32760  b=32760  (a-b)=16
18a=-32759  b=32760  (a-b)=17
19a=-32758  b=32760  (a-b)=18
20a=-32757  b=32760  (a-b)=19
И опять "if(currentMillis - previousMillis > interval)"работает без контроля переполнения.

  
ЗЫ: Спасибо профи, за то что они есть!



*МК - микроконтроллер

Комментарии

Популярные сообщения из этого блога

Ответы по промбезопасности. А.1. ПБП 115.15 Подготовка и аттестация руководителей и специалистов организаций по основам промышленной безопасности

Ответы по промбезопасности. Б.2.23 ПБ 1223.8 Подготовка и аттестация руководителей и специалистов организаций, эксплуатирующих сосуды, работающие под давлением, на опасных производственных объектах