Cortex-M Lockup 复位

一、 文档简介

介绍 Cortex-M 的 Lockup 。

这里:

  • 故障:fault
  • 异常:exception

二、 Cortex-M Lockup 复位出现原因

2.1 直接原因

          根据 ARM 官方手册《Cortex-M4 Devices Generic User Guide.pdf》,Lockup复位原因是执行 NMI 或 HardFault 处理程序时再次发生故障,这个时候会进入 lockup 状态且不再执行任何指令。除非出现以下情况,否则不退出 lockup 状态:

  • 复位
  • NMI 产生
  • 被调试器停止

注意:如果 lockup 状态是因为来自 NMI 处理的,后续的 NMI 不会导致退出 lockup 状态。

2.2 HardFault

          HardFault是由于异常处理过程中出现错误,或由于异常无法由任何其他异常机制管理而发生的异常。HardFaults的优先级固定为 -1,这意味着它们的优先级高于任何具有可配置优先级的异常。HardFault 是由故障处理程序处理的故障异常。

注意:在读取向量表(vector)向量时出现总线错误或者故障升级为硬件故障,都会导致 HardFault。

2.3 NMI

          不可屏蔽中断 NMI。可以由外设设备发出信号或软件触发,这是除复位外优先级最高的异常。其永久性开启且固定优先级是 -2。NMI 不能够:

  • 被任何其他异常屏蔽或阻止激活
  • 被除复位以外的其他异常抢占

NMI 是由系统处理程序处理的系统异常

2.4 故障

           故障是异常的子集,故障产生于:

  • 总线错误上的:

               指令获取或向量表加载

               数据访问

  • 内部检测的错误,如未定义指令
  • 试图从标记为execute -never (XN)的内存区域执行指令。
  • 如果你的设备包含一个MPU,特权违反或试图访问一个非受管区域导致MPU故障。

2.4.1 故障升级

        某些情况下,具有可配置优先级的故障被视为 Hardfault,这被称为优先级升级,故障被描述为升级到 HardFault。升级到 HardFault 发生在:

  • 错误处理程序会导致与其所服务的错误类型相同的错误。之所以会升级到 HardFault,是因为故障处理程序不能抢占自身,因为他必须具有与当前优先级级别相同的优先级。
  • 故障处理程序导致的故障,这个故障的优先级与其服务的故障优先级相同或更低。这是因为新错误的处理程序不能抢占当前正在执行的错误处理程序。
  • 异常处理程序导致的错误,这个错误的优先级与当前正在执行的异常的优先级相同或更低。
  • 发送错误,但未启用该错误的处理程序。

2.5 异常压栈处理

         如图,是异常之后的压栈操作,可根据这个来查找 LR 等寄存器



(此图来自  ARM:《Cortex-M4 Devices Generic User Guide.pdf》)

三、参考文档

(1) ARM:《Cortex-M4 Devices Generic User Guide.pdf》

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论