#define TICKS_PER_SECOND 1000LL
uint64_t tick_count = 0; // monotonic tick counter
uint64_t tick_interval = TICKS_PER_SECOND * 24 * 60 * 60; // ticks for 1 day
uint64_t tick_fire = tick_interval; // time of next callback
void
timer_ISR(void)
{
// advance tick counter
tick_count += 1;
// have we hit the required interval?
if (tick_count >= tick_fire) {
// advance to next interval
tick_fire = tick_count + tick_interval;
// NOTE: doing that first allows the callback function to adjust the
// firing time of the next event
// called once every 24 hours ...
timer_24_hours();
}
}
1条答案
按热度按时间5rgfhyps1#
正如我在前面的评论中提到的,我们想要一个MRE。
但是,24小时对于间隔计时器来说是一个很长的时间。因此,我不认为这可以完全通过定时器硬件来完成,因为定时器比较寄存器[AFAICT]限制为16位。即使在一个中断/秒的情况下,这也是86400(0x 15180)个中断,超过16位
我们将不得不在S/W [用一个“滴答”计数器]中这样做。大多数系统都是这样做的。
这里有一个例子。它假设每毫秒调用一次计时器ISR [调整以适应]: