ARM 编译器如何处理 运行 时间错误?

How ARM Compilers Handle Run Time Errors?

我正在尝试生成 运行 时间错误,例如在 ARM Cortex M3 中除以零。我不知道为什么当我生成除以零错误时系统工作正常。但是值似乎是“无穷大”

ARM gcc 编译器是否处理此类 UsageFault 错误?我还没有实现硬件异常处理程序,例如 Usage Fault、Bus Fault 或 Mem Manage。

, no exception is thrown for 相反,如果整数除以零。结果只是返回 0

编辑:这只适用于Cortex-A系列。正如 Jose 指出的那样,在 Cortex-M 系列中有一个用于整数除法的控制寄存器,就像下面描述的浮点除法一样。请参阅他的回答中的 link。


对于浮点运算,浮点控制寄存器FPSCR 用于 aarch32 或 FPCR 用于 aarch64)决定是否出现异常抛出。如果在那里设置了相应的位,则抛出异常,否则只有浮点状态寄存器中的标志(aarch32中的FPSCR或aarch64中的FPSR ) 被设置,然后指示错误。该寄存器可以通过 msr 设置并通过 mrs.

读取

如果没有抛出异常,则有如下规则:

  • infinity除以infinity就是NaN
  • zero除以zero就是NaN
  • 任何其他划分 infinity±zero
  • zero中的任何其他±infinity(根据被除数签名, 这就是您在屏幕截图中看到的情况)
  • infinity除以其他任何东西是±infinity
  • zero除以其他任何东西是±zero

参见ARM a64指令集架构FDIV的伪代码。


参考文献:

行为因架构而异。 ARMv6-M 不包含除法指令,因此它是管理这种情况的软件(或者编译器,从 C/C++ 的角度来看,它是 UB)。

关于 Cortex M3 (ARMv7-M) things are different, there is an UsageFault 管理 DIVBY0 情况的异常。