request_threaded_irq與request_irq

經典博文

文章 鏈接 備註
linux中斷申請之request_threaded_irq https://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 ;
    }
}
發佈了83 篇原創文章 · 獲贊 11 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章