zwj512 发表于 2013-5-7 10:29:24

uCOSII中os_tmr时间管理模块(新手理解)

本帖最后由 zwj512 于 2013-5-7 10:32 编辑

功能块:os_tmr
是一个软核定时器,该功能有单独的数据结构OS_TMR data structure。而os_time是实现任务的延时挂起等功能。软核定时器,当定时时间到的时候会调用专门的函数void MyCallback (OS_TMR *ptmr, void *p_arg);实现一定的功能。
该软核定时器有两种模式,一种是单次模式,只定时一次。一种是周期连续模式。
#if OS_TMR_EN > 0u
OS_TMR*OSTmrCreate (INT32U         dly,
                      INT32U         period,
                      INT8U            opt,
                      OS_TMR_CALLBACKcallback,
                      void            *callback_arg,
                      INT8U         *pname,
                      INT8U         *perr)
参数:dly : 就是timeout 也就是溢出时间,等待超时

   Period :周期,若设为周期连续模式,则该参数为每次软核定时的时间

   Opt:选择两种模式,该数为下列的值
         OS_TMR_OPT_ONE_SHOT       The timer counts down only once
         OS_TMR_OPT_PERIODIC       The timer counts down and then reloads itself
Callback:是一个函数指针,当定时时间到的时候,指向我们要调用的函数的地址,而且该函数必须为下列格式。不能自己定义。
void MyCallback (OS_TMR *ptmr, void *p_arg);

callback_arg:传递给函数MyCallback()的参数

pname:    给该定时器起个名字

perr:   调用该定时器时返回的一些信息,为下列值。和前面调用别的模块类似。
      OS_ERR_NONE
      OS_ERR_TMR_INVALID_DLY   you specified an invalid delay
      OS_ERR_TMR_INVALID_PERIODyou specified an invalid period
      OS_ERR_TMR_INVALID_OPT   you specified an invalid option
      OS_ERR_TMR_ISR             if the call was made from an ISR
      OS_ERR_TMR_NON_AVAIL       if there are no free timers from the timer pool
返回值:返回一个指针指向该软核定时器的数据结构。该返回值会被其他的函数调用。

当然创建了定时器,还不能用,必须由BOOLEANOSTmrStart (OS_TMR   *ptmr,
                                                         INT8U    *perr)
来开启该定时器。
Ptmr:就是指向定时器创建函数OSTmrCreate()返回的指针。
Perr: 就是调用该函数返回的一些信息
      OS_ERR_NONE
      OS_ERR_TMR_INVALID
OS_ERR_TMR_INVALID_TYPE    'ptmr'is not pointing to an OS_TMR
OS_ERR_TMR_ISR             if the call was made from an ISR
OS_ERR_TMR_INACTIVE      if the timer was not created
OS_ERR_TMR_INVALID_STATE   the timer is in an invalid state
返回值:OS_TRUE    定时器开启
*       OS_FALSE   开启定时器出错
例子:
定义的被软核定时器调用的函数
voidAppLED3TmrCallBack      (OS_TMR *p_tmr,
                                    void   *p_arg);


创建一个定时器:注意该参数里面的被调用函数,当定时到的时候就会调用该函数,而执行该函数里面的任务。
AppLED3Tmr = OSTmrCreate((INT32U          ) 4,
                        (INT32U          ) 400,
                        (INT8U         ) OS_TMR_OPT_PERIODIC,
                        (OS_TMR_CALLBACK ) AppLED3TmrCallBack,
                        (void         *) 0,
                        (INT8U          *) "LEDTimer3",
                        (INT8U          *) &os_err);

下面是被调用函数的具体实现

voidAppLED3TmrCallBack (OS_TMR   *p_tmr,
                        void   *p_arg)
{
    OSSemPost((OS_EVENT *)AppLED3Sem);
}

最后在函数里开启定时器
status = OSTmrStart(AppLED3Tmr, &os_err);
if (status != DEF_OK) {
                while (DEF_TRUE) {
                ;
          }
页: [1]
查看完整版本: uCOSII中os_tmr时间管理模块(新手理解)