扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

C语言表驱动法在定时任务列表中的应用

03/31 13:38
362
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

嵌入式软件开发中,如果存在硬件定时器不足以支撑软件运行的时候,软件定时器的实现就显得十分有必要了。函数指针可以用于定时任务列表的创建和使用。在这种情况下,对系统的输入是时间的流逝。许多项目无法证明使用实时操作系统的合理性。相反,所需要的只是以预定的时间间隔运行许多任务。这种处理非常简单,如下所示:

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这个数组的内容就可以了,而主循环中的代码不必更改。

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

本科毕业于华南理工大学,现美国卡罗尔工商管理硕士研究生在读,曾就职于世界名企伟易达、联发科技等,多年嵌入式产品开发经验,在智能玩具、安防产品、平板电脑、手机开发有丰富的实战开发经验,现任深圳市云之手科技有限公司副总经理、研发总工程师。