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.

[参考译文] RM46L852:使用 FPU 计算出的值已损坏、根本原因似乎是 ISR

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1021989/rm46l852-calculated-value-using-fpu-was-corrupted-the-root-cause-seems-to-be-isr

器件型号:RM46L852
主题中讨论的其他器件: HALCOGEN

你(们)好。

我不断调试我的 RM46L852代码来驱动逆变器电路。

编译器为 CCS 版本:10.2.0.00009,IO 代码生成器为 HALCoGen 版本:04.07.01。

我使用 HALCoGen 生成的 RTOS。

为了方便起见、我的代码有2个任务、任务 A 和任务 B。

有时、任务 A 中使用 FPU 计算出的值损坏、我知道这一点。

我 不确定发生了什么、因此我在任务 B 中断禁用和启用之间放置了一个计算代码(由 FPU 辅助)。

似乎已经解决,没有发生腐败。

任务 A:按 RTI 安排,每10ms (vTaskDelay)

任务 B:按 etpwm 安排,每100us 一次(使用二进制信标延迟整个代码工作)
任务 A 和任务 B 之间的数据交换由队列(RTOS)完成。

我想、我没有设置正确的参数。 但我还没有找到应该更改哪个参数。

有人有没有任何建议或建议?

谢谢。

Yamai

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

    你好,Yamai,

    浮点计算在 FPU 内部的单独寄存器组上执行。 如果主程序和 ISR 都使用 FPU、则需要额外保存和恢复上下文、以确保 ISR 不会损坏主线程使用的数据。  

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

    您好、Wang San、

    感谢你的帮助。

    我  认为、ISR 在不进行 FPU 计算的情况下会做一些小工作(见下文)。 ISR 的主要工作被推迟。

    因此、我认为我不需要关注 FPU。

    void etpwmNotification (etpwmbase_t *节点)

    /*在用户代码开始和用户代码结束之间输入用户代码。 *
    /*用户代码开始(44)*/
    if (node == etpwmREG2)

    uletpwmInterruptHandler();

    /*用户代码结束*/

    uint32_t uletpwmInterruptHandler( void )

    basetype_t xHigherPriorityTaskWatken;

    xHigherPriorityTaskWoken = pdFALSE;

    xSemaphoreGiveFromISR( xBinarySemaphore,&xHigherPriorityTaskWoken );

    portYIELD_FER_ISR( xHigherPriorityTaskWoken );

    返回0;

    但如果启用了中断、浮点计算会损坏。  

    因此 uletpwmInterruptHandler 可能具有浮点计算。

    我对此有几个问题。

    1) 1)您是否有一些保留 FPU 寄存器的示例代码?

    2)   2) RTOS 中的 os_port.c 如下所示、那么 我是否可以在 RTOS 中不使用 FPU?

      如果“否”,我们是否有使用 FPU 的替代方法?

     if (((uint32_t) pxCode & 0x01UL)!= 0x00)

     {

     /*任务将在 Thumb 模式下启动。 *

     *pxTopOfStack |= portTHUMB_MODE_BIT;

     }

     pxTopOfStack---;

     /*堆栈上的最后一个内容是任务 ulUsingFPU 值、通过

     默认设置为指示堆栈帧不包含 FPU

     寄存器。 *

     *pxTopOfStack = pdFALSE;

     返回 pxTopOfStack;

    再次感谢。

    Yamai

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

    您好、Wang San、

    我找到了几个提示来解决我的问题,但我不确定它们是否足够。

    1) 1) https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/700651/rm46l430-using-floating-point-registers-in-irq-and-fiq-rm46

    我根据它的内容放置了一些描述的代码。

    2) 2) https://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html

    在 进入实现其功能的循环之前,我将 vPortTaskUsesFPU()放在任务条目上一次。  

    在上面的 URL 中 ,显示了 portTASK_USESS_FLOCK_POINT ()而不是  vPortTaskUsesFPU(),我认为我们应该将 vPortTaskUsesFPU()用于 RM46。

    在我应用 了上面 URL 中给出的内容后、我的代码看起来正常工作。

    请告诉我它是否足够。

    感谢您的合作。

    Yamai

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

    你好,Yamai,

    1是一种解决方案。 关于#2、我以前没有试过。  

    下面是另一个有用的链接:

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/376083/how-to-use-float-in-irq-with-freertos

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

    您好、Wang San、

    感谢您为我提供另一个有用的 URL。 我也会考虑这一点。

    无论如何、RM46x 16/32位 RISC 闪存微控制器技术参考手册(我曾提到)不足以理解 FPU。

    RM46中是否有有关浮点单元的文档?

    希望您能拥有它。

    Yamai

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

    你好, Yamai,

    FPU 不包含在 RM46 TRM 中。 它是 ARM IP、在 ARM TRM 中为 :ARM DDI0460D

    https://developer.arm.com/documentation/ddi0460/c/FPU-Programrs-Model

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

    王三

    大家好。

    谢谢、稍后我将详细介绍。

    Yamai