You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义段分配至Flash固定内存地址失败问题排查与解决

解决自定义.ReservedCRC段无法放置到Flash固定地址0x0001FFFC的问题

我之前碰到一个棘手的问题:想创建一个名为.ReservedCRC的自定义段,专门用来存放CRC值,计划把它固定到Flash的0x0001FFFC地址上,但查看链接器映射文件后发现,const数组StoredCRC根本没被分配到这个位置。经过一步步调试调整,终于搞定了这个问题,下面把具体操作分享给大家:

1. 保留代码中对自定义段的指定

首先,代码层面已经把StoredCRC数组绑定到.ReservedCRC段了,这部分不需要改动:

__attribute__( ( section(".ReservedCRC") ) )const unsigned long StoredCRC[1] = {0x69FB9601};

2. 在MEMORY配置中新增CRC专属内存区域

修改链接器脚本的MEMORY模块,添加一个专门的CRC区域,精准指向目标地址0x1FFFC,长度设为4字节(刚好容纳一个unsigned long类型的值):

MEMORY {
 FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x1FFFC /* 128k */
 CRC (rx) : ORIGIN = 0x1FFFC, LENGTH = 4
 /* RAM_CODE (rwx) : ORIGIN = 0x10000000, LENGTH = 0x8000 32k executable code area in RAM */
 RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x8000 /* 32k */
}

3. 在SECTIONS配置中绑定.ReservedCRC段到CRC区域

接着在SECTIONS部分,明确指定.ReservedCRC段的起始地址为0x0001FFFC,同时关联到刚创建的CRC内存区域,还要用KEEP()指令确保这个段不会被链接器优化丢弃:

SECTIONS {
 (other section definitions)
 /**************************************
 Create new section for CRC storage at fixed location at the top of flash in "CRC" memory region.
 **************************************/
 .ReservedCRC 0x0001FFFC: {
 . = ALIGN(4);
 KEEP(*(.ReservedCRC*))
 } > CRC
}

验证最终结果

修改完成后重新编译项目,再看链接器映射文件,就能看到StoredCRC已经稳稳地被放置到目标地址0x0001FFFC了:

.ReservedCRC 0x0001fffc 0x4
 0x0001fffc . = ALIGN (0x4)
 *(.rodata*)
 *(.ReservedCRC*)
 .ReservedCRC 0x0001fffc 0x4 ./Source/functions.o
 0x0001fffc StoredCRC

内容的提问来源于stack exchange,提问作者Gregory Helton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:07:31