0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

朱老师物联网大讲堂 2024-04-05 08:09 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、DTCM和AXI连接的RAM

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

d2089c24-f2e0-11ee-9118-92fbcf53809c.png

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

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

d1fe83ce-f2e0-11ee-9118-92fbcf53809c.gif

二、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段),这里面有几个概念需要清楚。通过下图的描述,我们能看到各个段的含义。

d2204f4a-f2e0-11ee-9118-92fbcf53809c.png

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

d2242dea-f2e0-11ee-9118-92fbcf53809c.png

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

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

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

d230b736-f2e0-11ee-9118-92fbcf53809c.png

链接脚本的定义如下:通过注释我们知道有俩片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中运行。

d244efd0-f2e0-11ee-9118-92fbcf53809c.png

此时我们发现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语言代码中的定义方式如下:

d25649d8-f2e0-11ee-9118-92fbcf53809c.png

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

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

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

    关注

    68

    文章

    20148

    浏览量

    247130
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1398

    浏览量

    119823
  • 总线
    +关注

    关注

    10

    文章

    3014

    浏览量

    91305
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    MCU代码需要搬到RAM中才能运行吗?不这样做会有什么不妥嘛?

    是块,不能对指令直接寻址,因此不能直接运行其中的代码。 因此保存在nand flash中的程序不加载到ram中运行不了。即的硬盘中的Windows不加载到内存条中,运行不起来。
    发表于 12-04 07:39

    使用J-Link Attach NXP S32K3导致对应RAM区域被初始化成0xDEADBEEF

    在IAR Embedded Workbench for Arm中使用J-Link Attach NXP S32K3的时候,会提示对应RAM区域被初始化成0xDEADBEEF,导致对应RAM区域的数据被“篡改”。
    的头像 发表于 11-03 15:26 4824次阅读
    使用J-Link Attach NXP S32K3导致对应<b class='flag-5'>RAM</b>区域被初始化成0xDEADBEEF

    双口ram的使用方法

    单口 RAM 只有一个时钟(clka)(时钟上升沿到来时对数据进行写入或者读出)、一组输入输出数据线(dina &amp; douta)、一组地址线(addra)、一个使能端(ena
    发表于 10-29 06:28

    ram ip核的使用

    1、简介 ram 的英文全称是 Random Access Memory,即随机存取存储器, 它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据, 其读写速度是由时钟频率
    发表于 10-23 07:33

    如何从 flash 把代码搬运到 ram 中运行的?

    没有已经移植适配过的芯片 运行机制是从 flash 把代码搬运到 ram 中运行的
    发表于 09-28 11:03

    USB读RAM buffer使用规范建议

    Questions:硬件和软件同时去访问 USB RAM buffer 造成数据乱掉或丢失 造成乱码流程: 软件设置 USB Valid 关总中断,USB 收数据到 RAM Buffer,此时
    发表于 09-22 17:27

    三大开发环境下的Standby RAM变量配置教程

    在嵌入式低功耗设计中,Standby RAM(待机保持内存)是芯片在深度休眠模式下仍能保持数据的关键硬件资源。但许多开发者苦于不同开发环境的配置差异,难以高效利用这一特性。
    的头像 发表于 07-05 15:18 2451次阅读
    三大开发环境下的Standby <b class='flag-5'>RAM</b>变量配置教程

    Xilinx Shift RAM IP概述和主要功能

    Xilinx Shift RAM IP 是 AMD Xilinx 提供的一个 LogiCORE IP 核,用于在 FPGA 中实现高效的移位寄存器(Shift Register)。该 IP 核利用
    的头像 发表于 05-14 09:36 831次阅读

    浅谈MCU片上RAM

    MCU片上RAM是微控制单元(MCU)中集成于芯片内部的随机存取存储器,主要用于程序运行时的数据存储与高速读写操作。以下是其核心要点: 一、定义与分类 ‌片上RAM是MCU内部存储单元的一部分
    的头像 发表于 04-30 14:47 981次阅读

    工程配置linker flags选项添加--print-memory-usage时,ram打印是错误的,为什么?

    工程配置linker flags选项添加--print-memory-usage时,编译后信息显示flash和ram已使用的百分比%,发现ram打印是错误的,ram实际没有用到100%。 有人使用过
    发表于 04-17 08:19

    是否可以为RT1060添加HDMI输出?

    是否可以为 RT1060 添加 HDMI 输出?我想支持标准 720p 分辨率并使用图形加速。
    发表于 04-10 08:04

    将指定文件下的函数加载到指定ram问题

    问题:mcuxpresso环境,xip模式下我需要使用flexspi将norflash的一部分作为文件系统,将flex以及fatfs相关函数全部加载到ram,发现rodata仍然在flash地址
    发表于 03-12 17:02

    RAM容量不足导致的数据溢出如何预防和处理?

    在 STM32F411 中,RAM 容量是有限的,特别是在进行复杂的数据处理和存储时,可能会遇到数据溢出问题。数据溢出是指程序运行时,数据超出了 RAM 的分配区域,导致程序崩溃或数据丢失。STM32F411 的 RAM 容量为
    发表于 03-07 16:09

    还在以为智能家居是玩?我家是真能用!

    以前听到“智能家居”,我总觉得是科技发烧友的玩具,离普通人的生活还很远。直到我自己入手了三翼鸟,才发现智能家居根本不是“玩”,而是实实在在能提升生活品质的利器!今天就从智慧管理和主动服务两个层面
    的头像 发表于 03-06 11:17 772次阅读
    <b class='flag-5'>你</b>还在<b class='flag-5'>以为</b>智能家居是玩?我家是真能用!

    MXD1210非易失RAM控制器技术手册

    MXD1210非易失性RAM控制器是一款超低功耗CMOS电路,可将标准(易失性)CMOS RAM转换为非易失性存储器。它还会持续监控电源,以在RAM的电源处于边际(超出容限)条件时提供RAM
    的头像 发表于 02-28 10:48 768次阅读
    MXD1210非易失<b class='flag-5'>RAM</b>控制器技术手册