我正在li环境中编写嵌入式代码,我遇到了一个以前从未遇到过的奇怪问题。除了在运行时之前初始化的常量变量外,所有全局变量都被设置为数据类型的最大值。例如:
我定义了一个全局变量:
static uint8 dcm_cbk_gu8_first streqafterreset = 1;
但是,无论初始值是什么,变量的值总是被设置为255。我确信变量还没有在代码的任何地方使用。如果数据类型为uint16,则该值始终为65535,直到在运行时更改。不管数据类型是什么,所有的全局变量都是这样。
请注意,如果全局声明变量并在运行时初始化,则不会发生这种情况,但这种方式违反了编码约定。
实际上,在另一个环境中(由make构建)一切都很好,但是当我合并代码(*.c,*h)并将整个链接器文件移动到另一个环境(由Scon结构构建)时,我得到了这个问题。使用的MCU是chorus 10M (SPC58NH92)。
谁知道原因,你能拓宽我的知识面吗?谢谢你!由于问题中的信息有限,很难给出一个明确的答案。不过,我可以告诉你在我看来它是什么样子。
初始化的全局变量或静态变量组成.data节。这些值应该存储在只读内存中(通常在。text中),并且应该在程序启动过程中复制到。data段中。
如果在启动例程中没有适当的代码来复制这些值,它们将被不初始化。因此,请检查您是否有这样的代码。(我确实在greenhill环境中工作,我们没有编译器提供这样的代码。我们可以选择自己编写它,或者不使用。data段并初始化main开头的所有内容。
然而,这不可能是你的全部问题。您可能有也可能没有正确的启动代码。如果您正确设置了内存段,但缺少启动代码,我希望在RAM中看到随机值。对我来说,一致的0xFF看起来像以下两种情况之一:
- 将所有RAM初始化为0xFF的启动代码,以及在此之前加载(并覆盖)或根本不加载的值
- 您的链接器文件没有正确设置,并且位于闪存中的.data段而不是RAM(未初始化的闪存通常都是0xFF,这就是您所看到的)。
我认为第二个更有可能,但我既不知道硬件的内存映射也不知道链接器定义文件中的设置。你得自己检查一下。