你以为的RAM不是你以为的RAM~

描述

 

一、DTCM和AXI连接的RAM

STM32H7系列处理器内部有多个RAM空间,每个RAM空间的大小和响应速度都不一样。这里面我们重点关注DTCM总线矩阵连接的128KB RAM和AXI总线矩阵连接的512KB RAM。

总线

DTCM RAM 128KB:MDK配置是IRAM1:起始地址是0x20000000,大小是0x20000,128KB

AXI RAM 512KB: MDK配置是IRAM2:起始地址是0x240000000,大小是0x80000,152KB

总线

二、lds链接脚本的内存分配

通过上述的分析,我们知道AXI RAM空间要比DTCM RAM空间是要大很多的,那么我们lds链接脚本该如何设置,才能使上电后start_xx.s汇编文件启动能将RW段、ZI段、HEAP、STACK能分配到AXI RAM 512KB 区域呐?取决于lds链接脚本的内存分配。首先我们分析一下RW段、ZI段、HEAP、STACK在内部RAM中是如何分配的(HEAP和STACK实际上也属于ZI段),这里面有几个概念需要清楚。通过下图的描述,我们能看到各个段的含义。

总线

RAM中上述的段分配情况通过以下图表进行说明。从RAM起始地址开始依次存放RW-DATA,BSS、HEAP、STACK和剩余空间。这里举例是以0x20000000开始的128KB AXI RAM进行举例说明。

总线

既然有两个RAM存储区,那么我们的RW-DATA、BSS、HEAP、STACK应该链接在哪一个RAM区,这个时候就需要用到.lds链接脚本,链接脚本的作用就是对RAM和FLASH的分配做指定。

在MDK里有两种类型的链接脚本,一种链接脚本是MDK编译器自动指定,用户不需要关注,另外一种脚本是用户自定义,通过自定义脚本设定多片RAM的指定,和每一片RAM的具体用法。

用户自定义的用法是通过点击魔术棒->linker->按照下图的设置,然后点击Edit按钮就会打开链接脚本。

总线

链接脚本的定义如下:通过注释我们知道有俩片RAM区,一片是RW_IRAM1(DTCM RAM:128KB,地址是0x20000000),一片是RW_IRAM2(AXI    RAM:512K,地址是0x24000000),这里配置为RW_IRAM1注释掉不使用,使用RW_IRAM2。

.ANY (+RW +ZI),意思是将RW-DATA、ZI(BSS、HEAP、STACK)分配到RW_IRAM2内存区域。在程序上电启动时就会将此RAM使用起来,程序运行的临时变量、全局变量等都在RW_IRAM2中运行。

总线

此时我们发现AXI RAM 128KB空间没用到。如何将这个空间利用起来?rs485_sample_master.o (+RW +ZI)这句话的意思是将rs485_sample_master.c的这个文件中所有定义在RW_DATA段、ZI段的变量全部分布在RW_IRAM1这个RAM空间,也就是AXI RAM 128KB空间。

.ANY (axi_ram_128kb)这句话的意思是用户可以将任意的变量等按照一定的规则定义到RW_IRAM1这个RAM空间,也就是AXI RAM 128KB空间, (axi_ram_128kb) 的含义是这个将RW_RAM1这个内存区声明为axi_ram_128kb section。

在具体的C语言代码中的定义方式如下:

总线

我们查看.map文件可以看到具体的定义是否有效,或者通过串口查看变量分配地址。通过.map文件的查看,我们可以确定程序中定义的变量确实分配到0x20000000为起始地址的AXI RAM  128KB空间了。

rs485_sample_master.o文件的RW、ZI段也分配在了0x20000000为起始地址的AXI RAM  128KB空间了。

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分