[APM32F1] 在APM32F103xE的SDRAM上申请动态内存、定义全局变量

[复制链接]
 楼主| zjh20070904 发表于 2022-6-26 15:49 | 显示全部楼层 |阅读模式

1 概述
APM32F103xE能外接SDRAM,使用SDRAM解决内部SRAM不够的应用场景问题,比如因为内部堆空间不够导致动态内存申请识别,无法定义大的全局变量数组。
当然读写SDRAM的速度是比读取内部SRAM慢的,尤其是频率大于48MHz时,访问SDRAM时会有频率限制,但是访问SRAM时没有频率限制,就是系统时钟的频率。
因此,动态申请的内存、定义的全局变量一般情况下是占用空间大、且对速度要求不高的场合。
本篇文章中涉及到的分散加载文件、map文件、堆、栈、ZIZW等概念可以到网上查找,以下主要记录了实现的方法、并验证该方法是可行的。
当然应该还有其它的方法,可以提出来一款探讨探讨。

2 自定义分散加载文件,SDRAM中既可以定义堆空间、也可以定义全局变量空间2.1 Keil工程配置2.1.1 Target配置
按照工程默认配置,不做修改。
2.1.2 Linker配置
1)在选择“Use Memory Layout from Target Dialog”的情况下完成编译,生成*.sct文件才能编辑,否则需要自行创建*.sct文件。(这也是一种偷懒的方法)
1.png

2.2 结合应用代码修改分散加载文件、定义堆大小
1)分散加载文件定义如下:
2.png

2)对应的代码如下
使用 __attribute__ 把定义的全局变量定义在SDRAM中,其中SDRAM_RW_ZI和分散加载文件中的名称对应上。
__attribute__只能用于全局变量、函数,因此局部变量是定义在内部SRAM中。
3.png
*.s文件中设置的堆大小如下
4.png

3)编译后关于变量的map文件如下
map文件分析,HEAP的起始地址是0x60000000,部分RWData定义在起始地址为0x60100000的内存空间中
5.png


2.3 代码运行现象
(1)   按照默认情况下定义的全局、局部变量在内部SRAM中
(2)   malloc申请内存空间在SDRAM开辟的堆中
(3)   通过 __attribute__ 修饰定义的全局变量在SDRAM中
(4)   通过 __attribute__ 修饰的静态变量在SDRAM中
大致示意图如下:
11.jpg

以下是串口输出程序中定义的变量地址、改写的数值
6.png



robertesth 发表于 2022-7-4 15:41 | 显示全部楼层
这个可以参考正点原子的。  
modesty3jonah 发表于 2022-7-4 16:01 | 显示全部楼层
这个第一次这么操作。  
mnynt121 发表于 2022-7-4 16:34 | 显示全部楼层
在环境设置的吗   
averyleigh 发表于 2022-7-5 15:24 | 显示全部楼层
不是alloc吗?  
timfordlare 发表于 2022-7-8 10:18 | 显示全部楼层
为什么要给结构体指针申请动态内存
gygp 发表于 2022-7-8 15:31 | 显示全部楼层
单片机的C语言,用得上动态分配内存不
burgessmaggie 发表于 2022-7-8 16:23 | 显示全部楼层
如何申请释放动态内存
hudi008 发表于 2022-7-9 14:53 | 显示全部楼层
静态内存 动态内存 ??
minzisc 发表于 2022-7-9 16:19 | 显示全部楼层
内存申请后,如何判断成功与否?
hudi008 发表于 2022-7-9 17:57 | 显示全部楼层
c语言申请的动态内存怎么调用?
deliahouse887 发表于 2022-7-9 18:49 | 显示全部楼层
(char *)malloc(sizeof(char) * num);
MessageRing 发表于 2022-10-4 20:57 | 显示全部楼层
结构体为啥要动态内存?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:极海半导体
简介:珠海极海半导体有限公司是一家致力于开发工业级/车规级微控制器、模拟与混合信号IC及系统级芯片的集成电路设计型企业。极海团队拥有20年集成电路设计经验和嵌入式系统开发能力,可为客户提供核心可靠的芯片产品及方案,实现准确感应、安全传输和实时控制,助力客户在智慧家居、高端消费电子、工业控制、汽车电子、智慧能源以及通信设施等领域的拓展创新。

29

主题

68

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部