我发现使用不同的计时器 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);
}