【二】12.关于中断
前言:
L内核提供了完善的中断框架,我们只需要申请,然后注册中断处理函数即可。
1.裸机的中断处理方法回顾:
步骤1:使能中断,初始化相应的寄存器。
步骤2:注册中断服务函数,也就是像irqTable数组的指定标号处写入中断服务函数。
步骤3:中断发生以后进入IRQ中断服务函数,在IRQ中断服务函数在数组irqTable里面查找具体的中断处理函数,找到以后执行相应的中断处理函数。
2.L中断API函数:
中断申请 | int request_irq(unsigned intirq, irq_handler_t handler, unsigned long flags, const char *name, void *dev) | |
中断释放 | void free_irq(unsigned int irq, void *dev) | |
中断处理函数 | irqreturn_t (*irq_handler_t) (int, void *) | 无 |
中断使能与禁止 | void enable_irq(unsigned int irq) void disable_irq(unsigned int irq) void disable_irq_nosync(unsigned int irq) local_irq_enable() local_irq_disable() local_irq_save(flags) local_irq_restore(flags) | 无 |
上半部:就是中断处理函数,那些处理过程比较快,不会占用很长时间的处理就放在上半部完成。
下半部:如果处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部去执行,这样中断处理函数就会快进快出。
三个下半部机制:
(1)软中断:不建议使用,我没看,别咬我。。。。。。。。。。。。
(2)tasklet:

(3)工作队列:没用到,我没看,别咬我。。。。。。。。。。。。。
4.中断<--->设备树:
STM32MP1 有三个与中断有关的控制器:GIC、EXTI 和 NVIC。
(1)GIC:全称为:Generic Interrupt Controller。
GIC 将众多的中断源分为分为三类:
①、SPI(Shared Peripheral Interrupt),共享中断,顾名思义,所有 Core 共享的中断,这个是最常见的,那些外部中断都属于 SPI 中断(注意!不是 SPI 总线那个中断)。比如 GPIO 中断、串口中断等等,这些中断所有的 Core 都可以处理,不限定特定 Core。中断ID:这 988 个 ID 分配给 SPI,像 GPIO 中断、串口中断等这些外部中断。
②、PPI(Private Peripheral Interrupt),私有中断,我们说了 GIC 是支持多核的,每个核肯定有自己独有的中断。这些独有的中断肯定是要指定的核心处理,因此这些中断就叫做私有中断。中断ID:这 16 个 ID 分配给 PPI。
③、SGI(Software-generated Interrupt),软件中断,由软件触发引起的中断,通过向寄存器GICD_SGIR 写入数据来触发,系统会使用 SGI 中断来完成多核之间的通信。中断ID:ID0~ID15:这 16 个 ID 分配给 SGI。
(2)EXTI:全称是:Extended interrupt and event controller。
EXTI 的异步输入事件可以分为 2 组:
①、可配置事件(来自能够生成脉冲的 I/O 或外设的信号),这类事件具有以下特性:
– 可选择的有效触发边沿。
– 中断挂起状态寄存器位。
– 单独的中断和事件生成屏蔽。
– 支持软件触发。
②、直接事件(来自其他外设的中断和唤醒源,需要在外设中清除),这类事件具有以下特性:
– 固定上升沿有效触发。
– EXTI 中无中断挂起状态寄存器位(中断挂起状态由生成事件的外设提供)。
– 单独的中断和事件生成屏蔽。
– 不支持软件触发。
(3)NVIC:NVIC 是 Cortex-M4内核的中断控制器。
(4)GIC控制器节点:
stm32mp151.dtsi 文件,其中的 intc 节点就是 GIC 的中断控制器节点:

SPI6 节点内容:

(5)EXIT控制器节点:
stm32mp151.dtsi 文件,其中的 exti 节点就是 EXTI 的中断控制器节点:

GPIO 节点信息里面的 EXTI 相关内容:


我们来看一个具体的应用,打开 stm32mp15xx-dkx.dtsi 文件,找到如下所示内容:

中断运用代码如下---------------------------->>>>>>>>>>>>>>>>>>>>>>
设备树节点添加:

驱动代码:








查看系统中注册的中断:"cat /proc/interrupts"。