在用request_irq申请中断的时候,需要选择中断模式,不考虑快速中断的话,就有四种中断,两种触发,边沿触发和电平触发。
但是这两者触发方式有什么区别呢?
对内核的中断处理有什么影响呢?
一般处理器每执行一条指令时发现中断标志就会进入中断模式(ARM架构),linux主要做了保护现场环境,根据总标志进入各中断散转表地址。
这里只考虑中断相关的,不考虑和进程调度和延时处理相关的。
先看看硬件中断机制:
例如:Uart子中断条件满足 --》经过掩码 --》置uart子中断标志 --》 VIC中断掩码 --》 VIC中断标志 ---》 处理器的CPSR寄存器中断标志置位
从VIC这里以上都由linux内核管理,并由申请中断时指定的标志做出不同的处理。
比如,电平触发的中断:
linux进入中断,先执行注册中断的服务,再清除总中断标志,即VIC和处理器的标志。
而,边沿触发的中断:
linux进入中断,先清楚总中断标志,再执行注册的中断服务。
ok了,但是为什么要这么做呢?
可以想一下,linux进入一般中断后(不考虑中断嵌套),当前的中断是禁止的。
而中断标志是由硬件条件导致的,所以完全处理完了中断标志才不会置位,比如uart的FIFO满了;而边沿型的中断,比如按下按键外部电平跳变导致中断标志置位,一次清除中断标志
就可以了。
所以电平的中断如果处理前中断标志被清除了,则马上也会置位,导致中断返回时马上又重新进一遍中断。2.4内核就因为这个问题有很多bug。
对于边沿触发的中断,因为清除了就不会再被置位,所以不需要这样做,在执行中断服务之前和之后都可以,但是在中断服务之后的话,也许会在中断过程中再有一个触发沿,那么
就会丢失一个中断。
在嵌入式SOC内部大多是电平触发,所以处理完了再清除标志;而外部中断可以根据情况设置为电平中断和边沿中断,对边沿触发的中断,进入中断服务程序最好就先清除中断标志。
只是我有个问题,边沿触发中断的服务程序进去前,总中断标志应该被清除了,但是进去后第一条指令不是清除子中断标志的话,是不是子中断标志又会导致总中断标志置位呢?
这点理解还不是很清楚,欢迎大家知道的话说一下。
阅读(3125) | 评论(1) | 转发(0) |