这是描述信息

WiFi模组乐鑫信息科技代理商ESP32程序的内存模型

WiFi模组乐鑫信息科技代理商ESP32程序的内存模型

WiFi模组乐鑫信息科技代理商ESP32程序的内存模型

WiFi模组乐鑫信息科技代理商ESP32程序的内存模型

WiFi模组乐鑫信息科技代理商ESP32程序的内存模型

WiFi模组乐鑫信息科技代理商ESP32程序的内存模型,MCU中的内存资源可能是其宝贵的资源,因为它在芯片中占据大的面积。更新的应用程序对内存的需求正在不断增长。为了充分利用硬件资源,理解内存架构并能针对应用程序的实际用例进行内存优化变得至关重要。特别是对于包含通信子系统(Wi-Fi和BT/BLE)的ESP32SoC架构,通信子系统本身需要占用一定数量的内存才能运行,因此有必要明确应用程序的需求并对其进行内存优化。


WiFi模组乐鑫信息科技代理商经常会遇到有关应用程序可用内存余量的问题;除非我们深入了解用例,否则这个问题没有简单的答案。但是,当开发人员了解有关内存布局,系统要求和常见优化方法的详细信息时,就会发现ESP32可以适应各种有趣的应用程序用例。


本文旨在为开发者提供ESP32SoC的内存布局概述,介绍不同的内存区域及其特性,并讨论典型ESP32固件的内存分配。


SRAM分为3个存储块SRAM0、SRAM1和SRAM2(以及RTC快速和慢速存储器2个小块,我们将在后面分别讨论)。SRAM以两种方式使用:一种用于指令存储,称为IRAM(用于执行代码,text段),另一种用于数据存储,称为DRAM(用作BSS段,Data段和堆)。SRAM0和SRAM1可以用作连续的IRAM,而SRAM1和SRAM2可以用作连续的DRAM地址空间。


虽然SRAM1可以同时用作IRAM和DRAM,但实际上ESP-IDF会默认使用SRAM1作为DRAM,这是因为通常在应用程序中数据空间会比较紧缺。上图的浅蓝色图表显示了程序员在开发应用程序时需要考虑的内存映射,可以利用的内存包括192KB的IRAM和328KB的DRAM(译者注:不是所有的空间都能被用户程序使用)。因为没有重叠部分,所以对应用程序来说没有太大影响,WiFi模组乐鑫信息科技代理商提醒各位需要注意的是IRAM和DRAM地址空间,地址范围的方向是相反的。


现在让我们放大 IRAM 分段。ESP32中192KB的可用IRAM用于代码执行,并且其中一部分作为高速缓存(Cache)用于访问Flash(和PSRAM)。前32KBIRAM用作CPU0的高速缓存,接下来的32KB用作CPU1高速缓存。这是在硬件中静态配置的,无法更改。在一个64KB之后,链接脚本开始将text段放置在IRAM中。它首先放置所有中断向量,然后放置已编译应用程序中所有标记为放置在IRAM中的text段。在通常情况下,大多数应用程序代码从flash(XiP)执行,但某些代码对执行时间有较高要求,或者本身需要操作flash,需要将它们放置在IRAM中。这项操作通过对这些函数或代码文件添加特定属性标识实现,链接程序脚本将据属性标识将它们放置在IRAM中。链接脚本将 _iram_text_start 和 _iram_text_end 符号放置在text段的两个边界处。text段之后的IRAM保持未使用状态,并添加到堆中。链接脚本将 _iram_text_start 和 _iram_text_end 符号放置在text段的两个边界处。text段之后的IRAM保持未使用状态,并被添加到堆中。并且,当应用程序配置为单核模式时,CPU1不工作并且不启用CPU1Cache。在这种情况下,CPU1Cache的空间(0x40078000–0x4007FFFF)将被添加到堆中。放置在堆中的未使用的IRAM可以通过动态分配访问。如果应用程序有此要求,它可用于在IRAM中放置任何代码。但是,这种情况很少见。


IRAM也可以用于放置数据,但有两个重要限制条件:
用于访问IRAM中数据的地址必须是32位对齐的;
访问的数据大小也必须是32位对齐的。
如果应用程序具有可以遵循这两个访问规则的数据,则IRAM空间可用于存储该数据。
还有一种方法可以不受此限制的访问 IRAM 空间。但是作为访问速度会变慢。这将在后面的部分中讨论。


WiFi模组乐鑫信息科技代理商ESP32应用程序的典型(简化)DRAM布局。由于DRAM地址从SRAM2的末尾开始,并向后增加,因此链接阶段段空间的分配从SRAM2的末尾开始。
前8KB(0x3FFA_E000–0x3FFA_FFFF)用作某些ROM内置函数的数据空间;
链接器紧接着将已初始化的数据段放在一个8KB存储器之后;
接下来是未初始化的BSS段;
数据段和BSS段之后剩余的内存被配置为堆,典型的动态内存分配一般分配至该位置。
请注意,数据段和BSS段的大小取决于应用程序。因此,每个应用程序根据其使用的组件和所调用的API都有不同的可用堆大小。
堆代码中有两个区域(0x3FFE_0000–0x3FFE_0440-共1088字节)和(0x3FFE_3F20–0x3FFE_4350-共1072字节)供ROM代码存放数据。这些区域被标记为保留,并且堆分配器不会从这些区域分配内存。


启用蓝牙(BT)功能后,BT控制器(软件和硬件)需要使用专用的数据空间。该空间作为控制器的Data\/BSS段,同时作为传输空间用于BT数据包在软件和硬件之间传输。因此,链接脚本在默认的DRAM空间中保留了0x3FFB_0000–0x3FFB_DB5C之间的54KB空间,在该区域之后才进行应用程序的数据段和BSS段分配。
当应用程序仅使用低功耗蓝牙(BLE)功能时,可以将BT控制器内存的一部分交还给堆。释放并添加到堆中的内存大小约为19KB。


应用程序级的跟踪调试(Trace)启用以后,它将在DRAM的末尾保留一个固定为32KB的内存空间。请注意,上图显示了未启用BT时的内存布局。但是应用程序也可以在启用BT的情况下使用跟踪,在这种情况下,链接脚本中也会保留BT控制器的内存空间。


WiFi模组乐鑫信息科技代理商ESP32提供了在QSPI总线上外接伪静态RAM(PSRAM又名SPIRAM)的能力,该总线同时用于访问flash,二者同时工作时利用片选信号进行切换。该存储器同flash一样可直接寻址,访问过程通过IRAM中的Cache进行。ESP32在其地址空间0x3F80_0000至0x3FBF_FFFF多可映射4MBSPIRAM(译者注:新版本IDF可使用 HimemAPI 访问大为8MB的SPIRAM)。应用程序通过三种方式使用SPIRAM:
.使用SPIRAM保存特定软件模块的BSS段;
.使用堆分配器从SPIRAM动态分配内存;
.通过直接内存映射,在应用程序中使用静态地址访问SPIRAM。
虽然这允许应用程序使用额外的内存,但对SPIRAM的使用有以下限制:
.SPIRAM不支持DMA,在需要使用DMA向/从外设传输数据的情况下,不能使用它;
.由于flash和SPIRAM使用同一QSPI总线与ESP32通信,因此在执行禁用XiP模式的代码中不能使用SPIRAM;
.由于SPIRAM访问比内部SRAM慢,因此建议对性能有要求的代码使用内部SRAM保存数据。
此处详细介绍了使用SPIRAM的这些方式以及使用限制。


IRAM和DRAM内存布局可以看到,DRAM区域 _bss_end 到 0x3FFF_FFFF(或 _heap_end 在跟踪调试启用时)和IRAM区 _iram_text_end 到 0x4009_FFFF 是未使用的内存空间。如果系统中有SPIRAM,则该内存也属于未使用的内存空间。应用程序和SDK组件始终需要按需分配和释放内存。因此,通用内存分配器(也称为堆分配器)用于操作可用内存空间,并为其提供内存分配和释放API。如您所见,堆分配器控制下的内存区域具有不同的功能和访问属性。因此,ESP-IDF实现了一个基于功能的堆分配器,调用者可以在指定分配大小时同时指定用途。例如,应用程序可能指定分配具有DMA功能的内存空间,以便与某些外设一起使用,或者它可以指定从外部SPIRAM为音频缓冲区分配内存,因为从内部DRAM分配不是更好的选择。ESP-IDF还在基于功能的堆分配器的API之封装了通用的malloc和freeAPI,以使应用程序易于从POSIX类型的系统移植。应用程序配置项可以包含一组管理规则,使mallocAPI能够根据分配的大小自动选择实际的内存段位置。


使用IRAM保存数据,从ESP-IDF4.2版本开始,我们增加了使用IRAM进行数据存储的功能。如上所述,IRAM具有地址和大小对齐的访问限制。如果进行未对齐访问,则会导致异常。在4.2版之后,ESP-IDF透明地处理这些异常,以提供调用者所需的load/store功能。由于这些未对齐的访问会导致异常,因此访问速度将比DRAM慢。通常,每个异常处理大约需要167个CPU周期(即240MHz时每次访问0.7usc或160MHz时每次访问1usec)。应用程序或SDK组件可以在链接时将IRAM用于BSS数据,或者在运行时通过堆分配器使用IRAM。使用IRAM进行数据有两个限制:
.IRAM访问不是多核安全的。因此,需要在单核运行模式,或在系统和应用程序已知对IRAM的访问来自同一个内核时使用它(例如,将任务固定到一个内核上);
.用于DMA的内存分配不应从IRAM分配。
ESP-IDF4.2提供了一些现成的配置,可以有效地利用未使用的IRAM进行数据操作,例如以单核模式下发送和接收TLS片段。

地址:深圳市宝安区西乡街道麻布社区宝安互联网产业基地A区6栋7栋7706

邮箱:Sales@ferry-semi.com

版权所有©2020  深圳市飞睿科技有限公司  粤ICP备2020098907号    飞睿科技微波雷达wifi模块网站地图