关于H750VB的SDMMC开启DMA读写SD卡
F407的SDIO的硬件分流问题
与TF 卡 SDIO 通信报错:HAL_SD_ERROR_REQUEST_NOT_APPLICABLE
变量在循环体外出现未定义行为
强制类型转换不起作用
STM32 VSCode 扩展插件问题
在 CubeIDE 中为不同 RAM 区域定义带初始值的全局变量
FreeRTOS中为什么要以这种宏定义方式访问指定地址的值
当程序里有 while (1) 死循环时,main 函数还需要 return 0 吗?
编译器在结构体中插入了并不存在的 16 位变量?
微信公众号
手机版
核心方案
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关键字,防止编译器对该内存访问进行过度优化。