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定時器??

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章