硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4811|回复: 4
收起左侧

[STM32H7] 分享一个将变量灵活定义到外部内存的方法(MDK),有AC6和AC5两个版本

[复制链接]

15

主题

174

回帖

234

积分

高级会员

积分
234
发表于 2021-7-16 00:13:53 | 显示全部楼层 |阅读模式
今天学习了硬汉大哥的STM32H7教程第26章,对其中通过编辑链接器分散加载文件实现内存超方便使用的方法很感兴趣,因此特意去学习了关于ARM C库的知识,得到了将变量定义到外部内存的方法。正常定义一个变量到指定的地址范围有两种方法:
第一种 指定每个变量的实际物理地址
MDK AC6使用方法:在变量后面添加如下指令
__attribute__((section(".ARM.__at_0X2407FDFC")));
MDK AC5使用方法:在变量后面添加如下指令
__attribute__((at(0X2407FDFC)));
这种方法的优点为使用简单,基本不会出现其他问题,缺点也很明显,需要工程师规划好内存分配,在变量较多时比较麻烦
第二种 修改.sct文件,将内存块定义为一个节区
.sct文件修改内容
; RW data 512KB AXI SRAM
RW_IRAM2 0x24000000 0x00080000 {
*(.RAM_D1)

}
MDK AC6与MDK AC5使用方法一致:在变量后面添加如下指令
__attribute__((section(".RAM_D1")));
使用此方法即可让编译器管理内存分配,使用起来非常方便,但仅使用此方法定义外部内存时,会出现程序卡死的情况,为什么呢?
原来链接器会自动生成一个初始化节区的代码,在进入main函数之前就会执行,而此时我们的外部存储往往没有初始化,这时对其访问自然会产生错误,那么如何抑制链接器的这种行为呢?方法分为两步。
首先,保证外部存储所在的节区会被分配到ZI段,这样相当于告诉C编译器,内存可以不初始化。
MDK AC6保证保证编译器认定节区为ZI段的方法

__attribute__((section(".bss.EXRAM")));
在AC6中,.bss.是一定要有的,保证节区为ZI段,后面的内容可以自己定义
MDK AC5保证保证编译器认定节区为ZI段的方法
__attribute__((section("EXRAM"),zero_init));
在AC5中,对节区的名字没有要求

其次,修改.sct文件,告诉链接器内存不要初始化
.sct文件修改内容
AC6
;ZI data - 32MB EXRAM(0xC0000000)
  ZI_EXRAM 0xC0000000 UNINIT 0x02000000  {
   *(.bss.EXRAM)
  }

AC5
;ZI data - 32MB EXRAM(0xC0000000)
  ZI_EXRAM 0xC0000000 UNINIT 0x02000000  {
   *(EXRAM)
  }


加入UNINIT关键字,告诉链接器不要初始化

经过上述的两个步骤后,仅需要在变量后面加上
AC6
__attribute__((section(".bss.EXRAM")));
AC5
__attribute__((section("EXRAM"),zero_init));
即可实现变量在外部内存中定义,另外注意一点,用这种方法定义的全局变量是无法赋初值的,赋初值编译器会报错。
参考资料:《安富莱_STM32-V7开发板_用户手册,含BSP驱动包设计(V3.2).pdf》第26章 《Arm® Compiler Version 6.16 Reference Guide》

p565

p565

p564

p564


评分

参与人数 3金币 +90 收起 理由
滴滴滴 + 20
undertheapples + 20 很给力!
eric2013 + 50 赞一个!

查看全部评分

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115668
QQ
发表于 2021-7-16 09:07:29 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

15

主题

174

回帖

234

积分

高级会员

积分
234
 楼主| 发表于 2021-7-16 12:24:38 | 显示全部楼层

回复

使用道具 举报

1

主题

22

回帖

25

积分

新手上路

积分
25
发表于 2021-7-16 17:23:45 | 显示全部楼层
感謝分享,有說明出AC5,AC6 的相對差異,期待是否有關於malloc、free, 應用於SDRAM, RTX5 的分享呢?
回复

使用道具 举报

15

主题

174

回帖

234

积分

高级会员

积分
234
 楼主| 发表于 2021-7-16 19:30:33 | 显示全部楼层
James2jian 发表于 2021-7-16 17:23
感謝分享,有說明出AC5,AC6 的相對差異,期待是否有關於malloc、free, 應用於SDRAM, RTX5 的分享呢?

我发的第二个帖子里面有关于malloc和free重定向的方法,有兴趣的话可以看下。http://www.armbbs.cn/forum.php?m ... d=107885&extra=
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-11 03:21 , Processed in 0.223620 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表