一、将关键信息写入MCU固定字段
RISC-V架构
比如程序版本信息等需要在烧录时就写入MCUflash的固定字段
首先将关键字进行声明
// 使用结构体定义
#pragma pack(push, 1)//1字节对齐
typedef struct {
uint32_t magic;
uint32_t version;
uint32_t size;
uint32_t crc;
} FirmwareHeader_t;
#pragma pack(pop)
//先用关键字进行声明
__attribute__((section(".firmware_header"))) FirmwareHeader_t firmware_header = {
.magic = 0x464F5441, // "FOTA"
.version = 1,
.size = 0, // 编译后用脚本填充
.crc = 0 // 编译后用脚本填充
};
修改链接文件
在link.ld文件中加入关键字字段内容
/* 在Flash起始位置强制放置头部 */
.firmware_header :
{
KEEP(*(.firmware_header))
} >FLASH
编译查看MAP文件

在map文件中找到我们标记的关键字字段,发现数字存储在0x0000000000001920地址,我们进行打印,注意修改代码后这个地址会变,写好编译代码后在进行修改打印地址即可。

我们将地址内容打印出来看是否正确

打印结果正确那我们如何写入固定的地址呢?
写入固定地址
修改链接文件



一、地址计算与空间分配
第1-2行:原始地址与空间预留
复制
.firmware_header 0x0000000000001a6c 0x35a4
当前链接器位置 :
0x1A6C(编译后代码结束地址)预留空间大小 :
0x35A4= 13,732字节此时链接器计算:如果从
0x1A6C继续放置,头部会紧挨着代码。
第3行:强制地址跳转
0x0000000000005000 . = (ORIGIN (FLASH) + 0x5000)
关键操作 :链接器强制将当前地址指针跳转到0x5000
表达式含义 :
FLASH起始地址(0x0000) + 0x5000 = 0x5000目的 :将
.firmware_header段固定 在Flash的 20KB偏移处
第4行:填充空洞
*fill* 0x0000000000001a6c 0x3594
填充起始 :
0x1A6C填充大小 :
0x3594= 13,716字节填充内容 :全
0xFF或0x00(取决于Flash擦除状态)作用 :填补
0x1A6C到0x5000之间的空隙可视化:
复制
Flash布局: [代码] 0x00000-0x01A6C (6.7KB) [填充] 0x01A6C-0x05000 (13.7KB) ← 浪费的空间 [头部] 0x05000-0x05010 (16B)
第5-7行:实际放置头部
复制
*(.firmware_header) .firmware_header 0x0000000000005000 0x10 ./User/IAP.o 0x0000000000005000 firmware_header
最终地址 :
0x5000(20KB处)实际大小 :
0x10= 16字节来源文件 :
./User/IAP.o符号名称 :
firmware_header
根据解释来讲原本在0x1a6c地址存放数据,在存放前进行了强行地址跳转到了0x5000,再将0x1a6c到0x5000数据进行了填充填充数据为0,因为从0x1a6c打印出来的数据为0。在将数据存放到0x5000处。
