UCOSiii軟件定時器


1 簡介

   定時器其實就是一個遞減計數器,當計數器遞減到0的時候就會觸發一個動作,這個動作就是回調函數,當定時器計時完成時就會自動的調用這個回調函數。因此我們可以使用這個回調函數來完成一些功能設計。比如,定時10秒后打開某個外設等等,在回調函數中應避免任何可以阻塞或者刪除定時任務的函數。
  如果要使用該軟件定時器的話需要將宏OS_CFG_TMR_DEL_EN定義為1。
  軟件定時器的分辨率由我們定義的系統節拍頻率OS_CFG_TICK_RATE_HZ決定,例如定義為200,系統時鍾周期就是5ms,定時器的最小分辨率肯定就是5ms。但是定時器的實際分辨率 是通過宏OS_CFG_TMR_TASK_RATE_HZ定義的,這個宏的值絕對不能大於OS_CFG_TICK_RATE_HZ。比如我們定義OS_CFG_TMR_TASK_RATE_HZ為100,則定時器的時間分辨率為10ms。有關UCOSIII定時器的函數都在os_tmr.c文件中。

2 軟件定時器的工作模式

  定時器有兩種工作模式:OS_OPT_TMR_ONE_SHOT單次定時器模式和OS_OPT_TMR_PERIODIC周期定時器模式。

2.1 單次定時器模式(OS_OPT_TMR_ONE_SHOT)

  使用OSTmrCreate()函數創建定時器時把參數opt設置為OS_OPT_TMR_ONE_SHOT,就是創建的單次定時器。創建一個單次定時器以后,我們一旦調用OSTmrStart()函數定時器就會從創建時定義的dly開始倒計數,直到減為0調用回調函數並停止。單次定時器的定時器只執行一次。

由圖可知:單次定時器在調用OSTmrStart()函數后開始倒計數,將dly減為0后調用回調函數的過程,到這里定時器就停止運行,不再做任何事情了,我們可以調用OSTmrDel()函數來刪除這個運行完成的定時器。其實我們也可以重新調用OSTmrStart()函數來開啟一個已經運行完成的定時器,通過調用OSTmrStart()函數來重新觸發單次定時器,如下圖所示;

2.2 周期定時器模式

2.2.1 無初始化延時

  使用OSTmrCreate()函數創建定時器時把參數opt設置為OS_OPT_TMR_PERIODIC,就是創建的周期定時器。當定時器倒計數完成后,定時器就會調用回調函數,並且重置計數器開始下一輪的定時,就這樣一直循環下去.如果使用OSTmrCreate()函數創建定時器的時候,參數dly為0的話,那么定時器在每個周期開始時計數器的初值就為period。


 

2.2.2 有初始化延時

  在創建定時器的時候也可以創建帶有初始化延時的,初始化延時就是OSTmrCreate()函數中的參數dly就是初始化延遲,定時器的第一個周期就是dly。當第一個周期完成后就是用參數period作為周期值,調用OSTmrStart()函數開啟有初始化延時的定時器

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM