MCU中如何将字符串指定到确定的链接地址
要把某个字符串(常量)放到固定地址,推荐用“自定义段 + 链接脚本/散装文件固定该段地址”。不要只写一个固定地址指针(那样地址处的数据不会被链接器自动放进去,除非你另外烧录)。
下面分别给 GCC(ld) 和 ARMCC(AC5 scatter) 的做法。
方案 A(推荐):放到固定 Flash 地址(由链接器保证)
1) C 里把字符串放到自定义 section
// 放在任意 .c 文件里
__attribute__((section(".fixed_str"), used))
const char g_fixed_str[] = "POWER_BOARD_APP:1.2.3";
used/KEEP 是为了防止链接优化把它丢掉。
2) GCC:在 .ld 里把该 section 固定到地址
在你的链接脚本里加一段(地址换成你要的,比如 Flash 尾部):
/* 例:固定到 0x0800FC00(请确认没和别的段冲突) */
.fixed_str 0x0800FC00 :
{
KEEP(*(.fixed_str))
} > FLASH
方案 B:ARMCC(AC5) 用 scatter 文件固定地址
1) C 里同样放到指定 section 名
__attribute__((section("FIXED_STR"), used))
const char g_fixed_str[] = "POWER_BOARD_APP:1.2.3";
2) 在 .sct(scatter)里创建一个固定地址的执行区放它
示例结构(你需要把它合并到现有 scatter 中,地址/大小按需调整):
; 在 scatter 文件里新增一个执行区,把 FIXED_STR 放进去
LR_IROM1 0x08000000 0x00010000 {
ER_IROM1 0x08000000 0x0000FC00 { ; 先放常规 RO
* (+RO)
}
ER_FIXED 0x0800FC00 0x00000400 { ; 固定区域
*(FIXED_STR)
}
}
方案 C(仅“读取固定地址”):固定地址指针(不负责放置数据)
如果你只是想读取某固定地址已有的字符串(比如出厂信息区),可以:
#define FIXED_STR_ADDR (0x0800FC00u)
const char * const g_fixed_str_ptr = (const char *)FIXED_STR_ADDR;
注意:这不会把 “…” 放进该地址;该地址内容必须已被你单独烧录或由其他镜像生成。
关键注意点
-
固定地址必须在有效的 Flash/RAM 范围内,且不与 .text/.rodata/.data/.bss 等重叠。
-
常量字符串通常放 Flash(RO);放 RAM 需要另外做段和初始化策略。
