- timer 的作用:當時間到時,觸發一個事件;如文本的圖:
- timer 的實作是一條鏈,即當前 tick 到達指定的 timer 時,會觸發該 timer 的
timeout_func
,同時將該 timer 從鏈結移除 - 以上圖為例,當
rt_tick
= 70 時,將會觸發 timer #1 的timeout_func
,並將 timer #1 移除
- 而在新增一個 timer 時,會按照 timeout 的大小排列插入,如圖:
- 我們想要新增一個 timer #4,並希望在 300 個 tick 過後觸發事件,所以 timeout 設為 330(rt_tick + 300)
- 由於 timer 鏈需要由小到大排,所以將 timer #4 插在 #2 與 #3 之間
結構#
File: rtdef.h
426 | /** |
timeout_func
即為 timeout 時會觸發的函式timeout_tick
=init_tick
+ 當前的 system tick
File: timer.c
初始化、建立 timer#
- 在建立一個 thread 時,
_rt_thread_init
會呼叫rt_timer_init
來初始化 timer
靜態記憶體管理#
功能 | 回傳值 |
---|---|
初始化 timer | void |
timer |
*name |
*timeout |
*parameter |
time |
flag |
---|---|---|---|---|---|
timer 結構 | 名字 | timeout function | func 的參數 | timeout 初始 tick | 狀態 |
*parameter |
time |
flag |
---|---|---|
func 的參數 | timeout 初始 tick | 狀態 |
155 | /** |
- 與 thread 類似,使用
_rt_timer_init
完成初始化
68 | static void _rt_timer_init(rt_timer_t timer, |
- 設定 flag 為 decativated,設定 timeout_func、tick、timerlist
動態記憶體管理#
功能 | 回傳值 |
---|---|
建立 timer | timer |
*name |
*timeout |
*parameter |
time |
flag |
---|---|---|---|---|
名字 | timeout function | func 的參數 | timeout 初始 tick | 狀態 |
214 | /** |
- 同樣也是透過
_rt_timer_init
完成動作
刪除 timer#
動態記憶體管理#
功能 | 回傳值 | timer |
---|---|---|
刪除 timer | RT_EOK |
欲刪除的 timer |
246 | /** |
- 透過
_rt_timer_remove
移除鏈結 - 透過
rt_object_delete
移除 timer
靜態記憶體管理#
功能 | 回傳值 | timer |
---|---|---|
刪除 timer | tick 值 | 欲刪除的 timer |
183 | /** |
- 透過
_rt_timer_remove
移除鏈結 - 透過
rt_object_detach
移除 timer
啟動、停止 timer#
Code: rt_timer_start#
功能 | 回傳值 | timer |
---|---|---|
啟動 timer | RT_EOK |
欲啟動的 timer |
277 | /** |
- 如果需要,先停止 timer
304 | RT_OBJECT_HOOK_CALL(rt_object_take_hook, (&(timer->parent))); |
- 設定 timer 的
timeout_tick
315 |
|
- 尋找 timer 正確的位置
如果有一樣的 timeout,將此 timer 插到最後
357 | /* Interestingly, this super simple timer insert counter works very very |
- 接著插入 timer 並啟動
Code: rt_timer_stop#
功能 | 回傳值 | timer |
---|---|---|
停止 timer | RT_EOK |
欲刪除的 timer |
403 | /** |
- 首先將 timer 從鏈結移出,再將 flag 設為
RT_TIMER_FLAG_DEACTIVATED
控制 timer#
功能 | 回傳值 |
---|---|
控制 timer | tick 值 |
timer |
cmd |
*arg |
---|---|---|
欲控制的 timer | 動作 | 根據前面動作的參數 |
438 | /** |
- 如果需要尋找 timer 的值,將
arg
設為init_tick
458 | case RT_TIMER_CTRL_SET_TIME: |
- 如果需要設定 tick,將
init_tick
設為arg
461 | case RT_TIMER_CTRL_SET_ONESHOT: |
- 如果要設定 timer 為一次性的,添加
RT_TIMER_FLAG_ONE_SHOT
的 flag(即為~RT_TIMER_FLAG_PERIODIC
)
464 | case RT_TIMER_CTRL_SET_PERIODIC: |
- 如果要設定 timer 為週期性的,添加
RT_TIMER_FLAG_PERIODIC
檢查 timer#
功能 | 回傳值 |
---|---|
檢查 timer list | void |
476 | /** |