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/F28M35H52C:将全局变量的内容设置为与声明相同的行

Guru**** 2601585 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/675201/ccs-f28m35h52c-set-contents-of-global-variable-in-same-line-as-declaration

器件型号:F28M35H52C
Thread 中讨论的其他器件:controlSUITE

工具/软件:Code Composer Studio

当我 执行以下操作时、当我运行代码而不是包含我指定的数据时、变量会被调零。

uint16 myVar[2]={1、2};//这是在  主例程之前声明为全局的主源文件中

在 源文件中、您是否可以在声明所在的行中不再设置全局变量、或者是否有某些项目设置允许您启用/禁用此变量? 我最近从 使用编译器6.4.6的 CCS 6.1.1迁移到使用编译器16.9.6的 CCS 7.4.0。 我启动了一个新项目、该项目从旧项目中大量拉出 、并注意到我无法再在与我声明的同一行中设置变量。

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

    如果我将 const 限定符放在前面、它会保持声明中的值。 根据我需要执行的操作、这是可以的、但我不理解为什么不使用 const 限定符会导致全局变量不使用声明中的初始化值。

    uint16 myVar[2]={1、2};//运行时此全局变量包含所有零

    const UINT16 myVar2[2]={1、2};//在运行时此全局变量具有初始化值

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

    [引用 user="RS"] uint16 myVar[2]={1、2};//运行时此全局变量包含所有零

    然后、执行此初始化的启动代码中出现了问题。  请在  C28x 编译器手册中标题为"变量自动初始化"的部分中阅读相关内容。  如果这不能帮助您找出问题所在、那么我们需要一个测试用例。  如果您的代码组织为 Code Composer Studio 项目、请提交项目。  按照文章 Project Sharing 中所述对其进行压缩、然后将该 zip 文件附加到您的下一篇文章中。

    谢谢、此致、

    乔治

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

    e2e.ti.com/.../concerto.zip

    那么、cmd 文件中可能有什么东西呢? 编译器文档中没有任何内容会跳出来、但我对编译器和内存分配不是很熟悉。 附件是一个我发现问题的项目。 如果你在 main 中中断、你可以检查全局变量并看到它包含所有零。 谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为这与尝试为 C28上的.ebss 段使用共享 RAM 有关。

    在我的存储器部分的 cmd 文件中

    RAMS07- :origin = 0x00C000、length = 0x008000

    在我的部分中

    ebss :> RAMS07-, PAGE = 1.


    在 ARM 上、我执行以下操作以授予 C28访问共享 RAM 的权限:

    //将共享内存块的控制权交给 C28处理器

    RAMMReqSharedMemAccess (S0_ACCESS、SX_C28MASTER);

    RAMMReqSharedMemAccess (S1_ACCESS、SX_C28MASTER);

    RAMMReqSharedMemAccess (S2_ACCESS、SX_C28MASTER);

    RAMMReqSharedMemAccess (S3_ACCESS、SX_C28MASTER);

    RAMMReqSharedMemAccess (S4_ACCESS、SX_C28MASTER);

    RAMMReqSharedMemAccess (S5_access、SX_C28MASTER);

    RAMMReqSharedMemAccess (S6_ACCESS、SX_C28MASTER);

    RAMMReqSharedMemAccess (S7_ACCESS、SX_C28MASTER);


    在 C28上、我不确定它相对于在 ARM 上执行的上述代码的距离。 也许 C28会在执行之前引导、或者我还需要在 ARM 上为 C28访问共享 RAM 执行更多操作吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这看起来是正确的设置。 您是否已将 ebss 切换到 LxRAM 以确认行为是否已修复? 我建议在本地 RAM 中设置这些段、除非您对为什么不能设置这些段有一些例外。

    controlSUITE 中还有一个"RAM 管理"示例。

    此致
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、切换到以下选项修复了全局变量初始化问题。

    ebss :>> RAML2 | RAML3 | RAMM1, PAGE = 1.

    共享 RAM 正被用于.ebss、因为它需要保存一个非常大的全局变量(另一个处理器的闪存代码)。 我猜、由于上述更改、该项目的一部分不再起作用。 我没有尝试、因为我正在处理项目的不同部分。

    似乎我还应该将该数据存储在共享 RAM 中、而不是将.ebss 设置为使用共享 RAM? 是这样吗? 或者、是否有更好的方法来存储非常大的信息、而不使用.ebss 的共享 RAM?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、好的。
    您可以使用 pragma DATA_SECTION ()(请参阅我提到的示例)将阵列放置在共享存储器中并保持 ebss 分配给本地。 可以尝试一下。
    我假设您的操作可能正确,但也要检查您的 RAMReqSharedMemAccess()在 IPC 调用启动 C28之前是否被调用。 这可确保在 C28开始分支并运行应用程序之前将共享内存分配给它。

    此致
    Chris