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.

[参考译文] CCS/TMS570LS3137:SYS_STARTUP.c 在/*中的_c_int00中复位、以斜体表示 C 全局变量*/段

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

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/780472/ccs-tms570ls3137-sys_startup-c-resets-in-_c_int00-in-initalise-the-c-global-variables-section

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

工具/软件:Code Composer Studio

我们有一个基于 TMS570LS3 HDK 的定制板。 我们将使用基于 TMS570LS31x_HDK_Connectivity 测试.zip 的代码。

开箱即用的代码、我们在收到实际电路板前开始进行更改。

我们现在有了该板、并开始使用来自 Spectrum Digital 的 XDS200调试代码。 它会进行编程并运行、但会卡在 sys_startup.c 的复位矢量中

当执行到达  /* initalise 时、C 全局变量*/段循环两次、在 (*处理程序)((const unsigned char *) loadAddr、runAddr)行第二次循环时、它会重置并进入同一个矢量并停留在循环中。

/*用斜体表示 C 全局变量*/
if (&_TI_Handler_Table_Base <&_TI_Handler_Table_Limit)
{
unsigned char ** tablePtr =(unsigned char **)__TI_CINIT_Base;
unsigned char ** tableLimit=(unsigned char **)__TI_CINIT_limit;

while (tablePtr < tableLimit)
{
unsigned char * loadAddr =* tablePtr++;
unsigned char * runAdr =* tablePtr++;
无符号字符 idx =*负载地址++;
handler_fptr 处理程序=(handler_fptr)(&_TI_Handler_Table_Base)[idx];

(*处理程序)((const unsigned char *) loadAddr、runAddr);
}
}

/*斜体禁忌症*/
如果(__TI_Pinit_Base <_TI_Pinit_Limit)
{
void (**p0)()=(void *)_TI_Pinit_Base;

while ((unsigned) p0 <_TI_Pinit_limit)
{
void (*p)()=*p0++;
P();
}
}

我们可以通过在上述代码周围放置#if 0和#endif 来初始化 C 变量或构造函数来解决该问题、但在存在已初始化数据的情况下会出现问题。

例如、我们还将 lwIP 端口 HALCoGen EMAC 驱动程序与 lwIP 演示结合使用、它具有未出现的初始化字符串变量。 我们将它们更改为 const 以强制它们进入闪存、但必须存在其他问题、即我们没有初始化的数据。

有什么想法、为什么这个开箱即用的示例代码无法初始化 C 变量?

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

    您对示例代码进行了哪些更改? 这似乎是与编译器相关的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们获得了开发套件的示例代码、并为启动器添加了一些 IO 设置。 初始化代码在我们到达主函数之前导致了复位。 为了测试代码、我们必须跳过初始化代码、但任何已初始化的数据都无法使用。 最终、我们开始使用 HALCoGen 生成一个新项目、并根据电路板进行定制。 我们生成了代码、它运行良好。 非常好的工具。