1 概要

本章节是对第(11)章节中的内容补充,(11)章节中有提到RAM aliases和SRAMs的物理地址是一样的,所以在配置设备树的时候它们的地址范围最好是一致的,这里mcuram子节点和mcuram2子节点的地址范围设置一致。

这一章节将会对RAM aliases和SRAMs的基本设置进行讲解。

2 STM32MP157

下面,我们根据以上STM32MP157的资源分配情况来了解这款芯片的应用。

从STM32MP157的资源分配上看,通常 Linux 运行在A7上,在 Linux下就具有完整的网络、UI 显示(包括 GPU)、内存管理和安全功能,那么,A7 可用于高性能的任务处理、智能网关、图形显示和人机交互界面(HMI)应用中。例如:
① 在白色家电、工业控制和医疗设备中,可用于图形化人机交互控制终端;
② 在家居和工业控制中,可用于家庭智能网关和工业网关;
③ 在其它设备或领域中,可用于图像处理或远程界面,例如,在办公自动化以及系统监控设备中,可用于智能打印机、二维码扫描枪、智能点钞机、语音设备、电话会议设备以及系统监控的物体/人脸识别设备等。

M4通常可以运行RTOS,可以运行特定的软件应用,如:
① 运行实时传感器处理程序,例如,在M4可以访问的SPI和I2C等这些外设上接一些传感器,实时采集数据;
② 系统管理,基于PWR,M4可以让设备在 Linux 处于待机状态时唤醒;
③ 系统监控,基于PWR,当整个系统发生故障的时候,M4能够重置或者恢复整个系统。
④ 马达驱动,M4结合A7的性能,可以用于电机控制中,例如双电机控制方案。
随着工业控制、消费电子、智能家居和医疗保健等领域的互联越来越密切,就需要特定的嵌入式设计,其在实现实时控制的同时,还能够实现高性能应用控制和图像处理,针对这些需求,使用STM32MP157这样的多核异构处理器就很合适,此时,M4可用于低功耗的实时控制,A7 可用于管理较高的处理负载和开发具有丰富人机界面(HMI)的复杂应用。目前,STM32MP157 已经广泛应用于HMI(人机界面)设计、工业控制和IoT应用开发中。

3 STM32MP157 存储分配

在多核异构处理器的开发中,除了要关注外设资源怎么分配以外,我们还要关注存储资源怎么分配,特别是当存储资源有限的时候,该怎么分配、分配多大才能保证系统得以正常运行,本小节我们就来了解STM32MP157的存储资源分配情况。

3.1 内存映射关系

STM32MP157 是一款32位的ARM芯片,有4GB的存储空间,被划分为了13块,如下表2.3.1.1 所示,不同的外设占用不同的范围。其中,数据字节是以小端模式存放在存储器中的,即数据的低字节保存在内存的低地址中,数据的高字节保存在内存的高地址中。
在这里插入图片描述
下面,我们来看STM32MP157的内存映射图,如下图2.3.1.1所示:
在这里插入图片描述
从上图的左侧部分可以看到,STM32MP157的整个4GB内存空间被分为了13块,地址区间范围对应上表2.3.1.1 的13 块区域。上图的右侧部分则是某块存储区域的地址划分情况,例如0x40000000~0x50000000 这个区域是外设内存区域 1,从图的右侧可以看出这段区域是被划分给了APB1、APB2、AHB2 和 AHB3。图中的灰色区域部分是未使用的保留(Reserved)区域,是为了后续芯片型号升级而预留的存储块。

3.2 SRAM 存储区域

下面我们来了解几个比较重要的存储块,即SRAM存储区域,包括BOOT、SRAMs、SYSRAM、RAM aliases 存储区域,它们和M4有关,如下图2.3.2.1所示:
在这里插入图片描述

3.2.1 BOOT 存储区域

BOOT存储区域从地址0x00000000开始,这是STM32MP157内部BOOT ROM区域,用于存储ST自己编写的启动代码,用户不可以使用该区域。BOOT存储区域中的RETRAM(64KB)仅用于存放M4内核的中断向量表,注意,M4内核的中断向量表是从地址0x0000 0000开始的。

3.2.2 SRAMs 存储区域

从内存映射图中看出,SRAMs区域范围是0x10000000 ~ 0x20000000,除了预留存储块,还有4块SRAM:SRAM1 ~ SRAM4,这四块SRAM的地址空间是连续的,地址范围为0x10000000 ~ 0x1005FFFF,总大小为384KB,每块的地址范围如下表2.3.2.1所示:
在这里插入图片描述
M4 可以访问BOOT区域里的RETRAM和SRAMs区域里的SRAM1 ~ SRAM4,所以可以称它们为MCURAM,其中,RETRAM用于存放M4内核的中断向量表,而SRAM1 ~ SRAM4可以用于存放M4的代码段和数据段,如果A7和M4之间要进行核间通信,还要存放资源表和双核之间通信的数据。

如果STM32MP157不运行A7内核,只运行M4内核,那么这SRAM1~SRAM4的全部存储空间可以全部分配给M4使用,即M4独享这384KB的存储区域,RAM和ROM全部都在这384KB 内存范围内,注意的是,只能在线仿真,程序再掉电以后就丢失了。如果STM32MP157要运行A7和M4内核,且A7和M4之间又要进行核间通信,那么M4就不能独享这384KB的存储区域了,其中要划出一片区域用于核间通信时的共享内存,另外一小片区域用于存放资源表,资源表中包含了核间通信的一些配置。

下面,我们先来看ST给的参考设计,查看在ST给的参考设计中,MCURAM如何使用了,如下图2.3.2.2是ST给的参考设计:
在这里插入图片描述
从上图ST的参考设计中,RETRAM和SRAM1以及SRAM2是单独给M4使用的,其中,RETRAM用于存放M4的中断向量表,这部分的区域是固定的,用户不能够使用,SRAM1用于存放M4的代码段,SRAM2用于存放M4的数据段,SRAM1和SRAM2加起来共256KB。

SRAM3是A7和M4共同使用的,这部分区域用于IPC缓冲区,即A7和M4的共享内存在SRAM3中。SRAM4被A7单独使用了,用于Linux下的DMA缓冲区。 以上SRAM1 ~ SRAM4的分配情况只是ST给的参考设计,当然了,用户也可以根据自己的项目开发情况来重新规划这部分的区域,例如,如果A7下不需要使用SRAM4作为DMA 缓冲区了,可以将A7占用的SRAM4释放出来给M4使用。又例如,A7和M4的共享内存是在SRAM3中,也可以重新规划,将共享内存设置在SRAM1、SRAM2和SRAM4中。如果需要重新规划SRAM1 ~ SRAM4,在Linux下就需要修改设备树,在M4的工程中就需要修改分散加载文件或者链接脚本。

3.3 RAM aliases存储区域

RAM aliases的地址范围是0x30000000 ~ 0x40000000,除了预留存储块,还有和SRAMs一样大小的SRAM1 ~ SRAM4以及和BOOT区域一样大小的RETRAM。RAM aliases里的RETRAM、SRAM1 ~ SRAM4我们称之为A7可以访问的RAM,实际上,RAM aliases里的SRAM1 ~ SRAM4和RETRAM与SRAMs里的SRAM1~SRAM4和BOOT里的RETRAM对应的是同一个物理地址,即同一块物理地址映射到了两段内存区域中,一个区域是A7“可见”的,另一个区域是M4“可见”的,A7“可见”的区域和M4“可见”的区域本质上对应的是同一块物理内存。

我们举个例子来进行分析,例如有一块物理地址A映射到了RAM aliases里的RETRAM,同时也映射到了BOOT里的RETRAM,即物理地址A映射到了两个内存区域,一个区域是A7可以访问的,另外一个内存区域是M4可以访问的。又比如,物理地址B映射到RAM aliases里的SRAM1,也映射到了SRAMs里的SRAM1,依次类推(此处的物理地址A和B只是用于举例说明)。

这么一分析,RAM aliases中的aliases恰好有“别名”之意,那么RAM aliases的存储区域可以当做SRAMs的别名区,本质上它们对应的是同一段物理地址(保留区域除外),所以,如果要手动配置设备树和分散加载文件或者链接脚本时,设备树中RAM aliases的地址范围最好要和SRAMs里的地址范围对应。

3 总结

这一章节补充了MP157板子的存储分配,讲解了RAM aliases存储区域。

4 其他章节

【STM32MP157 异核通信框架学习篇】(1)SMP和AMP架构
【STM32MP157 异核通信框架学习篇】(2)IPCC通信框架
【STM32MP157 异核通信框架学习篇】(3)OpenAMP框架
【STM32MP157 异核通信框架学习篇】(4)驱动文件介绍
【STM32MP157 异核通信框架学习篇】(5)Remoteproc 相关驱动简析 ---- 资源表
【STM32MP157 异核通信框架学习篇】(6)Remoteproc 相关驱动简析 ---- 存储和系统资源分配
【STM32MP157 异核通信框架学习篇】(7)Remoteproc 相关驱动简析 ---- 链接脚本
【STM32MP157 异核通信框架学习篇】(8)Remoteproc 相关驱动简析 ---- 重新划分存储区域
【STM32MP157 异核通信框架学习篇】(10)Linux下Remoteproc相关API (上)
【STM32MP157 异核通信框架学习篇】(10)Linux下Remoteproc相关API (下)
【STM32MP157 异核通信框架学习篇】(11)链接脚本
【STM32MP157 异核通信框架学习篇】(11)链接脚本 – [额外补充: MP157板子存储分配]
【STM32MP157 异核通信框架学习篇】(12)Remoteproc 的使用 [加载和启动M4固件] (上)
【STM32MP157 异核通信框架学习篇】(12)Remoteproc 的使用 [加载和启动M4固件] (下)

更多推荐