typedef struct
{
int interval;
void (*proc)(void);
} timer_task;
static const timer_task timer_handler_task[] =
{
{ INTERVAL_16_MSEC, fnA },
{ INTERVAL_50_MSEC, fnB },
{ INTERVAL_500_MSEC, fnC },
...
{ 0, NULL }
};
extern volatile int tick;
void main(void)
{
const timer_task *ptr;
int time;
while (1)
{
if (tick)
{
tick--;
time = computeElapsedTime(tick);
for(ptr=timer_handler_task;ptr->interval!=0;ptr++)
{
if (!(time % ptr->interval))
(ptr->proc)();
}
}
}
}在以上例子中,我们定义了自己的数据类型(timer_task),它仅由一个间隔和一个指向函数的指针组成。然后定义一个timer_task类型的结构体数组timer_handler_task,并使用将要调用的函数列表及其调用间隔对其进行初始化。在main函数中,我们有启动代码,它必须启用一个周期性的计时器中断,该中断以固定的间隔增加易失性变量tick。然后我们进入无限循环。while循环中检查非零刻度值,递减刻度变量并计算自程序开始运行以来经过的时间。然后代码简单地遍历每个任务,查看是否已经执行到该任务的时间,如果是,则通过函数指针调用它。如果你的项目仅包含两个或三个任务,那么应用这个方法就有点大材小用了。但是,如果你的项目有大量定时任务,或者将来可能需要添加其它的任务,那么这种方法是非常不错的。在这里我们要注意的是,一旦你有新的需求,你只需要修改timer_handler_task这个数组的内容就可以了,而主循环中的代码不必更改。
我要赚赏金
