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/TMS320C2.8344万:初始化静态变量和全局变量

Guru**** 2501685 points
Other Parts Discussed in Thread: C2000WARE, CONTROLSUITE

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/592991/ccs-tms320c28344-initializing-static-and-global-variables

部件号:TMS320C2.8344万
主题中讨论的其他部件:C2000WAREcontrolSUITE

工具/软件:Code Composer Studio

注:这实际上是用于TMS320C2.8075万,但E2E不能识别该部件号。


根据TMS320C28x C/C++编译器手册,在“初始化静态变量和全局变量”一节中,未显式初始化的静态变量和全局变量将保持未初始化状态,这违反了C标准,该标准要求将它们初始化为零。

 

我们刚刚注意到手册中的这一陈述,我们处于后期阶段,更改我们的代码以解决这一问题将会带来一些痛苦。  根据我所做的实验,手册实际上并不正确。  据我所了解,静态和全局变量已正确初始化– 我假设在应用程序代码之前运行的某些启动代码中。  我在从内部闪存或外部EEPROM启动时测试了此问题(我们同时使用这两种方法)。  每次我拉动处理器的复位引脚以重新启动它时,以前设置为非零值的变量都将重置为零,而我们的代码中没有显式初始化。

 

其他一些详细信息:

  • 我们正在使用--rom_model链接器选项。
  • 我们不在链接程序命令文件中指定填充值。

 

您能否确认,尽管手册中有相反的说法,我们仍可以依赖所有静态和全局变量的初始化?


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

    联合国办事处,

    对您的问题的几个评论:

    部件号应为F2.8075万,而不是C2.8075万;

    2.这更可能是编译器问题而不是CCS问题,因此最好将其移至编译器论坛;

    3. 您查看了哪个版本的TMS320C28x C/C++编译器手册? 最新版本应为SPRU514M,您可以查看的整个会话

    6.12 重新初始化静态变量和全局变量;

    4. F2.8075万具有ECC功能,我们将通过在相应的RAM块寄存器中设置相关的初始位来支持RAM初始化(到零)(请参见TRM中的2.11。1.9 RAM初始化一章),这与以前的传统C2000器件不同。

    我既不是C2000 BU的专家,也不是编译器团队的专家,因此您还应该从他们那里听到更多的想法。

    此致,

    张卫健

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

    尽管手册中有相反的说法,您能否确认我们可以指望所有静态和全局变量的初始化?[/QUOT]

    很遗憾,不是  手册正确。  Wiki文章 未初始化的静态对象未在COFF中设置为零 将更详细地讨论此问题,同时以相同的方式结束。

    UNOAhead 说:
    据我所能看出,静态和全局变量正确初始化– 我假设在应用程序代码之前运行的某些启动代码中。

    如果发生这种情况,则不是因为编译器执行了任何操作,也不是因为编译器随附的RTS库中的任何操作。  恐怕您别无选择,只能深入了解启动代码的详细信息,并准确了解此初始化的发生方式。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ricky,非常感谢您的回复。 办事处代表我提出了原来的问题。

    正如您所指出的,F2.8075万中的所有RAM都有ECC或奇偶校验,因此必须初始化以防止出现错误。 TRM的3.2 部分表示此初始化由引导ROM执行。

    这似乎是一个好消息,因为它说我可以指望启动时总是发生初始化。 为了证实这一点,我尝试了最后一个实验,但不幸的是,我对结果感到失望。 运行代码后,我检查了LSxINITDONE寄存器的内容(我的静态变量存储在LS RAM中)。 我希望看到LSxINITDONE位设置为1,这表示内存已由引导ROM初始化。 但我惊讶地发现所有的位都是0。 如果我使用LSxINIT寄存器进行初始化,则LSxINITDONE中的位将更改为1。

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


    您是否为设备执行了开机重置或XRS型重置? RAM初始化不是对所有重置执行的。 如果通过调试器重置,它将不会运行RAM初始化。
    注意:如果要查看引导源,它位于C2000Ware (~\libraries\boot_rom\f2807x)中。

    此致
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    宾果! 谢谢Chris (还有Ricky,George和Antunahead)。 问题是我正在通过调试器重置,以便观察寄存器。 相反,我设置了一个LED来告诉我寄存器状态,并在我通过重启来重置时获得预期结果。

    感谢指向引导源的指针。 我安装了controlSUITE,而不是C2000Ware,但我在c1brom_Init_Boot.asm中找到了文件并找到了内存初始化语句。

    再次感谢--这是一个很大的帮助。