esp32-S3专题二:内存1之RAM使用

这篇具有很好参考价值的文章主要介绍了esp32-S3专题二:内存1之RAM使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

esp32-S3模块内部的存储分为ROM,RAM,SPRAM,RTC内存,FLASH,种类很多,几乎可以不使用外接存储器的情况下,可以进行很多业务场景,十分有用。现在我们逐一讲解一下他们的作用和使用方法。

一、ROM

384 KB 内部 ROM,
作用:ESP32技术手册明确说明:Internal ROM 是只读存储器,不可编程。Internal ROM 中存放有一些系统底层软件的 ROM 代码(程序指令和一些只读数据)。程序无法修改,暂不讨论。
关于ROM注意的是,全局的const变量和字符串常量通常会存放在只读数据区(.rodata),有一些硬件芯片会将这个数据区放在ROM里面,但是ESP32将数据区放置在RAM,区分清楚就好。

二、RAM

种类:片内SRAM +片外PSRAM

(一)片内SRAM:

大小:512 KB
关系:片内SRAM = IRAM (192KB ) + DRAM( 328KB )

IRAM :

作用:存储关键代码。
1.中断处理程序。注册中断处理程序时使用了 ESP_INTR_FLAG_IRAM,则中断处理程序必须要放入 IRAM。
2.可将一些时序关键代码放入 IRAM,以减少从 flash 中加载代码造成的相关损失。
3.以上两点为链接器自主操作,官方也提供接口,可以通过程序来声明函数,可以将 IRAM_ATTR 宏用作属性,直接将程序存储在这部分空间。(非芯片核心开发人员不推荐使用,容易触发芯片系统安全机制)

void IRAM_ATTR gpio_isr_handler(void* arg)
{
   const static DRAM_ATTR uint8_t INDEX_DATA[] = { 45, 33, 12, 0 };
   const static char *MSG = DRAM_STR("I am a string stored in RAM");
}

函数中的字符串或常量可能没有自动放入 RAM 中,这时可以使用 DRAM_ATTR 属性进行标记,或者也可以使用链接器脚本方法将它们自动放入 RAM 中。

DRAM:

作用两个:

  1. 非常量静态数据(.data 段)和零初始化数据(.bss 段)由链接器放入内部 SRAM 作为数据存储。
    这部分空间的使用是由链接器在对项目代码编译链接时,根据程序内容自动使用。空间大小随程序内部使用情况扩张。
  2. 官方也提供接口,可以通过程序声明变量,直接使用这部分空间。可以将 __NOINIT_ATTR 宏用作属性,从而将数据放入 .noinit 部分。放入该部分的值在启动时不会被初始化,在软件重启后也会保持值不变。
__NOINIT_ATTR uint32_t noinit_data;
  1. 此区域中的剩余空间可在程序运行时用作堆,也就是内部堆
    查看内部堆大小的函数:
printf("sp_get_free_internal_heap_size = %ld\n\r", esp_get_free_internal_heap_size());

一般打印完,发现内部堆大小只有200多KB,因为实际的内部堆大小只有RAM中的DRAM中的一部分,其最主要的作用是负责程序的运行空间,例如一般创建线程时声明的任务栈大小所需的空间就是直接从内部堆里面分配出去的。创建20k大小的线程,对应的内部堆就减少20k空间。

xTaskCreate((TaskFunction_t )task,"task", 20*1024, (void* )NULL,20,  (TaskHandle_t* )&ITask_Handler);

(二)片外PSRAM:

具体大小可根据使用业务进行配置,通常:2-8M
作用:提供更多空间,方便数据的存储和使用。

配置使用:

1.开启:使能Support for external,SPI-connected RAM
2.根据实际外置的PSRAM类型来选择:Quad 或者Octal
3.选择程序申请堆的API接口:可以选择2或者3。

esp32 ram,esp32,c语言,单片机,c++,嵌入式硬件
(上图为2.9.1版ESP-IDE,部分旧版编辑器将此项类型ESPS3特殊设置或者ESP系统设置里面)

选型2:使用heap_caps_malloc()申请堆,灵活配置申请。

char *data=(char *) heap_caps_malloc(1024*sizeof(char), MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM);

配置项的意义:

/**
 * @brief Flags to indicate the capabilities of the various memory systems
 */
#define MALLOC_CAP_EXEC             (1<<0)  ///< Memory must be able to run executable code
#define MALLOC_CAP_32BIT            (1<<1)  ///< Memory must allow for aligned 32-bit data accesses
#define MALLOC_CAP_8BIT             (1<<2)  ///< Memory must allow for 8/16/...-bit data accesses
#define MALLOC_CAP_DMA              (1<<3)  ///< Memory must be able to accessed by DMA
#define MALLOC_CAP_PID2             (1<<4)  ///< Memory must be mapped to PID2 memory space (PIDs are not currently used)
#define MALLOC_CAP_PID3             (1<<5)  ///< Memory must be mapped to PID3 memory space (PIDs are not currently used)
#define MALLOC_CAP_PID4             (1<<6)  ///< Memory must be mapped to PID4 memory space (PIDs are not currently used)
#define MALLOC_CAP_PID5             (1<<7)  ///< Memory must be mapped to PID5 memory space (PIDs are not currently used)
#define MALLOC_CAP_PID6             (1<<8)  ///< Memory must be mapped to PID6 memory space (PIDs are not currently used)
#define MALLOC_CAP_PID7             (1<<9)  ///< Memory must be mapped to PID7 memory space (PIDs are not currently used)
#define MALLOC_CAP_SPIRAM           (1<<10) ///< Memory must be in SPI RAM
#define MALLOC_CAP_INTERNAL         (1<<11) ///< Memory must be internal; specifically it should not disappear when flash/spiram cache is switched off
#define MALLOC_CAP_DEFAULT          (1<<12) ///< Memory can be returned in a non-capability-specific memory allocation (e.g. malloc(), calloc()) call
#define MALLOC_CAP_IRAM_8BIT        (1<<13) ///< Memory must be in IRAM and allow unaligned access
#define MALLOC_CAP_RETENTION        (1<<14) ///< Memory must be able to accessed by retention DMA
#define MALLOC_CAP_RTCRAM           (1<<15) ///< Memory must be in RTC fast memory

#define MALLOC_CAP_INVALID          (1<<31) ///< Memory can't be used / list end marker

选型3:使用malloc方式申请最直接,默认使用malloc时向外部推申请空间。

 char *data=(char *)malloc(1024*sizeof(char));

另外,也可以通过API接口查看外部堆的剩余大小:

printf(".esp_get_free_heap_size = %d\n\r", esp_get_free_heap_size());

这次分享到处结束,下次分享给大家讲讲Cache、片上的flash和RTC存储器用法,觉得有帮助可以点个赞,谢谢大家。

参考:

https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/api-guides/memory-types.html#iram-ram
https://www.espressif.com.cn/sites/default/files/documentation/esp32-s3_technical_reference_manual_cn.pdf
https://blog.csdn.net/qq_41741344/article/details/116380816文章来源地址https://www.toymoban.com/news/detail-554770.html

到了这里,关于esp32-S3专题二:内存1之RAM使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 13.STM32F103C8使用PSRAM64H外扩RAM空间

    最近在调试STM32F103C8驱动墨水屏的实验,在使用过程中,需要使用大内存的RAM需要,由于C8T6的RAM空间只有20KB,而墨水屏的需要的内存为800*480*2/8=93.75KB。 在网上查了相关的方案,都是使用STM32F103ZE外扩IS62WV51216这种并口SRAM的,使用IS62WV51216需要使用多引脚的STM32F103Zx系列,对于

    2024年02月15日
    浏览(30)
  • 内存RAM和ROM之间的区别

    ROM和RAM都是一种存储技术,只是两者原理不同,RAM为随机存储,掉电不会保存数据,而ROM可以在掉电的情况下,依然保存原有的数据。ROM和RAM指的都是半导体存储器。本来的含义是:ROM是Read Only Memory的意思,也就是说这种存储器只能读,不能写。而RAM是Random Access Memory的缩写

    2023年04月08日
    浏览(28)
  • 单片机学习-什么是Flash?什么是RAM?什么是ROM?

    Flash 存储器(FLASH EEPROM)又称闪存,快闪。 它是EEPROM的一种。它结合了ROM和RAM的长处。不仅具备电子可擦除可编辑(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据。它于EEPROM的最大区别是,FLASH按扇区(block)操作,而EEPROM按照字节操作。FLASH的电路结构较简单,

    2024年02月10日
    浏览(38)
  • 路由器的内存种类和作用以及NVRAM同RAM的区别介绍

    路由器内存的种类 路由器的内存有三类:RAM(Random Access Memory),NVRAM(Non-Volatile Random Access Memory)及EEPROM(Electronic Erasable Programmable Random Access Memory,又称为Flash)。 路由器内存的作用 Flash:存储路由器的操作系统(IOS:Internet Operating system)。 NVRAM:存储用户对路由器的配置表。 RAM:路

    2024年02月06日
    浏览(30)
  • Android 9.0 kenel和frameworks中修改ram运行内存的功能实现

    在9.0的系统rom产品开发定制中,在对一些产品开发中的配置需求方面,在产品后续订单中,在某些机型中需要升级下系统内核配置,项目时间比较仓促,所以 来不及对硬件重新定制,就需要软件方面在ram运行内存的容量大小方面作假,修改ram真实的大小容量,所以就需要在

    2024年02月09日
    浏览(29)
  • ROM、RAM、内存、内存条、外存、内部存储器、外部存储器、FLASH等之间的关系

    ​   各位看到这一系列的名词,是否也曾感受到一头雾水?研究了一上午终于理清了它们之间的关系,直接上图说明,相信你看完也能恍然大悟!若有错误麻烦在评论区指出。 这里有几点需要明确: 存BOIS的ROM也属于内存(因为CPU也可以对其直接寻址),但我们生活中常说

    2023年04月26日
    浏览(38)
  • esp32s3使用多串口

    我按照别人博客中设置串口2,串口打印有问题,因为没有看到esp32s3 多串口,就总结了一下自己的经验 下图为esp32的引脚图 下图为esp32s3的引脚图 ESP32-S3 有三个 UART(通用异步收发器)控制器,即 UART0、UART1、UART2,支持异步通信(RS232 和 RS485)和 IrDA,通信速率可达到 5 Mbps。

    2024年02月04日
    浏览(32)
  • STM32 -4 关于STM32的RAM、ROM

    一 、说明 它主要用于存储代码,FLASH 存储器的内容在掉电后不会丢失,STM32 芯片在运行的时候,也能对自身的内部 FLASH 进行读写,因此,若内部 FLASH 存储了应用程序后还有剩余的空间,我们可以把它像外部 SPI-FLASH 那样利用起来,存储一些程序运行时产生的需要掉电保存的

    2024年02月09日
    浏览(27)
  • ESP32网络应用 -- ESP32-S3使用HTTP协议获取城市天气数据

    超文本传输协议(Hypertext Transfer Protocol,HTTP),是一种建立在TCP协议之上,应用非常广泛的请求-响应协议,关于HTTP协议的详细描述,网上已经不乏文章,此处不再详细论述。 作为一款网络功能强大Wi-Fi SOC芯片,ESP32-S3可以通过ESP-IDF编程框架提供的应用程序接口,方便地构建

    2024年02月09日
    浏览(25)
  • 【【典型电路设计之片内存储器的设计之RAM的Verilog HDL描述一】】

    RAM是随机存储器,存储单元的内容可按需随意取出或存入。这种存储器在断电后将丢失所有数据,一般用来存储一些短时间内使用的程序和数据。 其内部结构如下图所示: 例:用Verilog HDL 设计深度为8,位宽为8的单端口RAM。 单口RAM,只有一套地址总线,读和写操作是分开的

    2024年02月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包