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处理器用于我们的项目。 我们的要求是为"零提供"创建未定义指令例外、并报告相同的情况。
为了启用零分频、我们设置了 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 是由"零分频"引起的。
我最初尝试测试 FPSCR 中 DZC 位的设置、首先尝试使用默认的未定义指令、未启用零分频的程序。
使用的代码为:
/* 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 #pragma diag_suppress 994 /* missing return statement at end of non-void function */ uint32_t get_fpscr (void) { asm volatile (" VMRS r0, FPSCR"); } #pragma diag_pop /* USER CODE END */ int main(void) { /* USER CODE BEGIN (3) */ const volatile double a = 1023.4567; const volatile double b = 0.0; const volatile uint32_t fpscr_before = get_fpscr (); const volatile double c = a / b; const volatile uint32_t fpscr_after = get_fpscr (); printf ("%g/%g=%g\n", a, b, c); printf ("FPSCR before=0x%08x after=0x%08x\n", fpscr_before, fpscr_after); /* USER CODE END */ return 0; }
报告的产出为:
[CortexR5] 1023.46/0=+inf FPSCR before=0x00000000 after=0x00000002
这表明、当未启用未定义指令时、浮点除零:
将在启用未定义指令的情况下重试。
当第一篇文章提到读取 fpscr (浮点状态和控制寄存器)时、我最初读出、作为一个被零除的浮点正在被测试。
尝试在 SCTLR 中设置 DZ 位、浮点除零(使用 VDIV.F64指令)不会导致未定义指令异常。
再次读取 Cortex-R5 TRM 时、SCTLR 中的 DZ 位实际上控制着整数除法 UDIV 或 SDIV 指令是否产生了一个未定义的指令异常、如果它们尝试被零除。
在 Cortex-R5 TRM 中、我看不到任何状态位、这些状态位记录是否发生了整数除零。 也许未定义指令异常处理程序可以读取生成异常的指令、并查看 UDIV 或 SDIV 指令操作码。