UCOSii中的软件定时器

 

       定时器在嵌入式开发中使用的十分广泛,作为流行的实时操作系统,UCOSii自然也配备了定时器程序。今天就记录一下使用UCOSii中的软件定时器时的一些理解。

  • 首先放上让人疑惑的两张图。

funcrun

        细心的人可能已经发现了,我的OSTOSTmrCreate函数当中第二个参数period设置为20了,按照我们的想法,这个定时器应该每20个系统节拍执行一次吧,但是在右边的图中,系统节拍数OSTime怎么相差了400!400个节拍是多少秒啊,外部晶振8M,倍频后72M,再8分频到系统时钟为9M,按照正点原子的滴答初始化,一个ucos节拍就是5微妙,400个节拍可是2秒了!!怎么会相差这么多。

  • 那我们就来找找原因

        既然这定时器是在系统节拍这里对不上号,那我么就来找系统节拍的麻烦,我们知道定时器文件时tmr.c,那么有关于它的变量和函数一定包含tmr这三个字母,好,CTRL+F查找,最终找到可疑人物,如下。

tick

      对,就是这个钩子函数,罪魁祸首就是它了,首先看它解释,这个函数在每次系统啪啪时被调用。跟着看下来,有一行代码长这样:

    if (OSTmrCtr >= (OS_TICKS_PER_SEC / OS_TMR_CFG_TICKS_PER_SEC)) {
        OSTmrCtr = 0;
        OSTmrSignal();
    }

 

        这几个变量什么意思啊,看,一个控制系统节拍,每秒ucos啪啪多少次;一个控制定时器,非要让人看着ucos跳多少次才让定时器跳一下。OS_TICKS_PER_SEC / OS_TMR_CFG_TICKS_PER_SEC意思就是告诉定时器,你的定时周期并不是你说了算,你得按照规矩来,如果你想跟着我跳,你就将你的频率调一下子,10到100,200都行。

#define OS_TMR_CFG_TICKS_PER_SEC 10u   /*     Rate at which timer management task runs (Hz)            */
#define OS_TICKS_PER_SEC       	200u   /* Set the number of ticks in one second                        */

       现在我们把OS_TMR_CFG_TICKS_PER_SEC调整一下试试。调整为200吧,跟着系统走,然后串口打印一下。

tick2

        看,正常了吧, 还收不了你了我。

 

  • 更多

        解决了上面的问题,现在我们再来看看定时的问题。我在工程中想要的定时是精确到每一毫秒,但是ucos呢,是跟着系统节拍走的,一般都是几个毫秒为基准,而系统节拍不可能给你做来一毫秒拍一次,任务繁重时拍不了几次就拍死了,我们该怎么办?乖乖的用TIM12345678910JQKA定时器??

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值