當按一次按健時,由於按健有反應時間、有抖動,可能按一次機器感應到幾次,防抖就是讓在按鍵正常反應時間內機器只感應一次按鍵效果,防止誤操作。
當按鍵發生時產生中斷,在中斷服務程式中修改乙個定時器的定時時間為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.定時器...