Linux内核中断

一、相关函数(框架)

        int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char         *name,void *dev)    -> irq:要申请中断的中断号。handler:中断处理函数,当中断发生以后就会执行此中断处理函数,flags:中断标志

name:中断名字,设置以后可以在/proc/interrupts 文件中看到对应的中断名字。
dev :如果将 flags 设置为 IRQF_SHARED 的话,dev 用来区分不同的中断,一般情况下将dev 设置为设备结构体,dev 会传递给中断处理函数 irq_handler_t 的第二个参数。 

二、中断上半部和中断下半部

       中断分成上下两部分的原因:在Linux系统中,是不能中断嵌套的,也就是说在处理A中断时,中断系统是关闭的,如果A中断的处理时间较长的话,就会导致其他中断的相应速度会很慢,导致卡顿的现象,所以就将中断分成了两个部分,上半部不能被中断(主要是处理不费时间的事,费时间的事就利用下面的方式用下半部完成),下半部可以被中断。

        下半部的实现方式有:

        1、软中断

        2、tasklet:中断上半部、下半部的执行过程中,不能休眠,因为这时候是不能调度其他进程的,虽然可以被其他中断给中断。同一个中断的上半部、下半部,在执行时是多对一的关系,即上半部执行多次,下半部执行一次(在下半部没执行完时,又发生了同一个中断);多个中断的下半部(不同的中断),是汇集在一起处理的。

        3、工作队列:中断上半部不能休眠,下半部的执行过程中可以休眠,可以调度其他进程,因为他是利用已有的内线线程(这个内核线程是系统帮我们创建的,一般是 kworker 线程,当使用 schedule_work 这个函数时就会唤醒这个内核线程)来执行这个中断处理函数的,

在工作队列中,经常使用 container_of 这个函数,功能是通过一个结构体的指针反推出包含这个结构体的结构体的指针(就是推出外层结构体的地址),这个函数有三个参数,第一个参数是结构体的指针,第二个是要反推结构体的类型,第三个是结构体在反推结构体中的名字

        4、中断线程化:是通过创建一个新的线程来执行中断处理函数

                出现中断线程化技术的原因:

        总结:下半部要做的事情耗时不是太长 -> tasklet;下半部要做的事情太多并且很复杂 -> 工作队列。先初始化下半部实现的方式,然后在 request_irq 函数中调度,就可以实现上下半部了。还有就是在中断处理中不一定要分成上半部和下半部,能够合理的处理中断就可以了

三、Linux中断系统中重要的数据结构

        在Linux系统中会为每个中断号 irq (这个irq是个软件的中断号,虚拟的中断号)设置一个irq_desc 结构体,所有的irq_desc结构体会用一个数组来存放,而 irq 就是这个数组的下标,gpio_to_irq 这个函数得到的值就是这个irq,是从 hwirq(硬件中断号) 映射到一个软件中断号,可以说软件中断号是一个全局的概念,而hwirq(硬件中断号)在不同的模块中可能一样,比如在gpio模块中的硬件中断号是1~10,在uart模块中也看是1~10,这就需要一个 irq 来区分了。

        在 irq_desc 中有两个重要的结构体:irq_data 和 struct irqaction。

        struct irqaction 结构体中主要存放用户注册的中断处理函数,这个结构体是插在在 irq 对应的那个irq_desc结构体中的struct irqaction下的,如果是共享中断的,还会继续插在链表的后面(这个结构就有点像哈希表了,一个数组,每一项又当做链表头)。出现共享中断时,会执行这个链表上所有struct irqaction中的中断处理函数(所以用户在编写中断处理函数时要写上是不是这个设备产生的中断,不是就返回,继续执行下一个设备的处理函数)。

        irq_data 中又有两个重要的结构体:irq_domain 和 irq_chip

        irq_domain 的作用是存放 hwirq映射到irq 的 函数(map)和映射表,还有就是在设备树中解析设备树的中断属性,提取出 hwirq、type 等信息(xlata函数)

         irq_chip结构体中都是些函数,主要是用来使能中断或者关闭中断等。

这些结构体除了在芯片原厂编写最底层的驱动时才会用到,普通的驱动基本上是用不到的,调API就行。

下面这个博主写的硬件中断号和软件中断号的关系写的挺不错:

Linux 中断控制器(五):中断号映射 - 知乎

 

        (中断重要的数据结构这部分详细的内容可以看韦东山的文档)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值