[019] [ARM-Cortex-M3/4] 中断等待和异常处理优化

[019] [ARM-Cortex-M3/4] 中断等待和异常处理优化中断等待(延时):从检测到某中断请求,到执行了其服务例程的第一条指令时,已流逝的时间

ARM
Contents

中断等待

异常处理优化

中断嵌套

咬尾中断

晚到(的高优
先级)异常

出栈抢占



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.1 中断嵌套

image-20220324020505317

  • 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周期。

image-20220324023858812

CM3/4的硬件处理中断与ARM7汇编处理中断的对比:

image-20220324024105243

2.3 晚到(的高优先级)异常

若某异常的响应序列还处在早期:入栈的阶段,尚未执行其服务例程时,如果此时收到了更高优先级异常的请求,则本次入栈操作成了为高优先级中断所做的,即入栈后,将执行高优先级异常的服务例程。(虽然来晚了,却因高优先级受到偏袒,低优先级的异常为它“火中取栗”)。

例如:若在响应某低优先级异常#1的早期,检测到了高优先级异常#2,则只要#2没有太晚,就能以晚到中断的方式处理——在入栈完毕后执行ISR #2。在ISR #2执行完毕后,则以咬尾中断方式,来启动ISR #1的执行。

image-20220324025945405

异常#2的最后期限即在异常#1取向量阶段:从向量表中找出正确的异常向量,然后在服务程序的入口处预取指。

但是,如果异常#2来得太晚,以至于已经执行了ISR #1的指令,则按普通的抢占处理,这会需要更多的处理器时间和额外32字节保存当前中断的现场)的栈空间。

2.4 出栈抢占

若某个异常请求在另一个刚完成的异常处理出栈期间产生,CPU会舍弃出栈操作且开始取向量以及下一个异常服务的指令。该优化被称作出栈抢占,如下图所示:

image-20220324030245303

END

今天的文章[019] [ARM-Cortex-M3/4] 中断等待和异常处理优化分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/84308.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注