软件定时器

ucosiii的软件定时器是在系统节拍的基础上分频得到的。

定时器的本质是递减计数器,当计数器减到0时可以触发某种动作执行,这个动作通过回调函数来实现。当定时器计数完成时,定义的回调函数会立即被调用,应用程序可以有任意数量的定时器,ucosiii中定时器的时间分辨率由宏OS_CFG_TMR_TASK_RATE_HZ表示步长,比如一次10ms,那么100次就是1s,单位为Hz默认100Hz

注意:一定要避免在回调函数中使用阻塞调用或可以阻塞或删除定时器任务的函数。阻塞函数是非常耗时的这样不利于系统的效率

使能宏:通过OS_CFG_TMR_EN使能为1;

回调函数:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方法直接调用,而是在特定的时间或条件发生时由另外的一方调用的,用于对事件进行响应。

回调函数是自己编写的每次达到定时器的要求时都会运行一次回调函数。

以下这些函数都不可在中断中调用

OSTmrCreat()创建定时器并制定运行模式  在使用ucosiii的软件定时器必须先声明和创建软件定时器。

OSTmrDel()删除定时器

OSTmrRemainGet()获取定时器的剩余时间

OSTmrStateGet()获取当前定时器状态

OSTmrStop()停止计数器倒计时,软件定时器被停掉之后可也调用OSTmrStart()函数重启,但是重启之后定时器是从头计时,而不是接着上次停止的时刻继续计时。

OSTmrStart()启动定时器计数其中涉及到两个函数OS_TmrUnlink()和OS_TmrLink()如果定时器处于运行状态则用这两个函数分别让定时器脱离定时器列表和插入定时器列表达到重启的效果。所有的的软件定时器都是通过时间轮来实现管理的,定时器轮与时钟节拍列表数组一样,就是有若干个定时器列表组成的数组。



总结:软件定时器是ucosiii操作系统的一种软件性定时器,也就是通过代码实现的具有定时功能的内核机制。它与硬件定时器不同,精准度也无法和硬件定时器想媲美

要使用软件定时器首先要声明一个OS_TMR对象,并通过OSTmrCreat()函数创建软件定时器。软件定时器分OS_OPT_TMR_ONE_SHOT和OS_OPT_TMR_PERIODIC两种类型。前者相当于硬件定时器的突发模式,执行的是一次性定时,定时完成后软件定时器就停止工作,需要再次启动才能再次工作。后者相当于硬件定时器的周期模式,具有周期重载值,可以不断周期工作,不需再次启动。

软件定时器创建完成之后,还需要调用OSTmrStart()函数启动它

OSTmrStop()函数可以停止一个软件定时器定时,但并没有删除,可以调用OSTmrStart()函数启动它,但重启是重新计时,不是紧接着停止的时候继续计时的。

OSTmrDel()将删除定时器,删除之后定时器就不能继续使用了。



使能软件定时器后 在OS_TmrInit()中会根据OSCfg_TmrTaskRate_Hz确定OSTmrUpdateCtr  该值在OSTimeTick()会随着每次的时钟节拍的来临而递减当减到0时,会给OS_TmrTask()发送一个信号量,OS_TmrTask检测到后 OSTmrTickCtr就会自加,并且  p_tmr->Remain--,如果  p_tmr->Remain==0则调用回调函数。



软件定时器最最核心的一点是在底层的一个硬件定时器上进行软件分频,ucosiiiduiying的硬件定时器就是产生时钟节拍的那个定时器。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值