UCOSiii軟體定時器

2022-08-24 17:27:11 字數 1719 閱讀 3927

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()函式開啟有初始化延時的定時器

nrf 軟體定時器

52810的軟體定時器建立在乙個rtc的基礎上,使用乙個rtc計時。rtc作為乙個發動機一直在跑。rtc以tick為單位進行中斷觸發,每增加乙個tick就來一次中斷,中斷到來之後就和佇列預期的tick值比較,如果一樣就執行時鐘handler。所有的時鐘都是按照壓入乙個鐘佇列內進行處理。當create...

設計軟體定時器

在mcu晶元內部,往往硬體定時器的數量是非常有限的,而實際工程中卻需要大量的定時器來輔助完成具體的功能,如果乙個函式占用乙個定時器,那麼顯然不夠用,怎麼辦?思路有2種 1 直接將開源嵌入式作業系統的軟體定時器搬來使用 2 自己設計軟體定時器 這裡我只介紹第二種方法,我們知道,硬體定時器是通過對系統時...

簡單軟體定時器

軟體定時器 在嵌入式開發中,定時器是及其常見的,但考慮到晶元外設資源有限,可以自己寫乙個軟體定時器,應用於對計時不是太嚴格的場合,比如led的閃爍,定時處理某一任務等等。該軟體定時器的原理是基於滴答系統時鐘中斷,在中斷中獲得時間基,該時間基可由使用者自由設定。另外有兩種方式可以實現軟體定時處理功能,...