本节将描述中断输入和挂起的分析,这也同样适用于NMI输入,NMI在大多数情况下都将立即执行,除非:已经在执行NMI中断处理程序、由调试器暂停或由于一些严重的系统错误导致芯片锁定。
1、
当一个中断输入时,它将被挂起,然后被置于等待处理器处理请求的状态,此时即使失能该中断源,挂起的中断最后仍会触发其相应的中断处理程序,而一旦中断处理程序开始执行,该挂起状态将被自动清除。
2、
但是,如果挂起状态在处理器开始响应挂起中断之前被清除(例如,因为PRIMASK
/FAULTMASK
被设置为1,中断没有被立即执行,且挂起状态需要通过软件写NVIC中断控制寄存器来清除),此时中断是可以被取消的。
中断的挂起状态可以通过访问NVIC寄存器来读写,所以用户可以清除一个挂起的中断标志位或者用软件设置挂起寄存器以挂起一个新的中断。
3、
当处理器开始执行一个中断时,该中断的状态变为active,且挂起的位将被自动清除。同一个中断处理函数在处理的过程中不能嵌套,只有当异常退出(exception exit
)将其active状态被清除后,才可以继续响应同一中断。
4、
如果中断源继续发送中断请求信号,中断将会在终端服务处理函数的最后被再次挂起。
5、
如果一个中断在被处理之前在中断请求线上产生了多个脉冲,它将被处理一次。
6、
如果一个中断的请求被取消,然后在中断服务程序中再次被触发,它将再次被挂起
总结:
- 即使中断被失能,挂起的中断仍然可能产生
- 被失能的挂起的中断在后面将其使能时仍然可以被触发
因此,在启用中断之前,检查是否设置了挂起寄存器是很有用的。中断源可能在你启用之前就已经被激活并设置了挂起状态。如果有必要,可以在启用中断之前清除挂起状态。