STM32L4A6 SDMMC 无法使用 1.8V IO 驱动 microSD 卡
STM32L4P5xx 系统内 Bootloader:RAM3 能否用作栈指针内存?
在 STM32CubeIDE 中生成 ioc 配置文件
CAN 总线多节点环境下进行固件升级
在 Bootloader 运行期间保持 GPIO 引脚电平状态不变
把 MCO1 时钟源选为 PLLCLK会怎样
I2C 错误代码含义
CubeIDE 下载程序时不整片擦除芯片
在编译C++ STM32项目时,如何将.hpp文件扩展名与合并了头文件声明和源文件定义的模板
sscanf 函数无法正确读取浮点值
微信公众号
手机版
核心方案
GCC 方案通常分为两步:
__attribute__将变量放置到该段中。第一步:修改链接脚本 (
.ld)打开你项目中的
.ld链接脚本(通常命名为STM32XXXXXX_FLASH.ld),修改其内容以实现精确指定地址。修改内存区域 (
MEMORY)在
MEMORY块中,添加一个新的内存区域,并指定好起始地址 (ORIGIN) 和大小 (LENGTH)。 ldORIGIN和LENGTH的值需要根据你的芯片手册和需求进行修改在
SECTIONS块中,为你的变量定义一个输出段,并指定放置到上面刚创建的内存区域。 ld(NOLOAD)属性是关键,它告诉链接器不要在程序启动时初始化该段的内容,这与__no_init的作用相同。第二步:修改源代码
完成链接脚本的修改后,回到你的 C 文件,声明变量如下:
define RTP_SIZE_AR (128) // 根据实际情况定义数组长度
/ 使用 attribute 指定该变量放入 .my_noinit 段 / attribute((section(".my_noinit"))) volatile short rtp_rin_ni[RTP_SIZE_AR]; 同时,在定义中建议加上
volatile关键字,防止编译器对该内存访问进行过度优化。.noinit (NOLOAD) :
{ . = ALIGN(4);
*(.noinit) *
(.noinit*)
} > RAM
#define __no_init __attribute__((section(".noinit")))
__no_init int keep_data; // 和 IAR 一模一样!