2015年4月30日 星期四

在Raspberry Pi & Pi2 上面學 Linux 驅動程式開發 -- timer --

實驗名稱:

在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 給呼叫。






沒有留言 :

張貼留言