1、git地址
https://github.com/0x1abin/MultiTimer
这是一个软件定时器的扩展模块,代码基于链表设计,我们可以利用一款硬件定时器来扩展出多个软件定时器,项目中使用的demo是liunx平台,我这里展示下无OS的MCU平台下实现软定时器的扩展。
2、组件应用
(1) 使用嘀嗒定时器来作为产生时间基准的时钟源,每1ms产生一个中断。
uint64_t u64SysTick = 0;
void SysTick_Handler(void)
{
u64SysTick++;
}
uint64_t PlatformTicksGetFunc(void)
{
return u64SysTick;
}
(2) 注册定时器模块驱动
MultiTimerInstall(PlatformTicksGetFunc);
(3) 应用定时器模块功能,该定时器是单次定时器,时间到达便会从链表中移除,如果需要循环调用的话,需要在回调里面再次注册定时器。
void exampleTimer1Callback(MultiTimer* timer, void *userData)
{
printf("exampleTimer1Callback-> %s.\r\n", (char*)userData);
MultiTimerStart(timer, 1000, exampleTimer1Callback, userData);
}
void exampleTimer2Callback(MultiTimer* timer, void *userData)
{
printf("exampleTimer2Callback-> %s.\r\n", (char*)userData);
MultiTimerStart(&timer2, 5000, exampleTimer2Callback, userData);
}
MultiTimerStart(&timer1, 1000, exampleTimer1Callback, "1000ms CYCLE timer");
MultiTimerStart(&timer2, 5000, exampleTimer2Callback, "5000ms CYCLE timer");
(4) 主循环调用
while (1)
{
MultiTimerYield();
}
3、应用效果
从日志中看出,误差都相对比较小,误差主要取决于硬件定时器的时钟频率的精度偏差。