一、使用linux 核心定時器
linux 核心定時器採用系統時鐘來實現, linux 核心定時器使用很簡單,只需要提供超時時間(相當於定時值)和定時處理函式即可,當超時時間到了以後設定的定時處理函式就會執行,和我們使用硬體定時器的套路一樣,只是使用核心定時器不需要做一大堆的暫存器初始化工作。在使用核心定時器的時候要注意一點,核心定時器並不是週期性執行的,超時以後就會自動關閉,因此如果想要實現週期性定時,那麼就需要在定時處理函式中重新開啟定時器。 linux 核心使用 timer_list 結構體表示核心定時器, timer_list 定義在檔案include/linux/timer.h 中。具體步驟:
1、在裝置結構體定義乙個timer_list結構體
/* ad7606裝置結構體 */
struct ad7606_dev
;
在裝置初始化時初始化定時器
/* 初始化timer,設定定時器處理函式,還未設定週期,所有不會啟用定時器 */
init_timer
(&ad7606.timer)
; ad7606.timer.function = timer_function;
//定時中斷函式
ad7606.timer.data =
(unsigned
long
)&ad7606;
return
0;
定時中斷函式
void
timer_function
(unsigned
long arg)
在ioctl中即可控制定時器
static
long
timer_unlocked_ioctl
(struct file *filp,
unsigned
int cmd,
unsigned
long arg)
return0;
}
使用核心定時器的最大缺點是定時精度低,一般最小定時時間為乙個系統節拍週期(通常為100hz),隨著核心公升級,目前已經支援高精度核心定時器,由於本次實驗的核心為3.0.15,雖然有高精度定時器,但仍有缺陷(參考其他博主的),接下來使用epit定時器
二、使用epit定時器
epit 的全稱是: enhanced periodic interrupt timer,直譯過來就是增強的週期中斷定時器,它主要是完成週期性中斷定時的。學過 stm32 的話應該知道, stm32 裡面的定時器還有很多其它的功能,比如輸入捕獲、 pwm 輸出等等。但是 i.mx6u 的 epit 定時器只是完成週期性中斷定時的,僅此一項功能!至於輸入捕獲、 pwm 輸出等這些功能, i.mx6u 由其它的外設來完成。epit 是乙個 32 位定時器,在處理器幾乎不用介入的情況下提供精準的定時中斷,軟體使能以後 epit 就會開始執行, epit 定時器有如下特點:
①、時鐘源可選的 32 位向下計數器。
②、 12 位的分頻值。
③、當計數值和比較值相等的時候產生中斷。
epit定時器實現參考恩智浦的論壇
具體例子參考程式
linux核心中如何使用定時器延時
0.包含標頭檔案 include 1.定義時間結構體變數 static struct timer list kbd timer 2.初始化時間結構體變數 init timer kbd timer 3.指定定時器超時服務函式 void kbd timer handler unsigned long k...
linux中使用定時器
1.使用14號訊號sigalrm,呼叫alarm函式 include include include include include void handle int signum int main int argc,const char argv return 0 每隔3秒向自身傳送乙個sigalr...
linux 核心 核心定時器
一.時鐘中斷概念 1.時鐘中斷由系統的定時硬體以週期性的時間間隔產生,這個間隔 即頻率 由核心根據hz來確定,hz是乙個與體系結構無關的常數,可配置 50 1200 在x86平台上預設值是1000 2.每當時鐘中斷發生的時候,全域性變數jiffies unsigned long 就加1,所以jiff...