【IMX6ULL驱动开发学习】17.内核定时器(按键消抖)

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. 运行效果(按键中断可能短时间内连续触发多次,但最终定时器只会超时一次)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HuangChen666/article/details/131676029