UCOSIII-v3.04.05 定时器 Bug

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的状态转换

  1. create时, 状态设置为OS_TMR_STATE_STOPPED:

    p_tmr->State          = (OS_STATE           )OS_TMR_STATE_STOPPED;     /* Initialize the timer fields             */
    

  2. 首次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;
    			 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值