Linux字元裝置驅動之定時器去抖動按鍵驅動

2021-08-05 23:26:07 字數 1384 閱讀 9947

當按一次按健時,由於按健有反應時間、有抖動,可能按一次機器感應到幾次,防抖就是讓在按鍵正常反應時間內機器只感應一次按鍵效果,防止誤操作。

當按鍵發生時產生中斷,在中斷服務程式中修改乙個定時器的定時時間為10ms,並從10ms開始重新計數。定時器時間到後產生定時器中斷,按鍵處理放在定時器中斷裡面。這樣當10ms內有多個中斷發生時只有最後乙個中斷起作用,以達到消除抖動的目的。

struct timer_list ;
由 timer_list.data 傳遞,如果需要向 function 傳遞引數時,則應該設定 timer_list.data,否則可以不設定

使用init_timer函式初始化定時器

設定timer_list.function,並實現這個函式指標

使用add_timer函式向核心註冊乙個定時器

使用mod_timer修改定時器時間,並啟動定時器

int mod_timer(struct timer_list *timer, unsigned long expires)
第二個引數為超時時間,怎麼設定超時時間,如果定時為10ms,則一般的形式為: jiffies + (hz /100),hz 表示100個jiffies,jiffies的單位為10ms,即hz = 100*10ms = 1s

struct pin_desc *irq_pindes;

static struct timer_list buttons_timer; /* 定義乙個定時器結構體 */

/* 使用者中斷處理函式 */

static irqreturn_t buttons_irq(int irq, void *dev_id)

return irq_handled;

}/* 定時器處理函式 */

static void buttons_timer_function(unsigned long data)

else

ev_press = 1; /* 表示中斷已經發生 */

wake_up_interruptible(&button_waitq); /* 喚醒休眠的程序 */

/* 用kill_fasync函式告訴應用程式,有資料可讀了

* button_fasync結構體裡包含了發給誰(pid指定)

* sigio表示要傳送的訊號型別

* poll_in表示傳送的原因(有資料可讀了)

*/

kill_fasync(&button_fasync, sigio, poll_in);

} /* 驅動入口函式 */

static int sixth_drv_init(void)

Linux裝置驅動 核心定時器

核心定時器使用 核心定時器是核心用來控制在未來某個時間點 基於jiffies 排程執行某個函式的一種機制,其實現位於 和 kernel timer.c 檔案中。被排程的函式肯定是非同步執行的,它類似於一種 軟體中斷 而且是處於非程序的上下文中,所以排程函式必須遵守以下規則 1 沒有 current ...

Linux裝置驅動開發 核心定時器

1.linux核心定時器是核心用來控制在未來某個時間點 基於jiffies 排程執行某個函式的一種機制,其實現位於 和 kernel timer.c 檔案中。2.被排程的函式是非同步執行的,它類似於一種 軟體中斷 而且是處於非程序的上下文中,所以排程函式必須遵守以下規則 1 沒有 current 指...

linux核心驅動之定時器

運用場景 1.初始化乙個驅動,經過一定的時間再執行乙個特殊動作 2.初始化乙個驅動,之後每隔一定的時間執行乙個特殊動作 定時器工作流程 a.建立timer,編寫定時器處理函式 b.為timer的expires data function賦值 c.呼叫add timer將timer加入列表 d.定時器...