ZHDZ022A February   2022  – October 2026 CC1311R3

 

  1.   1
  2.   摘要
  3.   商标
  4. 1公告汇总表
  5. 2命名规则、封装编号法和修订版本标识
    1. 2.1 器件和开发支持工具命名规则
    2. 2.2 支持的器件
    3. 2.3 封装编号法和修订版本标识
  6. 3公告
    1.     Radio_01
    2.     Power_03
    3.     I2C_01
    4.     I2S_01
    5.     CPU_01
    6.     CPU_02
    7.     CPU_Sys_01
    8.     Sys_01
    9.     Sys_05
    10.     SYSCTRL_01
    11.     IOC_01
    12.     ADC_01
    13.     ADC_02
    14.     ADC_03
  7. 4修订历史记录

CPU_01

Arm® 勘误表 #838869:立即存储重叠异常返回操作可能跳转至错误的中断向量

受影响的版本:

版本 C 及更早版本

详细信息:

受影响的配置:

此勘误仅影响可写存储器位置会表现出一个以上等待状态的系统(系统 SRAM 没有等待状态)。

Arm®Cortex®-M4 处理器包含一个写缓冲器,允许在存储指令等待总线响应时继续执行后续指令。在特定的时序条件下,如果在异常返回期间该缓冲器仍被存储指令占用,此时下一个将要处理的中断选择的延迟变化,可能会导致中断控制器确认的中断与处理器提取的向量之间出现不匹配。

条件:

  • 正在执行中断 A 的处理程序。
  • 优先级与中断 A 相同或更低的中断 B 处于挂起状态。
  • 对可缓冲的存储位置执行带立即数偏移的存储指令:


    STR/STRH/STRB <Rt>, [<Rn>,#imm]
    STR/STRH/STRB <Rt>, [<Rn>,#imm]!
    STR/STRH/STRB <Rt>, [<Rn>,#imm]

  • 可以执行任意数量的附加数据处理指令。
  • 执行了一条导致异常返回的 BX 指令。
  • 该存储数据被施加了等待状态,使得数据在 BX 指令执行后至少两个周期才被接受。
    • 如果该存储指令与 BX 指令之间没有其他指令,则这最少是两个时钟周期。
    • 观察到该勘误所需增加的等待状态数,需要加上存储指令与中断服务例程退出指令之间的时钟周期数。
  • 在总线接受缓冲的存储数据之前,另一个中断 C 被触发,其中断优先级与 A 相同或更低,但高于 B。

影响:

处理器本应执行中断处理程序 C,并在 C 完成后执行 B 的处理程序。如果满足上述条件,则该勘误会导致处理器错误地清除中断 C 的挂起状态,然后两次执行 B 的处理程序。首次执行 B 的处理程序时,它将处于中断 C 的优先级级别。如果中断 C 是由 C 的处理程序清除的电平触发中断所挂起的,则在 B 的处理程序完成后,中断 C 将再次被挂起,并且 C 的处理程序将被执行。如果中断 C 是电平触发的,则该中断最终会再次变为挂起状态,并随后得到处理。如果中断 C 是单脉冲中断,则该中断存在丢失的可能性。

该缺陷在极少数情况下才会触发。在 STORE 操作经历超过两个等待周期的情况下,软件开发人员必须使用规避措施。

  • 此勘误不适用于 TI-RTOS 中断,因为 TI-RTOS 确保在中断服务程序最后五条指令内不会出现带立即数偏移的存储指令。有关进一步的实现细节,请参阅所有 SDK 中包含的以下文件:
    • kernel/tirtos/packages/ti/sysbios/family/arm/m3/Hwi_asm*.sv7M
  • TI-RTOS 中的零延迟中断(绕过内核)及 SDK 中的无 RTOS 示例受此勘误影响。

解决方法:

建议的解决方法:

确保在存储指令与 BX 指令之间执行一条 DSB 指令。对于用 C 语言编写的异常处理程序,可以通过在中断函数结束前插入适当的内联函数或内联汇编来实现,例如:

 

ARMCC:

...

__schedule_barrier(); __asm{DSB}; __schedule_barrier(); }

GCC:

...

__asm volatile (“dsb 0xf” ::: “memory”); }

备注:

编译器不会自动添加此错误的解决方法。

替代解决方法:

禁用 CPU 写缓冲(寄存器 CPU_SCS.ACTLR.DISDEFWBUF),代价是执行速度会显著降低。