/* 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 ...