Contents
先级)异常
1 中断等待
1 中断等待
中断等待(延时):从检测到某中断请求,到执行了其服务例程的第一条指令时,已流逝的时间。
可能造成中断等待的情况:
- CPU正在处理另外一个相同或更高优先级的异常
- CPU正在执行非对齐传输
- 调试器访问存储器系统
有些指令需要较多的周期才能完成:
- 除法指令
- 双字传送指令LDRD/STRD
- 多重数据传送指令LDM/STM/PUSH/POP
对于LDRD/STRD:为了保证中断及时响应而取消它们的执行,待返回后重新开始。
对于多重数据传送指令:支持LDM/STM/PUSH/POP指令的中止和继续,xPSR中的ICI位用于记录指令传输过程被打断时,下一个即将传送的寄存器(LDM/STM在汇编时,都把寄存器号升序排序)。在服务例程返回后,xPSR被弹出,CM3再从ICI
bits中获取当时LDM/STM执行的进度,从而可以继续传送。
但是,在IF-THEN(IT)
指令的执行也需要在xPSR中使用这些位,且与ICI
位重合(类似C中的union
),即IT
条件。所以,如果在IF-THEN中使用了LDM/STM,则不再记录LDM/STM的执行进度。此时只好把LDM/STM取消,待中断返回后继续执行。
2 异常处理优化
2 异常处理优化
2.1 中断嵌套
- NVIC和CM3处理器会根据优先级的设置来控制抢占与嵌套行为:
- 高抢占优先级可打断正在执行的低抢占优先级异常/中断
- 抢占优先级相同时,子优先级高的先执行,但不能打断正在执行的低子优先级的异常/中断
- 两者都相同时,先响应异常编号最小
- 由于相同优先级的异常不能抢占自身,否则触发用法fault(如在svc异常中执行svc指令)
- 自动入栈和出栈机制
注意:在Handler模式下,使用MSP,每嵌套一级,就至少再需要8个字(r0~r3, r12, lr, pc, xpsr),即32字节的堆栈空间,对主栈的压力会增大,有栈溢出风险。
2.2 咬尾中断
若某个异常产生时CPU正在处理另一个具有相同或更高优先级的异常,该异常就会进入挂起状态(还未开始执行)。在CPU执行完当前的异常处理后,它可以继续执行挂起的异常/中断请求,但中断1切换中断2时,不会将中断1保存的现场从栈中恢复到寄存器,然后在将它们存入栈中再次保存现场,而是跳过出栈和压栈过程,以尽快进入中断2的ISR中处理,这样两个异常处理间隔的时间就会降低很多。
当处理咬尾中断(Tail-Chaining)时,省去了堆栈操作,因此切入新异常服务例程的耗时最短可至6
周期。
CM3/4的硬件处理中断与ARM7汇编处理中断的对比:
2.3 晚到(的高优先级)异常
若某异常的响应序列还处在早期:入栈的阶段,尚未执行其服务例程时,如果此时收到了更高优先级异常的请求,则本次入栈操作成了为高优先级中断所做的,即入栈后,将执行高优先级异常的服务例程。(虽然来晚了,却因高优先级受到偏袒,低优先级的异常为它“火中取栗
”)。
例如:若在响应某低优先级异常#1的早期,检测到了高优先级异常#2,则只要#2没有太晚,就能以晚到中断
的方式处理——在入栈完毕后执行ISR #2。在ISR #2执行完毕后,则以咬尾中断
方式,来启动ISR #1的执行。
异常#2的最后期限即在异常#1取向量阶段:从向量表中找出正确的异常向量,然后在服务程序的入口处预取指。
但是,如果异常#2来得太晚,以至于已经执行了ISR #1的指令,则按普通的抢占处理,这会需要更多的处理器时间和额外32字节
(保存当前中断的现场)的栈空间。
2.4 出栈抢占
若某个异常请求在另一个刚完成的异常处理出栈期间产生,CPU会舍弃出栈操作且开始取向量以及下一个异常服务的指令。该优化被称作出栈抢占
,如下图所示:
END
今天的文章[019] [ARM-Cortex-M3/4] 中断等待和异常处理优化分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/84308.html