【请教】linux驱动注册后死锁
大家好:
最近在开发一块omap的板子内核代码比较新。遇到一些问题请教一下大家:
我的中驱动中使用了devm_requestthreaded_irq()。我提交了中断处理函数。比如说 xxx_irq
xxx_irq()
{
int a = read_reg();
if(!a)
return IRQ_NONE;
if(a == 1)
input();
if(a == 2)
input()
rerurn IRQ_HANDLED;
}
在这个函数之中其实调用了request_threaded_irq()函数最终调用了__setup_irq()
在__setup_irq中起了一个线程irq_thread,这个线程对应的是调用了我驱动中写的xxx_irq函数。
在irq_thread中有这么两个函数:
handler_fn = irq_forced_thread_fn;
handler_fn = irq_thread_fn;
当我使用第一个force的函数时候,会死锁。开机后37秒内串口没有任何打印,最后打印信息是 no body care 在函数note_interrupt()中有相关信息。但是我调用irq_thread_fn不会死锁。调用devm_requestthreaded_irq()函数时我传递的是IRQF_IRQPOLL参数。
对比
handler_fn = irq_forced_thread_fn;
handler_fn = irq_thread_fn;
连个函数其实就是有一处不一样:local_bh_disable
我的问题是为什么这个disable会引起死锁或者是串口没有打印?
谢谢了
最近在开发一块omap的板子内核代码比较新。遇到一些问题请教一下大家:
我的中驱动中使用了devm_requestthreaded_irq()。我提交了中断处理函数。比如说 xxx_irq
xxx_irq()
{
int a = read_reg();
if(!a)
return IRQ_NONE;
if(a == 1)
input();
if(a == 2)
input()
rerurn IRQ_HANDLED;
}
在这个函数之中其实调用了request_threaded_irq()函数最终调用了__setup_irq()
在__setup_irq中起了一个线程irq_thread,这个线程对应的是调用了我驱动中写的xxx_irq函数。
在irq_thread中有这么两个函数:
handler_fn = irq_forced_thread_fn;
handler_fn = irq_thread_fn;
当我使用第一个force的函数时候,会死锁。开机后37秒内串口没有任何打印,最后打印信息是 no body care 在函数note_interrupt()中有相关信息。但是我调用irq_thread_fn不会死锁。调用devm_requestthreaded_irq()函数时我传递的是IRQF_IRQPOLL参数。
对比
handler_fn = irq_forced_thread_fn;
handler_fn = irq_thread_fn;
连个函数其实就是有一处不一样:local_bh_disable
我的问题是为什么这个disable会引起死锁或者是串口没有打印?
谢谢了
...全文
相关推荐
linux 看门狗驱动
linux 驱动入门,学习看门狗驱动编程
SDIO驱动开发实战:从协议原理到Linux内核框架与调试
在嵌入式系统中,外设通信总线是连接主控与功能模块的桥梁。SDIO作为一种基于SD物理层的高速、低引脚数总线协议,凭借灵活的寄存器和中断机制,被广泛应用于WiFi模组、蓝牙Combo芯片、NFC控制器等场景。其核心操作依赖CMD52单字节寄存器读写和CMD53多字节块传输,以及DAT1信号线上的带内中断机制。与I2C/SPI相比,SDIO驱动需要处理CIS解析、CCCR/FBR寄存器配置、总线占用锁(sdio_claim_host)和DMA对齐等问题,显著增加了驱动开发复杂度。在Linux内核中,借助MMC子
linux驱动开发教程
Linux 设备驱动 Edition 3 By Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman
linux下的驱动程序
基于ATM9200的在linux操作系统下的驱动程序,包括LED、4×4小键盘的驱动程序(中断方式)
S3C2440 linux 看门狗 驱动
有ioremap,裸机改编而来的linux 看门狗字符驱动


