1. 程式人生 > >RTX——第17章 定時器組

RTX——第17章 定時器組

logs kill 簡單 也會 不同 支持 思路 由於 重新

本章節為大家講解 RTX 支持的定時器組,或者叫軟件定時器,或者叫用戶定時器均可。軟件定時器的
功能比較簡單,也容易掌握。 被稱為定時器組是因為用戶可以創建多個定時器,創建的個數是可配置的。
定時器組介紹
RTX 提供的定時器功能僅支持單次定時器,也就是用戶創建了定時器並啟動了定時器後,定時時間到
將不再重新執行,此定時器會被刪除掉並且就執行一次,下次使用要重新的創建,這個就是單次定時器的
含義。 另外就是單次定時時間到後會調用定時器的回調函數,用戶可以回調函數中加入需要執行的工程代
碼。
使用此定時器組註意以下問題:
? 定時器回調函數 os_tmr_call 在文件 RTX_Conf_CM.c 文件中。


? 定時器回調函數 os_tmr_call 中僅支持 isr_開頭的系統函數,os_開頭的不支持,因為回調函數是在滴
答定時器中斷中執行的。
? RTX 的定時器僅支持單次,不支持周期性執行,如果需要周期執行,需要重復創建。
? 可以創建的定時器個數可以在 RTX 配置向導中設置:
技術分享

定時器組 API 函數
使用如下 3 個函數可以實現 RTX 的定時器組:
? os_tmr_create
? os_tmr_kill
? os_tmr_call

技術分享

函數 os_tmr_create
函數原型:
OS_ID os_tmr_create (
U16 tcnt, /* 定時器的時鐘節拍個數 */
U16 info ); /* 定時器回調函數的參數,可用於區分不同的定時器 */
函數描述:
函數 os_tmr_create 用於創建定時器組並啟動定時器,定時時間到後調用回調函數 os_tmr_call。函數
os_tmr_create 的第二個參數也會傳遞給回調函數 os_tmr_call 用於區分不同的定時器。
? 第 1 個參數填寫定時器的時鐘節拍個數。 範圍 0-0xFFFF。
? 第 2 個參數填寫回調函數的參數,可用於區分不同的定時器。
? 定時器創建成功的話會返回定時器的 ID 標識,失敗的話返回 NULL。

函數 os_tmr_call
函數原型:
void os_tmr_call (
U16 info ); /*定時器回調函數的參數,可用於區分不同的定時器*/
函數描述:
當函數 os_tmr_create 設置的定時時間到後調用回調函數 os_tmr_call。函數 os_tmr_create 的第二個參
數也會傳遞給回調函數 os_tmr_call 用於區分不同的定時器。此函數執行完畢後,通過函數 os_tmr_create
創建的定時器會被刪除,下次使用需要重新創建。
? 此函數的參數不需要用戶去添加,系統會自動將函數 os_tmr_create 第二個參數賦值給這個參數。
技術分享

代碼練兵場:

先說一下代碼的整體設計思路:

首先, 通過按鍵1設置定時器1,定時5s,按鍵2設置定時器2,定時1s。由於RTX的軟件定時器不支持周期性定時,所以需要周期性定時就需要重復創建。

然後在回調函數中,如果是定時器1,就發送消息,有其他任務接收的,如果是定時器2,就打印定時器2這個字符串。

技術分享

技術分享

技術分享

技術分享

註意回調函數在(我們創建的信號量初始化為0,你就應該猜測到肯定有一個地方需要發送消息的,註意回調函數中使用RTX系統函數必須是isr開頭的不能是os開頭的,因為回調函數是在滴答定時器中斷中執行的 ):

技術分享

串口輸出如下:

技術分享

題外話:這樣來看,還是freertos和ucos更強大一點,居然連周期性定時器都不支持。

RTX——第17章 定時器組