一、資料結構
核心資料結構為timer wheel
其核心資料結構為
#define tvn_bits (config_base_small? 4 : 6)
#define tvr_bits (config_base_small? 6 : 8)
#define tvn_size (1 <#define tvr_size (1 <#define tvn_mask (tvn_size - 1)
#define tvr_mask (tvr_size - 1)
struct tvec ;
struct tvec_root ;
struct tvec_base ____cacheline_aligned;
其中timerwheel的資料結構為
在 timer wheel 的框架下,所有系統正在使用的 timer 並不是順序存放在乙個平坦的鍊錶中,因為這樣做會使得查詢,插入,刪除等操作效率低下。timer wheel 提供了 5 個 timer 陣列,陣列之間存在著類似時分秒的進製關係。tv1 為第乙個 timer 陣列,其中存放著從 timer_jiffies(當前到期的 jiffies)到 timer_jiffies + 255 共 256 個 tick 對應的 timer list。因為在乙個 tick 上可能同時有多個 timer 等待超時處理,timer wheel 使用 list_head 將所有 timer 串成乙個鍊錶,以便在超時時順序處理。tv2 有 64 個單元,每個單元都對應著 256 個 tick,因此 tv2 所表示的超時時間範圍從 timer_jiffies + 256 到 timer_jiffies + 256 * 64 – 1。依次類推 tv3,tv4,tv5。以 hz=1000 為例,每 1ms 產生一次中斷,tv1 就會被訪問一次,但是tv2 要每 256ms 才會被訪問一次,tv3 要 16s,tv4 要 17 分鐘,tv5 甚至要 19 小時才有機會檢查一次。最終,timer wheel 可以管理的最大超時值為 2^32。一共使用了 512 個 list_head(256+64+64+64+64)。
*上圖表示的不是很明確,實際上為樹形結構。
可以知道時間精度為
1ms
二、演算法
一、資料結構
struct timespec;
表示自1970
年經過的時間
struct timeval ;
表示時間間隔,單位為微妙
union ktime tv;
#endif
};
核心資料結構64bit
typedef u64 cycle_t;表示時鐘源中讀取的型別
二、演算法
hrtime_run_queues
一、資料結構
定時器控制塊(os_tmr)
os_tmr ostmrthl[os_tmr_cfg_max];
os_tmr *ostmrfreelist;
os_tmr_wheel ostmrwheeltbl[os_tmr_cfg_wheel_size];
其中,ostmrthl為靜態分配的所有os_tmr,所有的定時器都包含在這個陣列中。
ostmrfreelist則是空閒列表的表頭,連線著所有的空閒定時器。
和linux中的timer wheel類似,這裡面如下圖所示,各個分組中存放的定時器為,各個定時器對os_tmr_cfg_wheel_size求模得到相同值的定時器在同一組中。
圖 1二、演算法
建立定時器
os_tmr *ostmrcreate
刪除定時器
boolean ostmrdel
獲取下次超時時間
int32u ostmrremainget
獲取定時器狀態
int8u ostmrstateget
啟動定時器
boolean ostmrstart
停止定時器
boolean ostmrstop
針對timer wheel的處理過程如下圖所示。
定時器比較輸出
通道對應的引腳模式要設定成 gpio initstructure.gpio mode gpio mode af pp 因為這個問題弄了三個小時 初始化tim3 設定為輸出比較模式 tim ocinitstructure.tim ocmode tim ocmode pwm2 1 tim ocinits...
定時器輸入捕捉 and 輸出比較
輸入捕捉 如具有此功能的乙個管腳,定時器在內部時鐘的作用下在執行,此時管腳來了個中斷,假如上公升沿吧。在中斷的作用下,定時器停止工作,此時可以讀出定時器的數值,讀出後再開啟定時器,等待下次中斷,再讀取一次定時器數值,二次相減,就可求出二次中斷的間隔時間。類似於 秒錶 的功能。輸出比較 有一暫存器先存...
Mysql 檢視定時器 開啟定時器 設定定時器時間
1.檢視是否開啟evevt與開啟evevt。1.1 mysql evevt功能預設是關閉的,可以使用下面的語句來看evevt的狀態,如果是off或者0,表示是關閉的。show variables like sche 1.2 開啟evevt功能 setglobal event scheduler 1 ...