ARM 编译器如何处理 运行 时间错误?
How ARM Compilers Handle Run Time Errors?
我正在尝试生成 运行 时间错误,例如在 ARM Cortex M3 中除以零。我不知道为什么当我生成除以零错误时系统工作正常。但是值似乎是“无穷大”
ARM gcc 编译器是否处理此类 UsageFault 错误?我还没有实现硬件异常处理程序,例如 Usage Fault、Bus Fault 或 Mem Manage。
与 x86, no exception is thrown for arm 相反,如果整数除以零。结果只是返回 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
的伪代码。
参考文献:
- FPCR and FPSR 在 aarch64
- FPSCR 在 aarch32
- ARM a64 instruction set architecture
行为因架构而异。 ARMv6-M 不包含除法指令,因此它是管理这种情况的软件(或者编译器,从 C/C++ 的角度来看,它是 UB)。
关于 Cortex M3 (ARMv7-M) things are different, there is an UsageFault 管理 DIVBY0 情况的异常。
我正在尝试生成 运行 时间错误,例如在 ARM Cortex M3 中除以零。我不知道为什么当我生成除以零错误时系统工作正常。但是值似乎是“无穷大”
ARM gcc 编译器是否处理此类 UsageFault 错误?我还没有实现硬件异常处理程序,例如 Usage Fault、Bus Fault 或 Mem Manage。
与 x86, no exception is thrown for arm 相反,如果整数除以零。结果只是返回 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
的伪代码。
参考文献:
- FPCR and FPSR 在 aarch64
- FPSCR 在 aarch32
- ARM a64 instruction set architecture
行为因架构而异。 ARMv6-M 不包含除法指令,因此它是管理这种情况的软件(或者编译器,从 C/C++ 的角度来看,它是 UB)。
关于 Cortex M3 (ARMv7-M) things are different, there is an UsageFault 管理 DIVBY0 情况的异常。