搜索
bottom↓
回复: 0

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

[复制链接]

出0入0汤圆

发表于 2013-5-7 10:29:24 | 显示全部楼层 |阅读模式
本帖最后由 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_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) {
                ;
          }

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 01:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表