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.

[参考译文] TMS570LS0914:使用 FreeRTOS 时 CAN 引导加载程序问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/618068/tms570ls0914-can-boot-loader-problem-when-using-freertos

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

您好!

我已经开始为 TMS570LS0914开发 CAN 引导加载程序。 引导加载程序在单个应用程序中工作正常、但无法在 FreeRTOS 上运行。 当我使用 FreeRTOS 时、应用程序根本无法启动、因此我开始寻找解决方案。  基于 tms570ls20212自定义引导加载程序和 FreeRTOS 线程、我修改了代码、但除了其他问题之外、我的引导加载程序代码卡在启动代码中的此处:

if ((esmREG->SR1[2])!= 0U)

/*用户代码开始(24)*/
/*用户代码结束*/
/*SAFETYMCUSW 5 C MR:NA "for (;;)可通过在上述和下方的用户代码中添加"#if 0"和"#endif"来删除。"*/
/*SAFETYMCUSW 26 S MR:NA "for (;;)可通过在上述和下方的用户代码中添加"#if 0"和"#endif"来删除。"*/
/*SAFETYMCUSW 28 D MR:NA "for (;;)可通过在上述和下方的用户代码中添加"#if 0"和"#endif"来删除。"*/
 for (;;)

}/*等待*/
/*用户代码开始(25)*/
/*用户代码结束*/

当我针对循环删除此内容时、我无法在 FreeRTOS 中使用简单的 LED 闪烁程序、但当我尝试上传产品代码时、LED 闪烁任务工作正常、但速度至少慢了10倍。  

谢谢!

此致、

Keno

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

    我无法看到您的代码。 请重新发布吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 QJ、

    我重新发布了上一个帖子。 谢谢!

    此致、
    Keno
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这些建议听起来可能很不寻常、但对于我来说 RM46工作很重要。

    如果任何线程具有 Canx 端口交互、请确保您在 FreeRTOS 中创建的线程包含"特权位"作为优先级设置的一部分。
    确保您选择的权限值适用于 ISR 操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    HELO、

    您能解释一下这句话吗?请:"确保您在 FreeRTOS 中创建的线程包含"特权位"作为优先级设置的一部分"? 您能否提供更多详细信息或示例代码、很遗憾、我不明白您的意思。 谢谢!

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

    这些建议基于这样一个理念:如果您使用 FreeRTOS、那么您将创建任务。

    结果= xTaskCreate (pFunction、
    姓名、
    StackDepth、
    null、
    PRIO | portPRIVILEGE_BIT、
    &TaskHandleVector[Index]);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我将很快对其进行测试、并让您知道结果。 谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不幸的是、此解决方案对我没有帮助、没有什么变化。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我发现 HalCoGen 样本是非常好的开始位置(即生成新鲜样本)。 我从 FreeRTOS Blinky 开始、然后按照 ISR CAN 示例进行操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我从那里开始、引导加载程序正在使用该应用程序、但不适用于我更复杂的项目、即使我删除了除 LED 闪烁任务之外的所有内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用的是"ISR"还是"手动调用"版本
    我推荐 ISR 版本(确保提供通知程序并清除 HalCoGen 创建的空白通知程序)。

    /*可以中断通知*/
    /*注意-您需要从 notification.c 中删除 canMessageNotification 以避免重新定义*/
    #pragma weak (canMessageNotification)
    void canMessageNotification (canbase_t *节点、unsigned int MessageBox)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Keno、

    失败期间 esmREG->SR1[2]的值是什么? 您能否共享 intvec (sys_intvecs.asm)的代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不可以、我根本不对 CAN 使用 ISR 或通知。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Keno、

    寄存器 esmREG->SR1[2]的值是什么? 您能否与我们共享此文件(sys_intvecs.asm)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    esmREG:

    和 sys_intvecs.asm:

    谢谢!

    此致、

    Norbert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    调用 xCreateTask 时使用了哪些优先级值?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    优先级为3
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Keno、

    SR1[2]的值为0、EPSR=1 (没有发生错误)、所以代码不应该卡在这个地方。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 QJ、

    我想我错了、代码卡在代码中的某个位置:
    uint32_t Flash_Erase_Check (uint32_t Start_Address、uint32_t 字节)

    uint32_t error=0;
    寄存器 uint32_t * dst1 =(uint32_t *) Start_Address;
    寄存器 uint32_t bytes =字节;

    while (字节> 0)

    if (* dst1++!= 0xFFFFFFFF){
    误差= 2;

    字节-= 0x4;

    #ifdef DEBUG_MSG_L2
    UART_putString (UART、"\r 擦除闪存错误:");
    UART_send32BitData (sciREG1、错误);
    UART_putString (UART、"\r ");
    #endif
    return (错误);



    谢谢!

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

    请未定义"debug_MSG_L2"、并在此函数中放置断点以查找代码在哪个位置卡住。 请使用 CCS 存储器浏览器检查代码擦除的闪存扇区。 我想代码可能会卡在您的闪存擦除函数中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    HL QJ、

    通常我无法调试从 RAM 运行的代码、我不知道原因。 我在反汇编中看到这一点:

    但在我看来、程序运行正常、只是在本例中我无法读取 RAM。 我从0x00020000检查了闪存、在我看来擦除成功了、如果我移除了校验功能、它工作正常。 闪存存储器:

    我还观察到这个问题取决于应用程序代码大小。 当出现此问题时、程序大小为0x00019e9e、如果您偏离4、则提醒将为2。 因此、在最后一次检查操作中、字节= 0x4;字节值可以是一些非常大的地址。 因此、我修改了代码、如下所示:

    uint32_t Flash_Erase_Check (uint32_t Start_Address、uint32_t 字节)

    uint32_t error=0;
    寄存器 uint32_t * dst1 =(uint32_t *) Start_Address;
    寄存器 uint32_t bytes =字节;

    while (字节> 0)

    if (* dst1++!= 0xFFFFFFFF){
    误差= 2;

    字节-= 0x4;

    if (字节< 4)

    if (* dst1++!= 0xFFFFFFFF)

    误差= 2;

    字节= 0;


    #ifdef DEBUG_MSG_L2
    UART_putString (UART、"\r 擦除闪存错误:");
    UART_send32BitData (sciREG1、错误);
    UART_putString (UART、"\r ");
    #endif
    return (错误);

    通过这种修改、代码每次都能正常运行、并且能够以各种大小的应用代码运行。

    此致、

    Keno