1 概述APM32F103xE能外接SDRAM,使用SDRAM解决内部SRAM不够的应用场景问题,比如因为内部堆空间不够导致动态内存申请识别,无法定义大的全局变量数组。 当然读写SDRAM的速度是比读取内部SRAM慢的,尤其是频率大于48MHz时,访问SDRAM时会有频率限制,但是访问SRAM时没有频率限制,就是系统时钟的频率。 因此,动态申请的内存、定义的全局变量一般情况下是占用空间大、且对速度要求不高的场合。 本篇文章中涉及到的分散加载文件、map文件、堆、栈、ZI、ZW等概念可以到网上查找,以下主要记录了实现的方法、并验证该方法是可行的。 当然应该还有其它的方法,可以提出来一款探讨探讨。
2 自定义分散加载文件,SDRAM中既可以定义堆空间、也可以定义全局变量空间2.1 Keil工程配置2.1.1 Target配置按照工程默认配置,不做修改。 2.1.2 Linker配置(1)在选择“Use Memory Layout from Target Dialog”的情况下完成编译,生成*.sct文件才能编辑,否则需要自行创建*.sct文件。(这也是一种偷懒的方法)
2.2 结合应用代码修改分散加载文件、定义堆大小(1)分散加载文件定义如下:
(2)对应的代码如下 使用 __attribute__ 把定义的全局变量定义在SDRAM中,其中SDRAM_RW_ZI和分散加载文件中的名称对应上。 __attribute__只能用于全局变量、函数,因此局部变量是定义在内部SRAM中。 在*.s文件中设置的堆大小如下
(3)编译后关于变量的map文件如下 由map文件分析,HEAP的起始地址是0x60000000,部分RWData定义在起始地址为0x60100000的内存空间中
2.3 代码运行现象(1) 按照默认情况下定义的全局、局部变量在内部SRAM中 (2) malloc申请内存空间在SDRAM开辟的堆中 (3) 通过 __attribute__ 修饰定义的全局变量在SDRAM中 (4) 通过 __attribute__ 修饰的静态变量在SDRAM中 大致示意图如下:
以下是串口输出程序中定义的变量地址、改写的数值
|