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. 运行效果(按键中断可能短时间内连续触发多次,但最终定时器只会超时一次)
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 【福利周】邀好友共领新人福利,茶具/T恤/游戏鼠标/钢笔“任你选”
嘿,6月末期福利周来啦~ 今日起,邀请好友在51CTO博客成功发布第一篇原创技术文章,你和好友都有福利!(含代码400字以上必有奖) 活动时间 活动时间:6月26日-7月2日(共7天) 活动福利 活动页面:点击此处>>> 累计邀请人数 好友奖…