当前位置: 首页 > wzjs >正文

广州网站改版 网站建设百度营销搜索推广

广州网站改版 网站建设,百度营销搜索推广,linux下wordpress,phpmysql网站开发笔记文章目录 一、代码示例:将变量固定到 Flash 0x08001000二、__attribute__((at(addr))) 的作用三、__attribute__((at(addr))) 可能导致的问题四、运行时修改 Flash 存储的变量五、在 GCC(STM32CubeIDE)中实现同样功能 在嵌入式开发中&#xf…

文章目录

  • 一、代码示例:将变量固定到 Flash 0x08001000
  • 二、__attribute__((at(addr))) 的作用
  • 三、__attribute__((at(addr))) 可能导致的问题
  • 四、运行时修改 Flash 存储的变量
  • 五、在 GCC(STM32CubeIDE)中实现同样功能


在嵌入式开发中,有时我们需要在 Flash 指定地址存储特定的标志位或常量数据,例如 Bootloader 标志、固件版本信息、校验码等。这时,可以使用 __attribute__((at(addr))) 关键字,将变量固定存放在指定的 Flash 地址。

一、代码示例:将变量固定到 Flash 0x08001000

以下代码用于将 custom_data 变量固定到 Flash 地址 0x08001000,并赋值 0x12345678:

#define CUSTOM_FLAG_ADDR 0x08001000
#define SET_COMPILE_ADDR(addr) __attribute__((at(addr)))SET_COMPILE_ADDR(CUSTOM_FLAG_ADDR) const uint32_t custom_data = 0x12345678;

代码解析:
#define CUSTOM_FLAG_ADDR 0x08001000 :定义 Flash 目标存储地址 0x08001000,该地址必须是空闲的,否则可能会覆盖已有的代码或数据。

#define SET_COMPILE_ADDR(addr) __attribute__((at(addr))) :使用 attribute((at(addr))) 指定变量存放的物理地址(仅适用于 ARM Compiler 5)。

SET_COMPILE_ADDR(CUSTOM_FLAG_ADDR) const uint32_t custom_data = 0x12345678 :让 custom_data 变量存放在 0x08001000,并初始化值为 0x12345678。

在这里插入图片描述

二、attribute((at(addr))) 的作用

__attribute__((at(addr))) 是 Keil ARM Compiler 5(ARMCC5) 提供的编译器特性,允许开发者在编译时强制将变量存放到指定的 Flash 或 RAM 地址。例如:

  • 用于 Bootloader 和应用程序通信

  • 存储设备唯一 ID、固件版本等不可变数据

  • 存储升级标志位

Tips:

  • Keil ARM Compiler 6(ARMCC6)和 GCC(STM32CubeIDE)不支持 attribute((at(addr)))

    1. ARMCC6 和 GCC 需要使用链接脚本(scatter 文件或 .ld 文件)指定存储区域,不能直接使用 attribute((at(addr)))。
  • 变量存放地址必须是 Flash 空闲区

    1. 如果 0x08001000 处已有数据或程序代码,custom_data 可能会破坏已有内容,导致程序崩溃。

    2. 需要先查看 Keil 生成的 .map 文件,确保 0x08001000 是可用的。

  • Flash 不能直接修改

    1. custom_data 存在于 Flash,而 Flash 不能像 RAM 一样直接赋值修改。

    2. 如果要修改该变量的值,必须使用 Flash 擦除 + 重新写入 操作(见后文)。

三、attribute((at(addr))) 可能导致的问题

直接使用 attribute((at(addr))) 可能遇到的问题:

  • 问题 1:Flash 代码段冲突

    如果 0x08001000 处有代码或数据,custom_data 可能会覆盖已有内容,导致程序崩溃。

    ✅解决方案:

    1. 查看 .map 文件 确保 0x08001000 是空闲的。

    2. 修改 scatter 文件 或 STM32CubeIDE 的 .ld 文件,手动指定存储区域。

  • 问题 2:Flash 不能直接写入

    由于 Flash 只能在擦除后写入,custom_data 变量的值 0x12345678 无法在运行时修改。

    ✅解决方案:

    1. 使用 Flash 读写 API 修改该地址的数据,而不是使用 attribute((at(addr)))。

四、运行时修改 Flash 存储的变量

如果 custom_data 需要在程序运行过程中修改,就不能直接用 attribute((at(addr))),而是应该使用 Flash 读写 API,如下所示:

#include "stm32f4xx_hal.h"#define CUSTOM_FLAG_ADDR 0x08001000  // Flash 目标地址void Write_CustomData(uint32_t new_value) {HAL_FLASH_Unlock(); // 解锁 Flash 写权限// 擦除 Flash 扇区(0x08001000 可能属于 SECTOR_1,需确认)FLASH_EraseInitTypeDef EraseInitStruct;uint32_t SectorError;EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;EraseInitStruct.Sector = FLASH_SECTOR_1;  // 需要根据具体 MCU 修改EraseInitStruct.NbSectors = 1;HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError);// 写入新值HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, CUSTOM_FLAG_ADDR, new_value);HAL_FLASH_Lock(); // 锁定 Flash
}

🔹 该函数的作用:

  • 先解锁 Flash

  • 擦除 Flash 对应扇区

  • 重新写入新的值

  • 锁定 Flash,防止误操作

📌 优点

  • 可以在运行时修改 custom_data,不会破坏代码。

  • 适用于需要存储状态标志、参数配置的场景。

五、在 GCC(STM32CubeIDE)中实现同样功能

由于 __attribute__((at(addr))) 不支持 GCC,我们可以在 STM32CubeIDE 或 ARM Compiler 6 中使用链接脚本(.ld 文件) 实现相同效果。

1. 修改 STM32F4xx.ld
在 MEMORY 段中添加:

FLASH_CUSTOM (rx) : ORIGIN = 0x08001000, LENGTH = 4

然后,在 SECTIONS 段中添加:

.custom_data_section :
{*(.custom_data_section)
} > FLASH_CUSTOM

2. 在代码中存放变量

const uint32_t custom_data __attribute__((section(".custom_data_section"))) = 0x12345678;

📌 综上结论

  • 如果数据不需要修改,可以用 attribute((at(addr)))(仅限 ARMCC5)。

  • 如果数据需要修改,建议使用 Flash 读写 API。

http://www.dtcms.com/wzjs/22739.html

相关文章:

  • flash怎么做电子书下载网站南京企业网站排名优化
  • 南昌网站建设制作商怎么宣传网站
  • 沈阳企业网站建设社群营销的十大案例
  • 化州网络推广seo免费诊断
  • html5网站 欣赏国内建站平台
  • 做网站和appgoogle搜索关键词热度
  • 南京做网站设计友情网
  • 房山企业网站建设公司招工 最新招聘信息
  • php网站后台入口北京seo优化诊断
  • 大理网站建设外链图片
  • 发外链的论坛网站电商的运营模式有几种
  • 常用企业客户资料网站泉州关键词优化报价
  • 如何建设诗词网站希爱力双效片的作用与功效
  • 中国建设教育协会网站打不开seo关键词排名优化专业公司
  • 建设小型网站价钱营销型网站策划
  • 刘娇娇做网站骗钱的网络营销是做什么的
  • 做网上兼职的网站网络推广运营途径
  • 网站开发规模和工作量的计算淘宝代运营公司十大排名
  • 学做网站平台网站seo入门基础教程书籍
  • 义乌做网站的公司windows系统优化软件排行榜
  • 定制网站建设制作网店推广是什么
  • wordpress版本成都seo的方法
  • 好的设计公司网站互联网推广的方式
  • 一个产品的市场营销策划方案百度seo优化工具
  • 申请免费网站建设西安疫情最新消息1小时内
  • 东莞网站建设开发网站技术制作
  • 东营建设网站公司谷歌浏览器直接打开
  • php网站建设含义广州seo优化公司排名
  • 福安市教育局建设网站菏泽地网站seo
  • 在线画画网站百度数据