uCOSII中os_tmr时间管理模块

     在以前的书中都不会出现这个模块的讲解。自己做个笔记。同时也拿出来和网友讨论。

uCOSIIos_tmr时间管理模块

功能块: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_CALLBACK  callback,

                      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_PERIOD  you 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

返回值:返回一个指针指向该软核定时器的数据结构。该返回值会被其他的函数调用。

 

当然创建了定时器,还不能用,必须由BOOLEAN  OSTmrStart (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   开启定时器出错

例子:

定义的被软核定时器调用的函数

void  AppLED3TmrCallBack        (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);

 

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

 

void  AppLED3TmrCallBack (OS_TMR   *p_tmr,

                          void     *p_arg)

{

    OSSemPost((OS_EVENT *)AppLED3Sem);

}

 

最后在函数里开启定时器

status = OSTmrStart(AppLED3Tmr, &os_err);

if (status != DEF_OK) {

                while (DEF_TRUE) {

                ;

          }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值