定时器有两个概念:
1,超时时间:
2,时间到了之后的“处理函数”。
可以在中断处理中,如定时 10ms 后处理确定按键值上报。
产生中断
在中断中加定时器,当遇到 A 中断时加一个 10ms 的定时器,过了 10ms 后就去执行“处理
函数”(确定按键值上报)。因为机械的抖动会非常快,没等到 10ms 后的处理,这时因为 抖动又来了一个中断 B,这时中断 B 把之前的那个定时器修改了。所以 A 中断的定时器就取 消了。最后又来了一个中断 C,同样会修改掉 B 中断的定时器。上图中是假设抖动时产生了 3 个中断,所以对于同一个“定时器”,最终中断 C 的定时器没有被修改,所以 10ms 后由中断 C 的处理函数上报了按键值。最后这个 10ms 是从抖动 C 处开始。
这样 3 个抖动的中断只会导致最后处理一个“上报按键值”(定时器过后的处理函数只会执
行一次)。以上便是用定时器消除抖动的原理。
因为是修改同一个定时器,所以前面的定时又取消,相当于把“闹钟”时间往后调整时,最
终只要响一次闹铃。
使用
一、在入口函数中操作步骤
1、初始化定时器:init_timer(&buttons_timer);
2、设备定时器处理函数:buttons_timer.function = buttons_timer_function;
3、将定时器加到内核:add_timer(&buttons_timer);
当按下按键后--->到中断处理函数“buttons_irq()”中去。
二、在中断函数中操作步骤
1、保存注册中断传进来的参数: irq_pd = (struct pin_desc *)dev_id;
2、修改定时器的超时时间为 10ms:mod_timer(&buttons_timer, jiffies+HZ/100); 3、返回:return IRQ_RETVAL(IRQ_HANDLED);
三、在定时器处理函数中识别各类中断
四、在出口函数中进行注销
del_timer(&buttons_timer);