nix.long 于 2017-10-26 18:00:00
重新整理在csdn
0. 异常发生
移植Dthing 到UCOSIII-v3.04.05, 使用UCOS定时器作为调度时标支持. 涉及到定时器接口:
void OSTmrCreate (OS_TMR *p_tmr,
CPU_CHAR *p_name,
OS_TICK dly,
OS_TICK period,
OS_OPT opt,
OS_TMR_CALLBACK_PTR p_callback,
void *p_callback_arg,
OS_ERR *p_err)
CPU_BOOLEAN OSTmrStart (OS_TMR *p_tmr,
OS_ERR *p_err)
CPU_BOOLEAN OSTmrStop (OS_TMR *p_tmr,
OS_OPT opt,
void *p_callback_arg,
OS_ERR *p_err)
创建定时器示意代码:
- 周期性定时器
- 无delay
- 周期性时间为若干毫秒
{
OS_TMR * tmr = NULL;
OS_OPT opt = OS_OPT_TMR_PERIODIC;
OS_TICK dly = 0;
OS_ERR err;
tmr = malloc(sizeof(OS_TMR));
if(tmr == NULL){
//handle exception
return;
}
OSTmrCreate(tmr, "name", dly, period_ms, opt, callback, NULL, &err);
然后启动定时器在各种状态下进行Debug Start/Stop, 然后奇怪的事情发生了:
有时出现等待很久, 定时器都没有超时回调callback的情况
1. 原因在哪?
反复检查参数设置, 阅读各API使用说明, 均未发现接口使用方面的异常, 相关Dthing定时器逻辑层代码在其他操作系统, 诸如win/threadx都能正常的超时响应. 是ucos-iii定时器存在BUG?
顺着这个猜想开始阅读ucos-iii timer源码.
1.1 Timer的状态转换
-
create时, 状态设置为OS_TMR_STATE_STOPPED:
p_tmr->State = (OS_STATE )OS_TMR_STATE_STOPPED; /* Initialize the timer fields */
-
首次start成功后,状态切换到 OS_TMR_STATE_RUNNING:
case OS_TMR_STATE_STOPPED: /* Start the timer */ case OS_TMR_STATE_COMPLETED: p_tmr->State = OS_TMR_STATE_RUNNING; if (p_tmr->Dly == (OS_TICK)0) { p_tmr->Remain = p_tmr->Period;