关 闭

新闻中心

EEPW首页>工控自动化>设计应用> μC/OSII中软件定时器的优缺点与改进

μC/OSII中软件定时器的优缺点与改进

作者: 时间:2011-04-18 来源:网络 收藏

  2.2.4 回调函数任务OSTmr_TaskCallback()

  在源文件tmr.c中加入回调函数任务OSTmr_TaskCallback(),根据就绪表中的优先级执行相应回调函数,回调函数任务的结构如下所示:

  static voidOSTmr_TaskCallback(void *p_arg) {……/*变量定义*/

  for (;;){//请求信号量OSTmrSemCallback

  OSSemPend(OSTmrSemCallback, 0, err);

  OSTmr_Lock();/*上锁*/

  while (OSTmrRdyGrp) {

  ……/*从就绪表中得到最高优先级的定时器回调函数*/

  ……/*删除就绪表中的占有位*/

  OSTmr_Unlock(); /*定时器上锁*/

  pfnct = OSTmrCall[prio].OSTmrCallback;

  (*pfnct)((void *)(OSTmrCall[prio].OSTmr),OSTmrCall[prio].OSTmrCallbackArg); /*执行回调函数*/

  OSTmr_Lock(); /*定时器上锁*/

  }

  OSTmr_Unlock();/*定时器解锁*/

  }

  }

  由以上代码可知,访问就绪表时定时器上锁,而执行回调函数时处于定时器解锁状态。如果回调函数执行时间较长,在下一个定时器节拍到来时,定时器扫描任务可以得到及时的执行,当前回调函数执行完成后,可以及时得执行就绪表中最高优先级定时器的回调函数。由此可以看出,高优先级定时器的回调函数得到及时执行,系统的实时性提高。

  实验测试发现,在回调函数任务OSTmr_TaskCallback中,使用任务调度上锁与解锁比使用定时器上锁与解锁(即信号量的请求)执行速度快一些。毕竟回调函数任务的优先级很高(一般仅次于定时器扫描任务OSTmr_Task的优先级),所以使用任务调度锁定比定时器锁定要好一些。当然,还可以使用开关中断的方式对就绪表进行访问,可以根据实际情况选择使用哪种方式。

  3 实验测试

  本次实验使用开发环境IAR 5.30,以基于CortexM3内核的路虎LPC1768开发板作为硬件实验平台[6],对实时操作系统μ2.86进行

  对后的操作系统进行测试,在主函数中创建一个启动任务,在启动任务中创建4个周期定时器(系统中“时间轮”数设为4),赋予不同优先级与定时值,每个定时器控制一个LED的闪烁,启动这4个定时器。在启动函数中创建4个任务,每个任务也是控制一个LED灯的闪烁(利用任务延时),之后启动任务挂起。利用μCSPY插件观察各定时器的运行情况,如图2所示。

软件定时器运行界面


图2定时器运行界面

  经实验测试,系统运行正常,定时器回调函数得到及时的执行,系统实时性得到很大的提高。

  4 结语

  软件定时器后,定时器任务的执行时间确定,仅与同时完成定时的定时器数目有关,对处于就绪表中的定时器回调函数按优先级执行,使高优先级定时器的回调函数得到及时的执行,提高了系统的实时性。


上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭