Я обнаружил, что использование другого API таймера работает лучше для меня. Я создал модуль таймера, который имеет два вызова API:
void timer_milliseconds_reset(unsigned index);
bool timer_milliseconds_elapsed(unsigned index, unsigned long value);
Индексы таймера также определены в заголовочном файле таймера:
#define TIMER_PRINT 0
#define TIMER_LED 1
#define MAX_MILLISECOND_TIMERS 2
Я использую unsigned long int для своих счетчиков таймера (32-разрядных), поскольку это целое число собственного размера на моей аппаратной платформе, и это дает мне истекшее время от 1 мс до примерно 49,7 дней. У вас могут быть 16-битные счетчики таймеров, которые будут давать вам истекшее время от 1 мс до 65 с.
Счетчики таймера являются массивом и увеличиваются аппаратным таймером (прерывание, задача или опрос значения счетчика). Они могут быть ограничены максимальным значением типа данных в функции, которая обрабатывает приращение для таймера без опрокидывания.
/* variable counts interrupts */
static volatile unsigned long Millisecond_Counter[MAX_MILLISECOND_TIMERS];
bool timer_milliseconds_elapsed(
unsigned index,
unsigned long value)
{
if (index < MAX_MILLISECOND_TIMERS) {
return (Millisecond_Counter[index] >= value);
}
return false;
}
void timer_milliseconds_reset(
unsigned index)
{
if (index < MAX_MILLISECOND_TIMERS) {
Millisecond_Counter[index] = 0;
}
}
Тогда ваш код становится:
//this is a bit contrived, but it illustrates what I'm trying to do
const uint16_t print_interval = 5000; // milliseconds
if (timer_milliseconds_elapsed(TIMER_PRINT, print_interval))
{
printf("Fault!\n");
timer_milliseconds_reset(TIMER_PRINT);
}