Например, на чипе с частотой 16 МГц 32-битный аппаратный таймер переполняется каждые ~72 минуты.
Например, рассмотрим этот код. Тип события не имеет значения, но, например, скажем, что оно устанавливается каким-либо аппаратным прерыванием в процедуре обслуживания прерываний (ISR) в другом месте.
Код: Выделить всё
volatile unsigned long eventTime; // 32-bit unsigned int microseconds
void someISR(){
eventTime = micros();
}
void loop(){
auto now = micros(); // 32-bit unsigned int microseconds
// has event occurred in the last 1s?
if (now - eventTime < 1000000){
// run some code that should only run when we are less than 1s after some event
}
}
Как мы можем отличить этот случай?
Возможные решения:
- Повысьте 32-битные временные метки до 64-битных. Практически это решает проблему, но приводит к более медленным 64-битным операциям и технически не решает логическую ошибку.
- Установите счетчик переполнения. Опять же, хотя это практически решает проблему, оно усложняет задачу и технически не решает проблему, поскольку счетчик переполнения в конечном итоге переполнится.
- Обработайте логику в ISR. Это вызывает другие проблемы, поскольку другие прерывания откладываются внутри ISR. В частности, прерывания, управляющие micros(), откладываются, чтобы функция выдавала неправильные значения во время длительного ISR.
Подробнее здесь: https://stackoverflow.com/questions/799 ... ogic-error
Мобильная версия