【发布时间】:2021-10-17 22:19:32
【问题描述】:
我正在 GHS 环境中编写嵌入式代码,我遇到了一个以前从未遇到过的奇怪问题。除了在运行时初始化的常量之外的所有全局变量都设置为数据类型的最大值。例如:
我定义了一个全局变量:
静态 uint8 Dcm_Cbk_Gu8_FirstReqAfterReset = 1;
但是,无论初始值是多少,变量的值始终设置为 255。我确信该变量尚未在代码中的任何地方使用。如果数据类型为uint16,则该值应始终为 65535,直到在运行时更改。好吧,它发生在所有全局变量上,不管数据类型是什么。
请注意,如果变量被全局声明并在运行时初始化,则不会发生这种情况,但这种方式违反了编码约定。
实际上,一切都在另一个环境中运行良好(由 make 构建)但是当我合并代码(*.c,*h)并将整个链接器文件移动到不同的环境(由 Scon 结构构建)时,我得到了问题。使用的MCU是合唱10M(SPC58NH92)。
任何人都知道原因,你能扩大我的知识吗?谢谢!
【问题讨论】:
-
看起来你没有加载器来初始化你的数据段(我已经在这样的环境中运行过)或者你的链接器部分设置不正确。但是,我希望看到随机数据,而不是所有 0xFF——这与未初始化的闪存比 RAM 更一致。
-
您的链接器文件是否会意外地将您的 .data 段指向闪存中的地址?然后加载程序无法成功设置值,未写入的闪存(几乎总是)全为 0xFF。
-
也许可以提供更多信息——也许是您的链接器定义文件?什么处理器? (顺便说一句,当我使用 GreenHills 时,iirc,我有一个没有初始化 .data 段的加载器环境)
-
谢谢!但我无法显示我的链接器定义文件,因为它归企业所有,我从客户那里获得了文件。实际上,一切都在另一个环境中运行良好(由 make 构建),但是当我合并代码(*.c,*h)并将整个链接器文件移动到不同的环境(由 Scon 结构构建)时,我遇到了问题。使用的MCU是合唱10M(SPC58NH92)。
-
我已经解决了这个问题,这是因为汇编启动代码不正确。我将我的启动代码与其他代码进行了比较,然后添加了 asm(".globl _start")、asm(".global __start") 和 asm(".align 4")。现在效果很好。但老实说,我不明白这些 asm 命令,为什么它们应该在那里。无论如何,非常感谢您的帮助!
标签: memory initialization embedded greenhills