在设计实时系统时,必须对中断延迟进行严肃和仔细的估算。在这里,中断延迟的定义:从检测到某中断请求,到执行了其服务例程的第一条指令时,已经流逝了的时间。在Cortex-M3中,若存储器系统够快,且总线系统允许入栈与取指同时进行,同时该中断可以立即响应,则中断延迟是固定的12周期(满足硬实时所要求的确定性)。在这12个周期里,处理器内部进行了入栈、取向量、更新寄存器以及服务例程取指等一系列操作。但若存储器太慢以至引入等待周期,或者还有其他因素,则会引入额外的延时。
当处理咬尾中断时,省去了堆栈操作,因此切入新异常服务例程的耗时可以短至6周期。
有些指令需要较长的周期才能完成。它们是除法指令、双字传送指令LDRD/STRD以及多重数据传送指令(LDM/STM)。对于前两者,Cortex-M3将为了保证中断及时响应而取消它们的执行,待返回后重新开始;对于LDM/STM,为了加速中断的响应,Cortex-M3支持LDM/STM指令的中止和继续。为此,Cortex-M3在xPSR中开出若干个“ICI位”,记录下一个即将传送的寄存器是哪一个(LDM/STM在汇编时,都把寄存器号升序排序)。在服务例程返回后,xPSR被弹出,Cortex-M3再从ICI位段中获取当时LDM/STM执行的进度,从而可以继续传送。但这种方式在IF-THEN(IT)指令执行时有限制,因为IF-THEN指令的执行也需要在xPSR中使用几个位,而这几个位刚好与ICI位重合。所以,如果在IF-THEN中使用了LDM/STM,则不再记录LDM/STM的执行进度。尽管如此,及时响应中断依然是首要任务,此时只好把LDM/STM取消,待中断返回后继续执行。(www.xing528.com)
另外,如果在总线接口上还有未完成的数据传送,例如有一个带缓冲的写操作未完成,处理器也只能等待此传送完成。只有这样,才能保证在发生了总线fault时,其服务例程能够安全地抢占其他程序。
当多个中断同时请求时,也会发生中断延迟,这表现在只有优先级最高的得到立即响应,所有其他的中断将被延迟。另外,在中断嵌套时,每个中断都会阻塞同级和低优先级的中断。最后,如果中断被掩蔽,则在掩蔽期间也会附加中断延迟。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。