用SDRAM刷ltdc有白线会出现是啥情况
在keil中仿真程序时,结构体变量出现错乱
什么是 GPIO 事件?如何将事件关联到外设
中断服务程序抖动
STM32L562DK探索板——如何启用蓝牙功能?
自己写驱动深入学习与调用Hal库的取舍
关于最近学习C语言回调和钩子函数的想法,以及对HAL库回调函数的困惑
STM32 上同时跑 LWIP 的 TCP 与 UDP 连接
使用 HAL 库通过串口以 ASCII 形式发送整型数据
USB Host 外部中断按键失效
微信公众号
手机版
核心方案
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 一模一样!