Linux中断
程序员文章站
2022-03-10 13:05:48
Linux中断Linux 内核将中断分为上半部和下半部的主要目的就是实现中断处理函数的快进快出,那些对时间敏感、执行速度块的操作可以放到中断处理函数中,也就是上半部。剩下的所有工作都可以放到下半部去执行,比如在上半部将数据拷贝到内存中,关于数据的具体处理就可以放到下半部去执行。参考点:如果要处理的内容不希望被其他中断打断,那么可以放到上半部。1.如果要处理的任务对时间敏感,可以放到上半部。2.如果要处理的任务与硬件有关,可以放到上半部。3.除了上述三点以外的其他任务,优先考虑放到下半部。...
Linux中断
- Linux 内核将中断分为上半部和下半部的主要目的就是实现中断处理函数的快进快出,
- 那些对时间敏感、执行速度块的操作可以放到中断处理函数中,也就是上半部。
- 剩下的所有工作都可以放到下半部去执行,比如在上半部将数据拷贝到内存中,关于数据的具体处理就可以放到下半部去执行。
- 参考点:
- 如果要处理的内容不希望被其他中断打断,那么可以放到上半部。
- 1.如果要处理的任务对时间敏感,可以放到上半部。
- 2.如果要处理的任务与硬件有关,可以放到上半部。
- 3.除了上述三点以外的其他任务,优先考虑放到下半部。
- 下半部的处理方式:
- 1.软中断
-1. Linux 内核使用结构体 softirq_action 表示软中断, softirq_action结构体定义在文件 include/linux/interrupt.h 中。- 2.在 kernel/softirq.c 文件中一共定义了 10 个软中断
static struct softirq_action softirq_vec[NR_SOFTIRQS]; - 3.NR_SOFTIRQS 是枚举类型,定义在文件include/linux/interrupt.h 中
- 4.softirq_action 结构体中的 action 成员变量就是软中断的服务函数
- 5.数组 softirq_vec 是个全局数组,因此所有的 CPU(对于 SMP 系统而言)都可以访问到,每个 CPU 都有自己的触发和控制机制,并且只执行自己所触发的软中断。
- 6.但是各个 CPU 所执行的软中断服务函数确是相同的,都是数组 softirq_vec 中定义的 action 函数。
- 7.要使用软中断,必须先使用 open_softirq 函数注册对应的软中断处理函数。
- 8.软中断必须在编译的时候静态注册!
- 9.softirq_init 函数默认会打开 TASKLET_SOFTIRQ 和HI_SOFTIRQ。
- 2.在 kernel/softirq.c 文件中一共定义了 10 个软中断
- 2.tasklet
- tasklet 是利用软中断来实现的另外一种下半部机制,在软中断和 tasklet 之间,建议使用 tasklet。
- 3.工作队列
- 1.工作队列是另外一种下半部执行方式,工作队列在进程上下文执行,工作队列将要推后的工作交给一个内核线程去执行,因为工作队列工作在进程上下文,因此工作队列允许睡眠或重新调度。
- 2.因此如果你要推后的工作可以睡眠那么就可以选择工作队列,否则的话就只能选择软中断或 tasklet。
- 3.Linux 内核使用工作者线程(worker thred)来处理工作队列中的各个工作, Linux 内核使用worker 结构体表示工作者线程。
- 1.软中断
- 设备树中断信息节点
- 1.如果使用设备树的话就需要在设备树中设置好中断属性信息, Linux 内核通过读取设备树中 的 中 断 属 性 信 息 来 配 置 中 断 。 对 于 中 断 控 制 器 而 言 , 设 备 树 绑 定 信 息 参 考 文 档Documentation/devicetree/bindings/arm/gic.txt。
- 2.打开 imx6ull.dtsi 文件,其中的 intc 节点就是I.MX6ULL 的中断控制器节点,
- 简单总结一下与中断有关的设备树属性信息:
- 1.#interrupt-cells,指定中断源的信息 cells 个数。
- 2.interrupt-controller,表示当前节点为中断控制器
- 3.interrupts,指定中断号,触发方式等
- 4.interrupt-parent,指定父中断,也就是中断控制器
本文地址:https://blog.csdn.net/CouragelDesire/article/details/114326466
上一篇: Pandas 如何筛选包含特定字符的列
下一篇: 最简单的前端css仿ios毛玻璃效果