定时器在嵌入式开发中使用的十分广泛,作为流行的实时操作系统,UCOSii自然也配备了定时器程序。今天就记录一下使用UCOSii中的软件定时器时的一些理解。
- 首先放上让人疑惑的两张图。
细心的人可能已经发现了,我的OSTOSTmrCreate函数当中第二个参数period设置为20了,按照我们的想法,这个定时器应该每20个系统节拍执行一次吧,但是在右边的图中,系统节拍数OSTime怎么相差了400!400个节拍是多少秒啊,外部晶振8M,倍频后72M,再8分频到系统时钟为9M,按照正点原子的滴答初始化,一个ucos节拍就是5微妙,400个节拍可是2秒了!!怎么会相差这么多。
- 那我们就来找找原因
既然这定时器是在系统节拍这里对不上 ,那我么就来找系统节拍的麻烦,我们知道定时器文件时tmr.c,那么有关于它的变量和函数一定包含tmr这三个字母,好,CTRL+F查找,最终找到可疑人物,如下。
对,就是这个钩子函数,罪魁祸首就是它了,首先看它解释,这个函数在每次系统啪啪时被调用。跟着看下来,有一行代码长这样:
这几个变量什么意思啊,看,一个控制系统节拍,每秒ucos啪啪多少次;一个控制定时器,非要让人看着ucos跳多少次才让定时器跳一下。OS_TICKS_PER_SEC / OS_TMR_CFG_TICKS_PER_SEC意思就是告诉定时器,你的定时周期并不是你说了算,你得按照规矩来,如果你想跟着我跳,你就将你的频率调一下子,10到100,200都行。
现在我们把OS_TMR_CFG_TICKS_PER_SEC调整一下试试。调整为200吧,跟着系统走,然后串口打印一下。
看,正常了吧, 还收不了你了我。
- 更多
解决了上面的问题,现在我们再来看看定时的问题。我在工程中想要的定时是精确到每一毫秒,但是ucos呢,是跟着系统节拍走的,一般都是几个毫秒为基准,而系统节拍不可能给你做来一毫秒拍一次,任务繁重时拍不了几次就拍死了,我们该怎么办的用TIM12345678910JQKA定时器/p>
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!