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.

[参考译文] RTOS/TMS320F28335:意外的程序执行

Guru**** 2540720 points
Other Parts Discussed in Thread: TMS320F28335

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/596200/rtos-tms320f28335-unexpected-program-execution

器件型号:TMS320F28335

工具/软件:TI-RTOS

您好!  

我正在使用 闪存 API v2.10 在 TMS320F28335上执行闪存操作。  

我使用 Flash_CallbackPtr 馈送看门狗并发送 CAN 消息作为保持活动状态。

这是我的回调函数:

#pragma CODE_SECTION (Flash_Callback、"ramfuncs");

void Flash_Callback (void)

      静态 uint16 j=0;

      字节_p_Data[2]={1、0};  //擦除

      EALLOW;

      SysCtrlRegs.WDKEY = 0x55;       //提供看门狗#1 */

      SysCtrlRegs.WDKEY = 0xAA;       //并提供安全装置#2 *

      EDIS;

      J++;

      if (j>13900)

      {

            CANSendMessage (0x19D0133A、    0、_p_Data);//in ram

            J=0;

      }

当程序调用 Flash28335_Erase 函数时、程序执行擦除和回调(发送 CAN 消息)。 擦除完成后、程序执行会进入我不知道的位置、但不会停止。 一段时间后、DSP 重新启动。

如果我在重新启动前暂停执行、我总是会看到以下情况:  

 

此外、经过一些调查、我可以看到将 p_Data[2]声明为静态可解决问题、擦除后的程序执行是正常的。 对我来说,这是没有意义的,我想如果在其他地方,这是真正的问题。 请帮帮我。

这是开发环境:

DSP:TMS320DSP28335

编译器:6.2.5

XDCTools:3.30.004.52

SYS/BIOS:6.41.0.26

CCS:v6.1

此致、

帕洛马

 

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

    您好、Paloma、

    我们已将此主题交给 TI-RTOS 团队以获取反馈。

    如果您还没有、请查看以下资源:

    此致、
    Elizabeth

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

    它看起来像是0xC128在 RAM 存储器中。 是否可以查看映射到包含此存储器地址的 RAM 块的内容并进行报告?

    SAL

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

    抱歉、我犯了个错误、并附上了错误的屏幕截图。

    这是正确的。

    此致、  

    帕洛马

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

    器件是否复位?

    您能否检查 包含引导 ROM 状态的 RAM 位置?

    SAL

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

    实际上、我无法复位、因为器件不再复位。 我不知道发生了什么变化,很抱歉给您带来不便。

    现在、程序会产生运行时错误、并且中止执行:

     

    以下是我调用闪存 API 函数的方法:

          Dint;

          STATUS = EEPROM_Erase ();

          EINT;

    EEPROM_ERASE 完成后(与 EEPROM_Write 相同)、该程序会触发 EINT 和 Flash_CallbackPtr 函数。

     

    此外、在 Flash_CallbackPtr 函数中有一些我不理解的内容、也许它会提供一些信息。

    当_p_Data 声明为动态(字节_p_Data[2]={2、2};)时、初始化无法正常工作、两个元素都设置为0。 每个元件应该被单独初始化以获得正确的值。 不管怎样、该程序仍然无法正常工作。

    当_p_Data 被声明为静态字节_p_Data[2]={2、2}时、 初始化是正确的并且程序运行良好、无错误。

    此致、

    帕洛马

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    p_Data 在何处链接到存储器? 它位于什么存储器部分? 您可以从.map 文件中看到这一点。

    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的快速响应。
    在静态或非静态两种情况下、_p_Data 都是局部变量、因此不在*。map 文件中。 这是正确的,不是吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果它是函数的局部变量、则它不会显示在.map 中。 没关系。

    除非在该文件中暂停、否则无法查看静态变量。 您是否在初始化过程中都看到了确切的情况? 请单步执行装配体以查看差异是什么。

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

    这是我在停止程序时看到的。  

    _p_Data 的动态声明

    _p_Data 的静态声明

    帕洛马

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这并不一定意味着变量未被初始化。 编译器可能只是在第一种情况下使用它之前对其进行初始化。 "静态"和"易失性"可能会导致编译器在函数开始时在声明它们时对它们进行初始化。

    希望这对您有所帮助。

    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    之后、我将其用作 CAN 消息的数据。
    在 CAN 总线的另一侧,通过静态声明,我接收到‘1’,而通过另一个声明,我接收到‘0’。
    我可以通过其他方式证明它吗?

    谢谢、

    Plaoma
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我目前无法解释这一点。 如果您认为这是编译器错误、请将问题发布到编译器论坛。

    最后一个建议:在内存浏览器中查看在单步执行汇编时如何初始化阵列。

    初始化时、汇编代码有何不同?

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

    您好!

    我认为我发现了正在发生的情况。

    正如您所建议的、我已经逐步执行汇编代码、我可以看到 DSP 需要一个闪存地址来解码阵列动态初始化。

    此代码位于 Flash_CallbackPtr 中,因此无法访问该闪存地址。

    在其他初始化中,解码不需要闪存地址,因此 API 可以正常工作。

    你怎么看?

    这是否也能解释不可预测的执行或运行时错误?  

    此致、  

    帕洛马

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是可能的。 需要将调用闪存 API 的闪存 API 代码和代码加载到闪存中、然后从 RAM 复制并运行。

    SAL