关 闭

新闻中心

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

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

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

  2.2 与相关的函数函数与任务的

  2.2.1创建函数OSTmrCreate

  在创建函数OSTmrCreate的参数中加入优先级参数prio。调用创建函数时,对控制块中的成员变量赋值,并给回调函数数组的相应单元赋值,形式如下:

  OSTmrCallbackTbl [prio].OSTmrCallback = callback;

  OSTmrCallbackTbl [prio].OSTmrCallbackArg = callback_arg;

  OSTmrCallbackTbl [prio].OSTmr = ptmr;

  2.2.2 对定时器任务OSTmr_Task的

  当有定时器定时完成,把定时器优先级写入定时器就绪表中,并根据就绪表前后的值判断时候发送信号量OSTmrSemSignal,以激活回调函数任务。任务OSTmr_Task的流程如图1所示。

OSTmr_Task的流程


图1 OSTmr_Task的流程

  把定时器优先级写入定时器就绪表的代码如下所示:

  if (OSTmrTime == ptmr>OSTmrMatch) {

  prio = ptmr>OSTmrPrio;

  pfnct =OSTmrCall[prio].OSTmrCallback;

  if (pfnct != (OS_TMR_CALLBACK)0) { /*加入定时器回调函数就绪表*/

  OSTmrRdyGrp|= (INT8U)(1 《 (INT8U)(prio 》 0x03));

  OSTmrRdyTbl[prio >> 0x03]|= (INT8U)(1 《 (INT8U)(prio 0x07));

  }

  }

  2.2.3 对定时器停止函数OSTmrStop()的修改

  函数OSTmrStop只需修改与回调函数执行相关的部分即可,例如,case OS_TMR_OPT_CALLBACK_ARG: 部分的代码如下:

  case OS_TMR_OPT_CALLBACK_ARG:

  prio = ptmr>OSTmrPrio;

  pfnct = OSTmrCall[prio].OSTmrCallback;

  if (pfnct != (OS_TMR_CALLBACK)0) {

  ……/*prio加入定时器就绪表*/

  OSTmrCall[prio].OSTmrCallbackArg =(void *)callback_arg;

  OSSemPost(OSTmrSemCallback); /*发送回调函数执行信号量*/

  }else {

  *perr = OS_ERR_TMR_NO_CALLBACK;

  }

  而case OS_TMR_OPT_CALLBACK:部分的代码同上,只是回调函数的参数不需要重新赋值。



评论


相关推荐

技术专区

关闭