【问题标题】:How ARM Compilers Handle Run Time Errors?ARM 编译器如何处理运行时错误?
【发布时间】: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


    【解决方案1】:

    相比,如果发生整数除以零, 不会引发异常。结果只是返回了0

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


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

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

    • infinityinfinityNaN
    • zerozeroNaN
    • infinity 之外的任何其他内容都是±zero
    • 任何其他除zero±infinity中的东西(根据被除数签名, 这是您在屏幕截图中看到的情况)
    • infinity 除以 ±infinity
    • zero 除以 ±zero

    查看ARM a64指令集架构中FDIV的伪代码


    参考资料:

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-27
        • 2020-01-22
        相关资源
        最近更新 更多