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.

[参考译文] TMS320F28P650DK:C2000/CLA1 GPIO 代码上的关键错误(?)/CPU 崩溃

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1459258/tms320f28p650dk-critical-bug-cpu-crash-on-c2000-cla1-gpio-code

器件型号:TMS320F28P650DK
Thread 中讨论的其他器件:C2000WARE

工具与软件:

您好!

我遇到了一个关键编译器(?) BUG、试图从 CLA1中断代码中调用 GPIO_writePin ()会导致整个 CPU 挂起、否则执行似乎在空间中丢失。

该设计的链接

使用 从内部调用的 GPIO_writePin ()库函数尝试设置 GPIO 引脚(正确配置为在 CLA1控制下)  __interrupt void Cla1Task1 ( void )。
CPU 似乎完全停止运行正确的代码、中断不再发生等

调查崩溃、我已将问题确定为  GPIO_writePin ()中的以下行:

引脚掩码=(uint32_t) 1U <<(引脚% 32U);

具体而言、它是导致崩溃的变量的"<"运算符。 更改为  

引脚掩码=(uint32_t) 1U <<(9);

解决该问题。

更多信息

使用中的剪切粘贴 my_GPIO_writePin()函数(&P):。 CLA 文件中、我已经更改了使用查找表这一行

静态常量 uint32_t bitmap[32]={1<<0、
1<<1、
1<<2、...
 1U<<31};


 pinMask = BITMAP [pin%32];

一切都按预期运行。

 从 CPU (不是 CLA1)代码调用 GPIO_writePin ()总是按预期工作。

我找到了解决方法后、我将此问题作为缺陷报告或其他形式提交、以供您分析、或者向我指出我漏掉了一些东西的地方。

谢谢!
-Alon

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

    您好、Alon、

    感谢您分享反馈。  您是否可以尝试按照本主题中详述的步骤操作: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/406803/toggling-a-gpio-on-cla 

    从您尝试执行的操作中、应该可以使用现有的 driverlib 来切换 GPIO。 您能否确认是否在中包含函数调用  

    Fullscreen
    1
    GPIO_setControllerCore(uint32_t pin, GPIO_CoreSelect core);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    此函数用于配置哪个内核拥有指定引脚的数据寄存器 (数据、设置、清除和切换)。 内核参数是 指定内核的枚举数据类型、例如 GPIO_CORE_CPU1_CLA1、用于使 引脚的 CPU1 CLA1控制器。

    以下是一篇论坛帖子、您可以参考其中包含几乎类似的问题: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/406803/toggling-a-gpio-on-cla 

    请告诉我您的发现。

    此致、

    Ozino

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

    尊敬的 Ozino:

    感谢您的答复。

    GPIO 访问不是我的问题。 这只是一个例子,我使用它,因为它发现了一个更严重的问题。

    我的问题是、很可能是 C2000生成了错误的代码、或者暴露了芯片错误。

    我重新表述问题:

    以下来自 Cla1Task1中的函数调用 会导致 CLA1上的所有中断被禁用或严重故障、也可能会导致 CPU1上的所有中断、此外可能还会导致其他一些损坏。

    静态内联 void cla_test (uint32_t x)

     易失性 uint32_t y;
     Y=1<<x;
    }

    __interrupt void Cla1Task1 ( void )


      CLA_TEST (9);

    使用调试器、我可以看到 CPU1中的代码的主循环正在运行、中断未正确运行-看起来它们被部分禁用或产生了错误的行为、CLA1中断代码根本不运行、PWM 信号垃圾等
    谢谢!
    -Alon。

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

    您好、Alon、

    感谢您的澄清。  我会尝试重新创建此测试用例、如果我能够复制您的设置、我们也会联系您。

    此致、

    Ozino

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

    因此、我尝试了重新创建您的测试设置、但我无法观察到您的问题。 下面是我的测试场景:

    从 C2000Ware 中导入 cla_ex4_pwm_control 示例。  

    修改.cla 文件以将代码片段添加到现有 ClaTask1例程中、同时使用一些附加代码在左移完成时更改 y 值。 已编译并刷写到目标中。

    • 我添加了一个调用 _mdebugstop()的行。 这允许我们在运行时暂停 CPU 并调试 CLA。

    并将符号加载到 CLA 内核。

    已运行 CPU 并等待.cla 文件中暂停。 然后、我运行并观察 y 变量的状态、并看到预期行为。

    然而、当在没有代码行的情况下运行同一代码来停止 CPU 时(mdebugstop)、我注意到不正确的值、但其余的系统性能将正常执行。

    您能否尝试使用 C2000Ware 中的示例中描述的代码来调试 CLA、并对其是否有效进行比较?

    此致、
    Ozino