繁体   English   中英

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

[英]How ARM Compilers Handle Run Time Errors?

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

在此处输入图像描述

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

相比,如果发生 integer 除以零,则不会为引发异常。 结果只是返回0

编辑:这只适用于 Cortex-A 系列。 正如 Jose 所说,在 Cortex-M 系列中,有一个用于 integer 除法的控制寄存器,如下文所述的浮点除法的情况。 请参阅他的答案中的链接。


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

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

  • infinityinfinityNaN
  • zerozeroNaN
  • 任何其他被划分的infinity都是±zero
  • ±infinity大中除以zero的任何其他内容(根据被除数进行标记,这是您在屏幕截图中看到的情况)
  • infinity除以其他任何东西是±infinity
  • zero除以其他任何东西是±zero

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


参考:

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

Cortex M3 (ARMv7-M) 上,情况有所不同,有一个UsageFault异常来管理 DIVBY0 情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM