中断的一些点

为了支持多个中断控制器的场景,引入了IRQ DOMAIN的概念,一个IRQ DOMAIN对应一个中断控制器。

在使用request_irq()时,因为硬件中断号在系统中并非唯一的,不能准确指示到某个具体中断,所以就有了虚拟中断号的概念,虚拟中断号将所有中断域的硬件中断号进行整合编号,得出唯一的虚拟中断号,供我们使用,映射的过程,和是否使用设备树有关系。当使用设备树时,这个映射的过程会在dts 解析的过程中完成。

设备树的interrupts属性               设备树的interrupts属性_monkey_lqd的博客-CSDN博客_设备树interrupts

以硬核uart1为例:

设备树配置:interrupts = <0 171 4>;

第一个参数代码中断类型:

        IPI:inter-processer interrupt   中断号0~15

        PPI:per processor interrupts    中断号16~31

        SPI:shared processor interrupts  中断号 32 ~32+224

        SGI:software generated interrupts (SGI).

第二个参数:中断连线编号

第三个参数:中断触发类型

代码根据设备树节点node解析获得 虚拟中断号

        intNum = irq_of_parse_and_map(node, 0)

        request_irq(intNum, ...)

中断向量表中

中断名称  中断编号  实际连线编号,前32是特殊中断

uart1       203       171

中断手册提供的是+32后的中断号,在dts中配置应该减去32

request_threaded_irq

int request_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn, unsigned long irqflags, const char *devname, void *dev_id)

handler不是在中断上下文里执行,而是在新创建的线程里执行,这样,该handler非常像执行workqueue,拥有所有work queue的特性,但是省掉了创建,初始化,调度workqueue的繁多步骤。

下边一个实际例子来说明它的应用。在手机平台中,检测耳机的插入一般是通过耳机插孔中机械变化导致一个baseband gpio的电平的变化,在该gpio中断里进行耳机插入处理。但是耳机插入一般都有个抖动的过程,需要消抖处理。最简单的办法是在中断发生后,延时一段时间(例如200ms),然后再检查GPIO状态是否稳定来确定是否有效插入。如果用老的中断方式,不得不用workqueue的方式,你需要在顶半里激活一个delay 200ms的workqueue,然后在workqueue里检查。用线程化的处理方式,你仅仅需要在thread_fn里sleep 200ms,然后在检查即可。看,事情就这么简单!

handler是在发生中断时,首先要执行的code,非常类似于顶半,该函数最后会return IRQ_WAKE_THREAD来唤醒中断线程,也可以返回IRQ_HANDLE不执行中断线程

thread_fn,中断线程,类似中断下半部

irqsflags新增加了一个标志,IRQF_ONESHOT,用来标明是在中断线程执行完再打开该中断,该标志非常有用,否则中断有可能一直在顶半执行,而不能处理中断线程。例如对于gpio level中断,如果不设置该位,在顶半执行完成后,会打开中断,此时由于电平没有变化,马上有执行中断,永远没有机会处理线程。

IRQF_ONESHOT 与 IRQF_SHARED 不能同时使用

当多个设备共享中断时,由于IRQF_ONESHOT会关闭中断线程的中断,而线程一般执行时间会比较长,所以是不允许的

当hardirq函数为NULL时,必须声明IRQF_ONESHOT, 表示threadirq线程中关闭该中断,在某些情况下,这个标志会非常有用

例如:设备是低电平产生中断,而硬中断函数为NULL,如果不使用IRQF_ONESHOT,就会一直产生中断执行NULL函数,中断线程

得不到执行,声明RQF_ONESHOT后,会执行完线程才使能该中断  

曾经踩过的坑

中断函数中不可调用 disable_irq_sync,sync会同步等待中断结果后关闭中断,因此会在中断函数内死等,如果想在中断函数中关闭,需使用disable_irq_nosync

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值