request_threaded_irq与request_irq

经典博文

文章链接备注
linux中断申请之request_threaded_irqhttps://www.cnblogs.com/dirt2/p/5632061.html明确两种方式的优缺点
linux驱动request_threaded_irq()https://blog.csdn.net/gx19862005/article/details/18740705中断原理清晰

实践总结

在wiegand驱动开发过程中,自测试时,一边发送一边接受,那么在发送两个信号间的时间,需要处理完一个中断,否则会出现中断丢失。如果是从wiegand设备接受信号,同样的要求。按照wiegand协议,两个信号间时间是很短的,在开发中刚开始使用request_irq处理中断,系统占用资源稍高,就会出现中断丢失,替换为request_threaded_irq,很好的解决了时效问题。

总结:
request_threaded_irq:中断处理线程化,很好解决高频率的中断响应,类似异步处理
request_irq:类似于同步处理事务,适合非高频率中断响应。

Demo

irqreturn_t irq_thread_handler(int irq, void *dev_id)
{
	st_itech_led_dev* dev = (st_itech_led_dev*)dev_id;
	print_dbg("irq = %d, dev->crtl_irq: %d", irq, dev->crtl_irq);
	if(irq != dev->crtl_irq) {
		return IRQ_NONE;
	}
	dev->occur_irq = true;
	udelay(500);
	dev->irq_result = gpio_get_value(dev->ctrl_gpio);

	print_dbg("gpio_level: %d", gpio_get_value(dev->ctrl_gpio));
	print_dbg("irq_result: %d", dev->irq_result);

	wake_up_interruptible(&led_irq_in_waitq);
	return IRQ_HANDLED;
}

irqreturn_t sensor_irq_handler(int irq, void *dev_id)
{
	return IRQ_WAKE_THREAD;
}

static void init_light_sensor_irq(st_itech_led_dev* dev)
{
	int ret = -1;
	int irq_tmp = gpio_to_irq(dev->ctrl_gpio);
    if (ENXIO == irq_tmp) {
		print_err("get irq num failed.\n");
        return;
    }
	dev->crtl_irq = irq_tmp;
	print_info("request led(%d) sensor irq(%d)", dev->param.num, irq_tmp);

	ret = request_threaded_irq(irq_tmp, sensor_irq_handler, irq_thread_handler,
						IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "light_sensor_irq_up", dev);
    if (ret) {
        print_err("request_threaded_irq irq_rising_handler ERROR!!!\n");
        return ;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值