ZHDZ022A February 2022 – October 2026 CC1311R3
Arm® 勘误表 #838869:立即存储重叠异常返回操作可能跳转至错误的中断向量
此勘误仅影响可写存储器位置会表现出一个以上等待状态的系统(系统 SRAM 没有等待状态)。
Arm®Cortex®-M4 处理器包含一个写缓冲器,允许在存储指令等待总线响应时继续执行后续指令。在特定的时序条件下,如果在异常返回期间该缓冲器仍被存储指令占用,此时下一个将要处理的中断选择的延迟变化,可能会导致中断控制器确认的中断与处理器提取的向量之间出现不匹配。
条件:
STR/STRH/STRB <Rt>, [<Rn>,#imm]
STR/STRH/STRB <Rt>, [<Rn>,#imm]!
STR/STRH/STRB <Rt>, [<Rn>,#imm]
影响:
处理器本应执行中断处理程序 C,并在 C 完成后执行 B 的处理程序。如果满足上述条件,则该勘误会导致处理器错误地清除中断 C 的挂起状态,然后两次执行 B 的处理程序。首次执行 B 的处理程序时,它将处于中断 C 的优先级级别。如果中断 C 是由 C 的处理程序清除的电平触发中断所挂起的,则在 B 的处理程序完成后,中断 C 将再次被挂起,并且 C 的处理程序将被执行。如果中断 C 是电平触发的,则该中断最终会再次变为挂起状态,并随后得到处理。如果中断 C 是单脉冲中断,则该中断存在丢失的可能性。
该缺陷在极少数情况下才会触发。在 STORE 操作经历超过两个等待周期的情况下,软件开发人员必须使用规避措施。
确保在存储指令与 BX 指令之间执行一条 DSB 指令。对于用 C 语言编写的异常处理程序,可以通过在中断函数结束前插入适当的内联函数或内联汇编来实现,例如:
ARMCC:
...
__schedule_barrier(); __asm{DSB}; __schedule_barrier(); }
GCC:
...
__asm volatile (“dsb 0xf” ::: “memory”); }
编译器不会自动添加此错误的解决方法。
替代解决方法:
禁用 CPU 写缓冲(寄存器 CPU_SCS.ACTLR.DISDEFWBUF),代价是执行速度会显著降低。