[Kernel Driver] 撰寫簡易 Timer 機制
Jul 27th, 2010 by appleboy 參觀者:1,197Views 機器人:114Views
在底層 Linux Kernel 提供了時序(timing)機制,方便驅動程式設計者所使用,核心是依據硬體發出的『計時器中斷』來追蹤時間的流動狀況。我們可以依據 HZ 的值來設計 Delay 機制,讓驅動程式可以每隔固定一段時間啟動或者是發出訊號,也可以利用 Timer 來讓 LED 閃爍變化,在介紹 Timer API 之前,可以先參考 Linux Kernel: 簡介HZ, tick and jiffies 這篇文章,瞭解一些相關名詞,舉例:如果想知道一秒後的 jiffies 時間,可以寫成底下:
#include <linux/timer.h>
#endif
j = jiffies;
/* 一秒之後 */
stamp_1 = j + HZ;
/* 半秒之後 */
stamp_1 = j + HZ/2;
/* 20秒之後 */
stamp_1 = j + 20*HZ;
Timer API 用法
筆記一下自己在寫 BOSCH Sensortec 三軸加速偵測器(BMA150 Sensor) Driver 的時候,遇到底層要回報 input event X,Y,Z 到 Android HAL(Hardware abstraction layer),所以利用 Timer 的機制定時 report 給 Android。
首先宣告:
#include <linux/timer.h>
#endif
/* 定義 timer_list struct */
#ifdef CONFIG_BMA150_TIMER
struct timer_list bma150_report_timer;
#endif
在 Driver 內的 bma150_probe 裡面 call function:
bma150_init_timer();
#endif
撰寫 bma150_init_timer 函式:
static void bma150_init_timer(void)
{
D("BMA150 init_timer start\n");
/* Timer 初始化 */
init_timer(&bma150_report_timer);
/* 定義 timer 所執行之函式 */
bma150_report_timer.function = bma150_report;
/* 定義 timer 傳入函式之 Data */
bma150_report_timer.data = ((unsigned long) 0);
/* 定義 timer Delay 時間 */
bma150_report_timer.expires = jiffies + BMA150_REPORT_DELAY_1;
/* 啟動 Timer*/
add_timer(&bma150_report_timer);
}
#endif
上述 add_timer 執行之後,會在一秒後執行 bma150_report 函式,執行之後就會停止,所以如果要一直產生迴圈,就必須在 bma150_report 裡面繼續加入 add_timer,改寫如下:
{
D("appleboy: test timer. \n");
#ifdef CONFIG_BMA150_TIMER
bma150_report_timer.expires = jiffies + BMA150_REPORT_DELAY_2;
add_timer(&bma150_report_timer);
#endif
return 0;
}
我們可以重新定義 expires 時間 jiffies + BMA150_REPORT_DELAY_2,就可以一直循環了,要離開 Timer 可以在最後加入 deltimer(&bma150_report_timer),最後就完成簡易的 Timer 功能。
參考:
add_timer的使用方法
Linux Kernel: 簡介HZ, tick and jiffies

这篇文章不错,学到很多,感谢 :)