1

我正在 GHS 环境中编写嵌入式代码,我面临着一个从未遇到过的奇怪问题。除了在运行时初始化的常量之外的所有全局变量都被设置为数据类型的最大值。例如:

我定义了一个全局变量:

静态 uint8 Dcm_Cbk_Gu8_FirstReqAfterReset = 1;

但是,无论初始值是多少,变量的值始终设置为 255。我确信该变量尚未在代码中的任何地方使用。如果数据类型为uint16,则该值应始终为 65535 ,直到在运行时更改。好吧,它发生在所有全局变量上,而不是数据类型。

请注意,如果变量被全局声明并在运行时初始化,则不会发生这种情况,但这种方式违反了编码约定。

实际上,一切都在另一个环境中运行良好(由 make 构建)但是当我合并代码(*.c,*h)并将整个链接器文件移动到不同的环境(由 Scon 结构构建)时,我遇到了问题。使用的MCU是合唱10M(SPC58NH92)。

任何人都知道原因,你能扩大我的知识吗?谢谢!

4

1 回答 1

1

由于问题中的信息有限,很难给出明确的答案。我可以告诉你它对我来说是什么样的。

初始化的全局或静态变量组成 .data 部分。这些值应存储在只读存储器中(通常在 .text 中),并应在程序启动例程期间复制到 .data 段中。

如果启动例程中没有适当的代码来复制这些值,它们将不会被初始化。所以,检查你是否有这样的代码。(我确实在 GreenHills 环境中工作,我们没有编译器提供此类代码。我们可以选择自己编写或不使用 .data 段并在 main 开头初始化所有内容)。

但是,这不太可能是您的全部问题。您可能有也可能没有正确的启动代码。如果您的内存段设置正确但缺少启动代码,我希望在 RAM 中看到随机值。一致的 0xFF 在我看来就像两件事之一:

  1. 将所有 RAM 预初始化为 0xFF 的启动代码,以及在此之前加载(并被覆盖)或根本不加载的值
  2. 您的链接器文件设置不正确,并且位于闪存而不是 RAM 中的 .data 段(未初始化的闪存通常都是 0xFF,这就是您所看到的。

我认为第二个更有可能,但我既不知道硬件的内存映射也不知道链接器定义文件中的设置。你必须自己检查一下。

于 2021-08-15T16:14:45.810 回答