1.7 中断和异常 |
Cortex-M3 采用ARMV7-M体系结构中的异常(中断)模型,取消了原来在ARM7(如LPC23XX,LPC24XX)系列中的FIQ,但采用了中断优先级,引入了嵌套中断模式,从而实现了嵌套中断,即一个高优先级的中断能够覆盖或抢占低优先级的中断。Cortex-M3 支持11 个系统异常,最多 240 个外部中断。外设产生的中断信号,除了SysTick外,全部连接到NVIC的中断输入信号线上。
注意: LPC17XX的外部中断是 35 个。实际上芯片制造商并不会全部使用 240 个外部中断。
所有的异常处理都是在处理模式下实现的。当出现中断时,处理器的状态自动保存到堆栈中,并在中断服务程序(ISR)结束时自动从堆栈中恢复。取出向量和保存状态是同时进行的,从而提高了进入中断的效率。Cortex-M3 还支持末尾连锁(Tail-chaining),使得处理器无须保存和恢复状态便可执行连续的中断。
注意: 末尾连锁(Tail-chaining)指的是当处理器响应某中断时,又发生了其他优先级较低的中断,则低优先级的中断先被挂起。在当前中断执行返回后,不再执行出栈和入栈操作,直接处理挂起的中断,就好像后一个中断与前一个中断的尾连接起来了,前后只执行了一次入栈/出栈操作,从而使得两个ISR之间的间隔大大缩短。
Cortex-M3 的中断处理方式与原有的ARM处理中断方式相比,具有不易丢失中断的特点。如果一个发生的异常不能被即刻响应,就称它被“挂起”(pending)。不过,少数fault异常是不允许被挂起的。一个异常被挂起的原因,可能是系统当前正在执行一个更高优先级异常的服务例程,或者因相关掩蔽位的设置导致该异常被禁能。对于每个异常源,在被挂起的情况下,都会有一个对应的“挂起状态寄存器”保存其异常请求。等到该异常能够响应时,执行其服务例程,这与传统的ARM是完全不同的。在以前,是由产生中断的设备保持住请求信号的;在Cortex-M3 中,则由NVIC的挂起状态寄存器来保持住请求信号的。于是,哪怕设备在后来已经释放了请求信号,曾经的中断请求也不会错失。