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.

[参考译文] TM4C1294KCPDT:为什么 FPU 异常 NMI 将2个浮点值相乘

Guru**** 2526700 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1019877/tm4c1294kcpdt-why-fpu-exception-nmi-multiplying-2-floating-point-values

器件型号:TM4C1294KCPDT

在不知情的情况下、一直试图让 FPU 乘以两个值、ARM 工程师似乎认为可能的7M4 FPU。 进行单步 CCS 调试以发现可怕的故障、将2个浮点值相乘会产生 DEN。 该异常发生在乘法下面的几条指令。 FPU 已完全启用、CPAC REG80 (CP10、CP11)具有完全访问权限。 IP 不会超过此问题导致 NMI 异常。 在 CPU IP 向量进入 void 之前、该值(theta)将传递到函数中。

BTW:输入 theta = 0.0123450002以及0002如何添加到浮点32位数组中、例如 theta[1]={0.0}值(0.012345)是个谜。

编译器 TI v18.12.4.LTS、RunTimeSupport rtsv7M4_T_le_v4SPD16_eabi.lib、--float_support FPv4SDP16

为什么7M4 FPU 不能执行单精度浮点乘法、似乎是个问题? 我熟悉 Nan 首字母缩略词、但 DEN 是什么意思?  

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

    以下是 EK-TM4C1294NCPD FPU 配置和在故障指令之后发生的例外 FPSCR 寄存器值。

    问题的一部分是乘法结果大于32位,temp 和 in 变量被设置为 long long (float64_t)。 代码在发生故障前会进一步增加、但异常总线错误(0x3)、尽管地址在内存空间的 FPU 区域附近、但它的地址不精确。  

    /*启用 NVIC 浮点单元、FPU */
    MAP_FPUEnable();

    /*浮点状态不会保存在中断输入上*/
    MAP_FULazyStackingEnable();

      

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

    FPSCR[4](0x10)是一个不精确的异常(IXC)、这几乎是我可以告诉的例行情况、并且很少是一个实际错误。 [参考 Cortex-M4 TRM (r0p1) s 7.2.6 ]

    我怀疑 SYSEXCIM:FPIXCIM 在某种程度上变为设置= 1。 [参考数据表(SPMS433B)第526页]。 如果是、请尝试将其清除为0。

    另请参阅:

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/978615/msp432p401r-cortex-m4f-fpu_irqhandler---ccs-usage-example/3619260

    [编辑:更好的 IXC 参考可能是 DDI0403E (修订版 D)表 A2-3:"不准确。 如果运算的结果与在运算以无界精度和指数范围执行时将生成的值不等效、则该位设置为1 "、即取整]

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

    您好、GL、

    这似乎更像是一个 Arm FPU 问题、而不是我们器件特有的问题-我可以尝试查看 DEN 封装、但我实际上对 MCU 上的浮点数学没有任何了解。  与此同时、Bruce 似乎有一些想法可以尝试。 让我们知道这些工作是否正常。

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

    尊敬的 Ralph 和 Bruce:

    讨论  FPU 浮点小数点数学中的崩溃课程:-)

    [引用 userid="189615" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1019877/tm4c1294kcpdt-why-fpu-exception-nmi-multiplying-2-floating-point-values/3769612 #3769612"]我对 MCU 上的浮点数学没有任何了解。

    嗯、(f)后缀对于 FPU 似乎有一些有争议的编译器操作、其中 printf() via switch (f)指定了双精度 FPU 操作。 CMSIS v5.7的 ARM 工程师建议(f)后缀、例如(0.123456789f)要求编译器不执行双精度操作。

    根据 TM4C 数据表(PG.142)、7M4 FPU 无法执行注释为 IEEE 754标准修订版 C99的双精度运算。 似乎有人没有遵循 IEEE 规则、而附加的编译器(float)(f)尝试执行双精度。 因此、C99周围的 float64_t 裙边和 FPU 在较长的时间内实现单精度、而不是长 的时间内提高双精度(f)。

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

    这是否意味着编译器发出双精度 VFP 指令? 如果是这样、我将会遇到硬故障(用法未定义)、而不是 NMI 或浮点(SYSEXC)异常。 这是什么指令? 这是在生成的代码中还是在库中? 如果您定义了 SYSEXC_IrqHandler (或该名称的精确名称)、会发生什么情况?

    BTW:输入 theta = 0.0123450002以及0002如何被添加到浮点32位数组中、例如 theta[1]={0.0}值(0.012345)是一个谜。

    我在网络上发现的两种不同计算器表示0.012345 在单精度中实际上是0.012345000170171260833740234375。

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

    如果项目优化(宽松)浮点实际上将双精度型转换为单精度型、也会显示一个很好的点。 下拉文本似乎意味着宽松确实会将双精度型转换为单精度型。 严格浮点运算对(f)后缀有什么作用是更好的问题?

    [引用 userid="47378" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1019877/tm4c1294kcpdt-why-fpu-exception-nmi-multiplying-2-floating-point-values/3770335 #3770335"]是在生成的代码中还是在库中?

    在应用代码表中、值以(f)结尾、以通知编译器不进行转换或使用 FPU 双精度。 后缀对于宽松浮点指令似乎具有不良影响。 通过两个 float32_t 的乘法立即生成代码故障、当更改为 float64_t 时、奇怪的是不会发生故障 FPU 异常处理程序中断5内置在硬件中、startup_ccs.c 陷阱进入异常处理程序、一个用于调试寄存器检查的 while 循环。  

      FaultISR、                 //总线故障处理程序   (INT5)-11  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="189615" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1019877/tm4c1294kcpdt-why-fpu-exception-nmi-multiplying-2-floating-point-values/3769612 #3769612"]我可以尝试查看 DEN 段

    ■硬件支持反常和所有 IEEE 舍入模式

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

    我注意到 CMSIS 项目编译标志尚未添加 -mv7M4 -float_support=FPv4SPD16。  然而、CMSIS 项目选择了运行时支持(FPv4SPD16)、但是从未添加编译标志的摘要。 但是、应用程序仅引用此 CMSIS DSP 项目构建、应用程序确实设置了标志-mv7M4 -float_support=FPv4SPD16。

    使用编译 器(clang)进行测试后、CMSIS 项目管理器未设置符号标志--define=_FPU_Prese=1、因为 TI 编译器会添加到标志摘要中。 他们的测试构建 bamboozled 是否甚至没有将7M4 FPU 用于单精度 float32_t 运算、而 Clang 只是为(f)后缀添加了浮点 CPU 支持?

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

    尊敬的 GL:

    我不熟悉 CMSIS 项目、但这似乎是一个可能的问题。 我认为这将取决于项目是如何连接在一起的、项目使用什么等 不过、这似乎是一个可能的问题、应该足够轻松地在整个电路板上进行设置。

    此致、
    Ralph

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

    问题更多的是 FPU 计算如何导出到数组单元格中、以及每个数组的指针方向。 数据流进入所包含项目库的方向更是导致 NMI 故障的问题。 每个函数的布局都不清楚 在中断处理程序中调用的若干函数的传递变量的方向。