【发布时间】:2020-07-07 10:24:26
【问题描述】:
我正在尝试生成运行时错误,例如在 ARM Cortex M3 中除以零。我不知道为什么当我生成除以零错误系统时正常工作。然而价值似乎“无限”
ARM gcc 编译器是否处理此类 UsageFault 错误?我还没有实现硬件异常处理程序,例如 Usage Fault、Bus Fault 或 Mem Manage。
【问题讨论】:
标签: exception arm divide-by-zero cortex-m3
我正在尝试生成运行时错误,例如在 ARM Cortex M3 中除以零。我不知道为什么当我生成除以零错误系统时正常工作。然而价值似乎“无限”
ARM gcc 编译器是否处理此类 UsageFault 错误?我还没有实现硬件异常处理程序,例如 Usage Fault、Bus Fault 或 Mem Manage。
【问题讨论】:
标签: exception arm divide-by-zero cortex-m3
与x86 相比,如果发生整数除以零,arm 不会引发异常。结果只是返回了0
编辑:这仅适用于 Cortex-A 系列。正如 Jose 所指出的,在 Cortex-M 系列中有一个用于整数除法的控制寄存器,如下面描述的浮点除法的情况。请参阅他的答案中的链接。
对于浮点运算,浮点控制寄存器(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) 上情况有所不同,有一个 UsageFault 异常来管理 DIVBY0 情况。
【讨论】: