(3 5)乙個按鍵所能涉及的 定時器防抖動

2021-08-30 02:30:42 字數 1790 閱讀 1652

/* author: pinus

* creat on : 2018-10-25

* kernel : linux-4.4.145

* board : jz2440(arm9 s3c2440)

通過定時器完成防抖動的總結

除顫嗎。。。能看的應該都懂為什麼,微控制器上不也是常用什麼delay()或者也是定時器進行除顫嗎,避免誤觸唄。

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

上張韋老師的吧

目的:給前面的按鍵程式加上定時器防止按鍵抖動引起的誤差

1、定義乙個定時器結構體

static struct timer_list button_timer;
2、在init函式中初始化這個定時器

static int __init buttons_drv_init(void)

主要是設定定時器超時的處理函式

#define setup_timer(timer, fn, data) \

__setup_timer((timer), (fn), (data), 0)

#define __setup_timer(_timer, _fn, _data, _flags) \

do while (0)

3、定義定時器超時處理函式:

/* handle the timer event */

static void button_expire_timeout(unsigned long unused)

else

ev_press = 1;

wake_up_interruptible(&button_waitq); /*喚醒*/

kill_fasync(&button_async, sigio, poll_in);

}

注意:

裝置描述符是從中斷服務程式中獲得,即irq_pd要從中斷服務程式中獲得(可定義乙個全域性變數)

if(!pindesc) //防止初始化時add_timer後立即執行定時器中斷

return;

防止在init函式中進行addtimer後,系統會馬上執行定時器服務程式,這與我們想要的是不符的

4、修改按鍵中斷服務程式

按鍵中斷服務程式主要負責將到來的中斷推遲10ms執行要進行的動作。

static irqreturn_t buttons_irq(int irq,void *dev_id)

irq_pd = (struct pin_desc *)dev_id; 即獲得裝置描述符

mod_timer 修改定時器目的值,這個值是以jiffies為基準,即現在時刻的值是jiffies,程式要在10ms後進行處理,所以 +hz/200  1hz=1s  

好像只追求實現了,沒講什麼原理,因為我現在也不懂原理,只會用,留個思考以後填坑吧【思考?】

乙個精確的定時器

typedef union large integer longlong quadpart 8位元組整型數 large integer large integer litmp longlong qpart1,qpart2 double dfminus,dffreq,dftim queryperfor...

乙個基於優先佇列的C 定時器

chrono庫類實現 定時器的實現方式有多種,底層實現有雙向鍊錶,最小堆實現以及時間輪。本文以基於最小堆實現乙個簡單的定時器。使用了c 11中實現了priority queue模板,雖然名字中帶有queue,但是實現方式是堆,名字中帶有queue,只是因為使用queue的介面。鍊錶是一種簡單的資料結...

iOS 在每乙個cell上新增乙個定時器的方案

1 首先建立乙個陣列,用來建立所有的定時器的時間 nsmutablearray totallasttime return totallasttime 2 當從網路請求過來時間之後,迴圈遍歷,行數和時間作為key,將值作為value放進字典中放進陣列 所有剩餘的時間 lasttime for int ...