变量的值被意外更改

Value of variables are changed unexpectedly

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

我定义了一个全局变量:

静态 uint8 Dcm_Cbk_Gu8_FirstReqAfterReset = 1;

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

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

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

谁知道原因,能否请您拓宽我的知识面?谢谢!

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

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

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

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

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

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