linux核心軟體定時器
1.linux核心描述定時器使用的資料結構
struct timer_list ;
如何使用核心定時器?
1.分配定時器物件
struct timer_list mytimer;
2.初始化定時器物件
init_timer(struct timer *timer);
函式功能:初始化定時器
引數:分配的定時器物件指標
注意:這個函式不會初始化expires,function,data這個三個字段,這三個字段需要程式設計師自己去指定,例如:
init_timer(&mytimer);
mytimer.expires = jiffies + 5*hz
mytimer.function = mytimer_funtion;
mytimer.data = (unsigned long)&mydata;
3.向核心新增註冊定時器
add_timer(&mytimer); //一旦新增完畢,核心就開始對這個定時器進行倒計時!時鐘中斷處理函式每隔10ms檢查一次定時器是否到期,如果到期,核心執行對應的定時器處理函式,並且將定時器進行刪除。
4.刪除定時器
del_timer(&mytimer); //定時器到期,核心會幫你刪除定時器,如果定時器沒到期,可以使用此方法進行刪除。
5.修改定時器的超時時間
mod_timer(&mytimer, jiffies + 2*hz); //設定定時器的超時時間為2秒以後
相當於= del_timer 先將原先定時器刪除
+ expires = jiffies + 2*hz 設定新的超時時間
+ add_timer 重新新增定時器
注意:千萬不能用以上三步驟來實現mod_timer,以上三步驟的執行路徑不是原子的,有可能被打斷!
6.注意:定時器的實現基於軟中斷,所以定時器的處理函式同樣不能進行休眠操作!
7.如果想讓定時器的處理函式重複執行,迴圈執行,只需在定時器處理函式中重新新增定時器即可!
實驗步驟:
insmod mytimer_drv.ko speed = 2000 //2秒閃爍
echo 500 > /sys/module/mytimer_drv/parameters/speed //500ms
毫秒和jiffies轉換:
unsigned long timeout = jiffies + msecs_to_jiffies(500);
unsigned long timeout = jiffies + hz/2;
核心定時器
linux核心2.4版中去掉了老版本核心中的靜態定時器機制,而只留下動態定時器。相應地在timer bh 函式中也不再通過 run old timers 函式來執行老式的靜態定時器。動態定時器與靜態定時器這二個概念是相對於linux核心定時器機制的可擴充套件 功能而言的,動態定時器是指核心的定時器佇...
核心定時器
核心中最終的計時資源是定時器。定時器用於定時器超時處理程式在未來某個特定時間點執行,或者週期性的輪詢硬體的狀態。linux提供了核心定時器完成這類工作。定 時器的只需要執行一些初始化的操作,如 設定乙個超時時間,指定超時要呼叫的函式,然後啟用定時器就可以了。它的處理和工作佇列還是有點類似的。和任務隊...
核心定時器,
ldd3 當定時器執行時 排程該定時器的程序可能正在睡眠,或在其它處理器上執行,或乾脆推出。沒有執行定時器,排程它的程式推出了,定時器該如何?2.6.35。22核心 gcc 4.4.5 include include include include include include include i...