将常量数据固定在Flash中的固定地址
将常量数据固定在Flash中的固定地址关于STM32F103数据定位的问题,将数据固定在Flash中。我想将一些主应用程序参数放置在Flash的固定位置,以便我的引导程序能够了解已安装的应用程序。目前取得了一些进展。
在STM32CubeIDE中,我在主应用程序代码(main.c)中添加了以下内容:
uint32_t const Version__attribute__((section(".AppInfo"))) = 0x12345678UL;
uint32_t const Features __attribute__((section(".AppInfo"))) = 0xDEADC0DEUL;
在链接脚本(.ld文件)中,我在.isr_vector (0x08002000)和.text之间添加了以下内容:
.AppInfo 0X08003000 :
{
. = ALIGN(4);
KEEP(*(.AppInfo))
. = ALIGN(4);
} >FLASH
检查了.map文件确认这种方式是有效的,但在向量表和AppInfo之间会出现一个巨大的Flash空间空洞,然后.text段才开始。
有没有办法让链接器将这个数据混合到.text区域中?我希望能够控制AppInfo的位置,或者我是否应该直接选择ISR向量表之后的下一个边界
使用 __attribute__((at(address))) 将常量数据放置在指定的地址。 绝对地址定位 用AT>语法 若数据量较小,可直接将其合并到.text段,通过符号标记位置 若允许灵活位置可将.AppInfo紧接向量表后,通过符号或相对偏移访问。 通过编译器指令或链接脚本,可以将常量数据固定在STM32 Flash的指定地址。 修改Flash中的数据需要先擦除整页,可能导致其他数据丢失 修改 .ld 文件,添加自定义段并指定其起始地址 当需要将少量数据精确放置在特定地址时,可直接通过 __attribute__((at())) 实现 /* 定义新的Flash区域 */
FLASH_DATA (rx) : ORIGIN = 0x08010000, LENGTH = 0x1000
SECTIONS
{
/* 将特定节区放入新定义的Flash区域 */
.my_data :
{
KEEP(*(.my_data))
} > FLASH_DATA
} 在需要将一些配置数据或校验和等重要信息存储在特定位置 在链接脚本中定义该节的地址和大小。 编译后生成的.map文件会显示变量的实际地址 指定的地址不会与其他数据或代码发生冲突。 const uint8_t data[] __attribute__((at(0x08010000))) = {...};将数据存储在地址0x08010000处 .ld 文件中将 Flash 划分为多个区域 static const uint8_t s_acBmp**030 __attribute__((at(0X800F000))) = {0x80, 0xC0, 0xC0, 0xC0, 0xC0...};
Flash的读写操作通常需要按字(4字节)或半字(2字节)对齐。 通过链接脚本定位数据
页:
[1]
2