【发布时间】:2014-12-08 09:04:32
【问题描述】:
我正在 ST ARM 微控制器上进行一些编程,其中一部分我需要将一些数据存储在闪存中,这些数据将在启动时保持不变。
为了在我的项目中保持一致性,我想在我的链接描述文件中定义这些数据的位置,然后在我的代码中使用这个变量。我已经这样做了(针对两个不同的区域)。
我的链接器脚本的相关部分:
MEMORY
{
flash : org = 0x08000000, len = 60k /* Standard boot - No bootloader */
flash_config_info : org = 0x0801F800, len = 1k /* Location for config info storage */
flash_boot_info : org = 0x0801FC00, len = 1k /* Location for boot info storage */
ram : org = 0x20000000, len = 20k
}
我的启动信息部分的标题:
#ifndef BOOTLOADER_H_
#define BOOTLOADER_H_
#include <stdint.h>
extern uint32_t flash_boot_info;
#define BOOT_INFO_PAGE_ADDRESS (&flash_boot_info)
//...
#endif
我的配置信息部分的标题:
#ifndef INFO_H_
#define INFO_H_
#include <stdint.h>
extern uint32_t flash_config_info;
#define INFO_CONFIG_PAGE_ADDRESS (&flash_config_info)
//...
#endif
我的问题:我在链接时收到关于 flash_boot_info 变量的“未定义引用”错误。我没有收到关于flash_config_info 的相同错误。需要注意的是,如果我切换变量的名称,错误会跟随引用的位置,而不是变量(当引用 flash_boot_info 时,我会收到关于 flash_config_info 的错误)。
有没有人知道为什么会发生这样的错误?我在引用变量的方式上没有发现任何差异,但我将不胜感激。
谢谢!
【问题讨论】:
-
检查项目设置中的链接器配置,可能
0x0801FC00地址没有正确定义。您是否尝试过使用该地址“玩耍”?比如你知道0x08000000很可能是合法地址,所以把flash段的长度从60k改为59k,然后在0x0800EC00分配flash_boot_info段。 -
另外,不要将
-Text=等与自定义链接器文件一起使用。对于这种情况,ld 可能会发出警告,因为如果您使用 memory region 并使用-Text等指定它们应该在哪里,它会做一些非常奇怪的事情。跨度>
标签: c linker arm linker-errors undefined-reference