實驗名稱:
在Raspberry Pi & Pi2 上面學 Linux 驅動程式開發 -- timer --實驗目的:
介紹 timer 在 Linux Kernel 裡面的作用和原理。
使用材料及設備:
硬體: Raspberry Pi B+
軟體: 可編譯 Linux Module 的 Raspbian 系統。
原理介紹:
此範例展示如何在 Linux 核心模組之中使用計時器(timer)來執行程式。如果模組程式之中有需要固定時間之後執行特定程式的需求時,可使用計時器來簡單達成。使用方式和 work queue 類似,不過在初始化計時器資料結構變數的時候需要另外設定等待時間。
程式說明:
程式碼內容:
- -程式碼架構:
此範例模組程式碼的架構只有一個進入點 init_module() 和一個離開點 cleanup_module()。另外和 work queue 的使用方式一樣,我們宣告一個為了和計時器資料結構綁住的函式 timer_function() ,讓計時器在適當的時機去呼叫該函式。程式碼說明:
使用計時器去呼叫指定的函式之前需要宣告一個資料型態為 struct timer_list 的全域計時器變數,這邊我們使用的變數名稱為 my_timer。之後在模組的進入點函式 init_moudle() 裡面使用函式 init_timer() 進行對 my_timer 初始化的工作。而 init_timer() 要傳入的參數為計時器變數的指標:
init_timer(&my_timer);
初始化計時器變數之後,還需要指定等待時間和欲呼叫的函式。指定欲呼叫的函式的指標直接設定給計時器的參數 .function :
my_timer.function = timer_function;
設定計時器的等待時間方式如下:
my_timer.expires = jiffies + HZ;
jiffies 為核心的系統變數,其數值為系統從開機以來到現在總共累計數,其值每經過特定的時間後就會累加一。而上面的 HZ 也是系統變數,其數值為系統每經過一秒鐘 jiffies 會累加的數值。而當系統的 jiffies 值累計至和 my_timer.expires 數值時,系統會去呼叫 my_timer.function() 。所以上面那一行程式碼的設意義為,設定該計數器約一秒過後去執行 timer_function()。
要讓該計數器 my_timer 生效還需要將其註冊進去系統裡面:
add_timer(&my_timer);
而一秒過後, my_timer 就會去呼叫 timer_function()。可以看到 timer_function() 裡面在顯示了一段訊息之後,又執行了下面這一行程式碼,其功用在於修改 my_timer 的設定觸發時間。計數器在使用時,只需要初始化一次,之後如過要重覆觸發的話,只需要透過函式 mod_timer() 去做修改。:
mod_timer(&my_timer, jiffies + HZ / 2);
而 timer_function() 在結束之時,都會再重新設定 my_timer 的觸發時間為0.5秒之後。所以timer_function() 就會以每0.5秒一次的頻率被 my_timer 給呼叫。
沒有留言 :
張貼留言