1. 内核定时器初始化
setup_timer(struct timer_list *timer, void (*function)(unsigned long), unsigned long data);
timer : 定时器结构体 struct timer_list
function: 定时器处理函数
data: 参数
2. 设置定时器的超时时间
timer.expires = 0;
3. 注册内核定时器,将定时器加人到内核动态定时器链表中
add_timer(struct timer_list *timer);
4. 删除定时器
del_timer(struct timer_list *timer);
5. 按键中断修改定时器超时时间(消抖,去毛刺电平)
static irqreturn_t key_irq_handler(int irq, void *dev)
{
/* 产生中断时修改定时器计时停止时间 */
mod_timer(timer, jiffies + HZ/50);
return IRQ_HANDLED;
}
6. 定时器处理函数向APP程序发送SIGIO信号
这里需结合异步通知机制使用,了解异步通知机制的可以看一下这篇博客 睡眠机制_poll机制_fasync异步通知(按键控制LED)
static void key_expire_timeout(unsigned long arg)
{
......
......
kill_fasync(&button_fasync, SIGIO, POLL_IN);
......
......
}
7. 运行效果(按键中断可能短时间内连续触发多次,但最终定时器只会超时一次)