赞
踩
承接上文,讲一下esp32上剩下的几个存储空间的用途
esp32-S3分为有两个RTC存储器,是比较特别的SRAM存储器。RTC存储器在设备深度休眠时不掉电,一般比较多配合设备的深度休眠模式的业务场景使用。使能(一般默认使能) CONFIG_SOC_RTC_FAST_MEM_SUPPORTED 和CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED后,即可以通过定义变量,直接操作RTC内存。
8 KB 的 SRAM,可以在 Deep-sleep 模式下 RTC 启动时用于数据存储以及被主CPU 访问。除非禁用CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP 选项,否则剩余的 RTC FAST memory 会被添加到堆中。该部分内存可以和 DRAM(数据 RAM) 互换使用,但是访问速度稍慢一点。
使用方式:
#include <esp_attr.h>
RTC_IRAM_ATTR uint32_t rtc_iram_data;
RTC_FAST_ATTR uint32_t rtc_fast_data;
也是为 8 KB 的 SRAM,可以在 Deep-sleep 模式下被协处理器访问。
使用方式:
#include <esp_attr.h>
//RTC_NOINIT_ATTR 属性宏可以用来将数据放入 RTC Slow memory。放入此类型存储器的值从深度睡眠模式中醒来后会保持值不变。
RTC_NOINIT_ATTR uint32_t rtc_data;
注:从架构上来说,存储在RTC慢速存储器存储的数据,除非模块掉电,否则不会丢失。就算系统调用软件esp_restart()重启也能保留。但实际使用中V4.4.0版本的架构,esp_restart()重启后偶尔也会发生数据丢失,不知道具体原因。
由于flash具有掉电不丢失特性,所有许多业务场景经常结合flash的使用。而esp32-s3上的用途比较多,主要分为3个方面。围绕flash进行分区,使用partitions.csv文件划分功能。具体配置:在 menuconfig 中选择了 “Custom partition table CSV”,手动编辑partitions.csv文件,可以分配片上flash的4-8M给不同的功能使用。下表一:
通过esp_partition API 使用flash上分区定义的名字为nvs的区域空间,存储的方式类似哈希表,即索引和存储内容一 一对应,NVS区域大小则视具体业务在.csv文件中自行定义。
使用方式:
#include <stdio.h> #include <string.h> #include "sdkconfig.h" #include "esp_log.h" #include "nvs_flash.h" #define NVS_NAME "mesh_example" //表名 static const char *NVS_INDEX="nvs_data";// 索引规矩16个字符内有效 //存数据 void setNvsData(uint32_t data){ nvs_handle nvs_handle; nvs_open(NVS_NAME, NVS_READWRITE, &nvs_handle); nvs_set_u32(nvs_handle,NVS_INDEX, data); nvs_commit(nvs_handle); nvs_close(nvs_handle); } //读数据 void getNvsData(uint32_t data){ nvs_handle nvs_handle; nvs_open(NVS_NAME, NVS_READWRITE, &nvs_handle); nvs_get_i32(nvs_handle, NVS_INDEX, &data); nvs_close(nvs_handle); }
otadata,factory,ota_0,ota_1这4个分区是存储当前程序和ota下载新版本程序使用的功能,主要为上电后程序映射区和系统ota时使用,不展开讲解了。区域大小一般3-6M,视OTA场景而定,以后专题有机会可以讲讲。
SPIFFS 是一个官方开发的片上flash 设备的嵌入式文件系统,支持磨损均衡、文件系统一致性检查等功能。对应的是表一中的storage分区,区域大小视具体业务自行定义。特点:使用fopen、fclose等标准C文件接口进行文件标准操作。
使用方式:
#include <stdio.h> #include <string.h> #include "sdkconfig.h" #include "fat_flash.h" //挂载点 #define FLASH_MOUNT_POINT "/spiflash" static wl_handle_t wlHandle = WL_INVALID_HANDLE; int mountFlashInit(void){ int ret=0; const esp_vfs_fat_mount_config_t mount_config = { .max_files = 5, .format_if_mount_failed = true, .allocation_unit_size = CONFIG_WL_SECTOR_SIZE }; esp_err_t err = esp_vfs_fat_spiflash_mount(FLASH_MOUNT_POINT, "storage", &mount_config, &wlHandle); if (err != ESP_OK) { ESP_LOGE(TAG, "mount flash fail:%s", esp_err_to_name(err)); return -1; } ESP_LOGI(TAG, "mount flash suceess"); return ret; } // 写文件 void writeFile() { FILE * ini ; if ((ini=fopen("/spiflash/sys/text.txt", "w"))==NULL) { ESP_LOGW(TAG, "iniparser: cannot %s\n",g_file_path); } fprintf(ini, "test123456\n" "\n"); fprintf(ini, "\n"); fclose(ini); }
使用合理使用片内SRAM、PSRAM、RTC存储器、Flash存储器,可以在各种场景下对业务数据进行存储
名称 | 使用方式 | 轻度休眠 | 深度休眠 | esp_restar() | 掉电 |
---|---|---|---|---|---|
片内SRAM | 程序定义数据 | 保留 | 丢失 | 丢失 | 丢失 |
PSRAM | 主动申请:malloc | 保留(可配置) | 丢失 | 丢失 | 丢失 |
RTC | RTC RTC_NOINIT_ATTR | 保留 | 保留 | 丢失 | 丢失 |
FLASH | NVS或者文件系统 | 保留 | 保留 | 保留 | 保留 |
这次esp-s3的内存专题的分享到处结束,以后其他专题可能会开始给大家讲讲各种外设的用法,觉得有帮助可以点个赞,谢谢大家。
参考:
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。