说说我今天使用CUBEMX2的感受
L9663驱动开发
终于找到了STM32C542RC开发板的官方实例
使用我自己写的 IAP 跳转到 FLASH 应用程序时,串口上出现无关字节
Error[Lp015]: section placement failure内容占用溢出
STM32F7由USB FS读写QSPI flash
STM8L050J3使用SWIM下载方式,无法下载,总是报错
用SDRAM刷ltdc有白线会出现是啥情况
在keil中仿真程序时,结构体变量出现错乱
什么是 GPIO 事件?如何将事件关联到外设
微信公众号
手机版
核心方案
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 一模一样!