[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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯西的彷徨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值