UCOSii中的软件定时器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_35675731/article/details/89387950

       定时器在嵌入式开发中使用的十分广泛,作为流行的实时操作系统,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定时器??

猜你喜欢

转载自blog.csdn.net/qq_35675731/article/details/89387950