[STM32F1] 将常量数据固定在Flash中的固定地址

[复制链接]
 楼主| 我的牙白 发表于 2025-8-2 21:51 | 显示全部楼层 |阅读模式
flash, ap, App, pi, TE, ST
将常量数据固定在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向量表之后的下一个边界

hudi008 发表于 2025-8-4 12:43 | 显示全部楼层
使用 __attribute__((at(address))) 将常量数据放置在指定的地址。
robertesth 发表于 2025-8-4 13:51 | 显示全部楼层
绝对地址定位              
内政奇才 发表于 2025-8-4 14:57 | 显示全部楼层
用AT>语法
flycamelaaa 发表于 2025-8-4 15:58 | 显示全部楼层
若数据量较小,可直接将其合并到.text段,通过符号标记位置
powerantone 发表于 2025-8-4 16:59 | 显示全部楼层
若允许灵活位置可将.AppInfo紧接向量表后,通过符号或相对偏移访问。
biechedan 发表于 2025-8-4 17:30 | 显示全部楼层
通过编译器指令或链接脚本,可以将常量数据固定在STM32 Flash的指定地址。
kkzz 发表于 2025-8-4 19:26 | 显示全部楼层
修改Flash中的数据需要先擦除整页,可能导致其他数据丢失
updownq 发表于 2025-8-5 08:52 | 显示全部楼层
修改 .ld 文件,添加自定义段并指定其起始地址
fengm 发表于 2025-8-5 09:54 | 显示全部楼层
当需要将少量数据精确放置在特定地址时,可直接通过 __attribute__((at())) 实现
timfordlare 发表于 2025-8-5 10:50 | 显示全部楼层
/* 定义新的Flash区域 */
FLASH_DATA (rx) : ORIGIN = 0x08010000, LENGTH = 0x1000

SECTIONS
{
    /* 将特定节区放入新定义的Flash区域 */
    .my_data :
    {
        KEEP(*(.my_data))
    } > FLASH_DATA
}
biechedan 发表于 2025-8-5 11:42 | 显示全部楼层
在需要将一些配置数据或校验和等重要信息存储在特定位置
minzisc 发表于 2025-8-5 14:17 | 显示全部楼层
在链接脚本中定义该节的地址和大小。
albertaabbot 发表于 2025-8-5 15:57 | 显示全部楼层
编译后生成的.map文件会显示变量的实际地址
dspmana 发表于 2025-8-7 11:12 | 显示全部楼层
指定的地址不会与其他数据或代码发生冲突。
mnynt121 发表于 2025-8-7 14:16 | 显示全部楼层
const uint8_t data[] __attribute__((at(0x08010000))) = {...};将数据存储在地址0x08010000处
primojones 发表于 2025-8-8 11:38 | 显示全部楼层
.ld 文件中将 Flash 划分为多个区域
robertesth 发表于 2025-8-8 15:40 | 显示全部楼层
   static const uint8_t s_acBmp**030[len] __attribute__((at(0X800F000))) = {0x80, 0xC0, 0xC0, 0xC0, 0xC0...};
   
mollylawrence 发表于 2025-8-10 20:35 | 显示全部楼层
Flash的读写操作通常需要按字(4字节)或半字(2字节)对齐。
mmbs 发表于 2025-8-10 21:19 | 显示全部楼层
通过链接脚本定位数据              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

40

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部