Как надежно и безопасно обнаружить переполнение аппаратного таймера, вызывающее логическую ошибкуC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как надежно и безопасно обнаружить переполнение аппаратного таймера, вызывающее логическую ошибку

Сообщение Anonymous »

Я пытаюсь найти лучший метод для обработки пограничного случая, когда аппаратный таймер срабатывает и переполненное значение генерирует ложное положительное логическое соответствие.
Например, на чипе с частотой 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
}
}
В большинстве случаев этот логический тест верен. Но рассмотрим случай, когда событие не произошло в течение 72 минут, а теперь полностью завершилось и просто проходит событие + 72 минуты. Таким образом, код генерирует ложное логическое совпадение каждые 1 с/71 мин = 0,02%.
Как мы можем отличить этот случай?
Возможные решения:
  • Повысьте 32-битные временные метки до 64-битных. Практически это решает проблему, но приводит к более медленным 64-битным операциям и технически не решает логическую ошибку.
  • Установите счетчик переполнения. Опять же, хотя это практически решает проблему, оно усложняет задачу и технически не решает проблему, поскольку счетчик переполнения в конечном итоге переполнится.
  • Обработайте логику в ISR. Это вызывает другие проблемы, поскольку другие прерывания откладываются внутри ISR. В частности, прерывания, управляющие micros(), откладываются, чтобы функция выдавала неправильные значения во время длительного ISR.


Подробнее здесь: https://stackoverflow.com/questions/799 ... ogic-error
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»