操作MCU内存

一、将关键信息写入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字节

  • 填充内容 :全0xFF0x00(取决于Flash擦除状态)

  • 作用 :填补0x1A6C0x5000之间的空隙

可视化

复制

复制代码
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处。

相关推荐
Dr.kangder8 分钟前
嵌入式面试总结(十五)——异常处理
单片机·面试·职场和发展·系统架构·嵌入式
zlinear数据采集卡2 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
ACP广源盛139246256732 小时前
蚂蚁百灵 Ling‑3.0‑flash 开源 + 昇腾 0‑Day 原生适配@ACP#GSV9001E 在国产算力矩阵中的机会与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
Rocktech_ruixun4 小时前
机器人端侧大模型部署对主板有哪些要求?瑞迅主控板分级方案对比
人工智能·嵌入式硬件·机器人
Lzh编程小栈5 小时前
【嵌入式底层】SPI超透彻详解:通信原理、四线结构、四种模式、寄存器底层 + 面试全集
c语言·stm32·单片机·面试·职场和发展
Rocktech_ruixun5 小时前
机器人数据采集能力取决于什么?瑞迅科技RK3588/3576核心板方案深度解析
人工智能·嵌入式硬件·机器人
水果里面有苹果5 小时前
28-DRV8825PWPR步进电机驱动器
单片机
恒锐丰科技韩生6 小时前
率能 SS6625E|3.0~20V 单通道 H 桥直流电机驱动 SOP8 电子锁玩具机器人分享
嵌入式硬件·硬件工程
zlinear数据采集卡6 小时前
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Dr.kangder7 小时前
嵌入式面试总结(十八)——JTAG调试
嵌入式硬件·面试·职场和发展·架构·嵌入式