This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS570LC4357:报告针对被零除的 UNDEF 指令异常

Guru**** 2042920 points
Other Parts Discussed in Thread: TMS570LC4357
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1024059/tms570lc4357-reporting-undef-instruction-exception-for-divide-by-zero

器件型号:TMS570LC4357

大家好、
我们将 TMS570LC4357处理器用于我们的项目。 我们的要求是为"零提供"创建未定义指令例外、并报告相同的情况。

为了启用零分频、我们设置了 SCTLR 的 DZ 位并获得了用于零分频的未定义指令异常。

但是、在向用户报告异常详细信息时、我们无法确认是否由于读取 fpsr (DZC 位)返回零(0)而发生"divide by zero"而引发异常。

根据 ARM Cortex RM (Cortex-R5和 Cortex-R5F)、第11.5.3节" FPSCR 中的异常使能位读为0、不能写入。"、

那么、是否有 任何方法可以确定未定义指令异常由于"零随时间变化"条件而引起?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当 SCTLR 寄存器的 DZ 位(第19位)被置位时、将产生一个未定义指令异常。 当 DZ=0时、它不会生成异常。 我看不到任何指示来告诉 UNDEF 是由"零分频"引起的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="483488" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1024059/tms570lc4357-reporting-undef-instruction-exception-for-divide-by-zero "]但是,在向用户报告异常详细信息时,我们无法确认是否由于读取 fpscr (DZC 位)返回零(0)而发生“除零”而引发异常。

    我最初尝试测试 FPSCR 中 DZC 位的设置、首先尝试使用默认的未定义指令、启用零分频的程序。

    使用的代码为:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /* USER CODE BEGIN (0) */
    /* USER CODE END */
    /* Include Files */
    #include "HL_sys_common.h"
    /* USER CODE BEGIN (1) */
    #include <stdio.h>
    /* USER CODE END */
    /** @fn void main(void)
    * @brief Application main function
    * @note This function is empty by default.
    *
    * This function is called after startup.
    * The user can use this function to implement the application.
    */
    /* USER CODE BEGIN (2) */
    #pragma diag_push
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    报告的产出为:

    Fullscreen
    1
    2
    [CortexR5] 1023.46/0=+inf
    FPSCR before=0x00000000 after=0x00000002
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    这表明、当未启用未定义指令时、浮点除零:

    • 得到无限结果
    • 设置 FPSCR 中的 DZC (位1)。 调试器中的单步执行确认 是设置 DZC 的 VDIV.F64指令。

    将在启用未定义指令的情况下重试。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="483488" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1024059/tms570lc4357-reporting-undef-instruction-exception-for-divide-by-zero "]但是,在向用户报告异常详细信息时,我们无法确认是否由于读取 fpscr (DZC 位)返回零(0)而发生“除零”而引发异常。

    当第一篇文章提到读取 fpscr (浮点状态和控制寄存器)时、我最初读出、作为一个被零除的浮点正在被测试。

    尝试在  SCTLR 中设置 DZ 位、浮点除零(使用 VDIV.F64指令)不会导致未定义指令异常。

     再次读取 Cortex-R5 TRM 时、SCTLR 中的 DZ 位实际上控制着整数除法 UDIV 或 SDIV 指令是否产生了一个未定义的指令异常、如果它们尝试被零除。

    在 Cortex-R5 TRM 中、我看不到任何状态位、这些状态位记录是否发生了整数除零。 也许未定义指令异常处理程序可以读取生成异常的指令、并查看 UDIV 或 SDIV 指令操作码。