自定义段分配至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
相关产品推荐
相关产品推荐

