承接上文,讲一下esp32上剩下的几个存储空间的用途
一、RTC存储器
esp32-S3分为有两个RTC存储器,是比较特别的SRAM存储器。RTC存储器在设备深度休眠时不掉电,一般比较多配合设备的深度休眠模式的业务场景使用。使能(一般默认使能) CONFIG_SOC_RTC_FAST_MEM_SUPPORTED 和CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED后,即可以通过定义变量,直接操作RTC内存。
(一)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;
(二) RTC 慢速存储器
也是为 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具有掉电不丢失特性,所有许多业务场景经常结合flash的使用。而esp32-s3上的用途比较多,主要分为3个方面。围绕flash进行分区,使用partitions.csv文件划分功能。具体配置:在 menuconfig 中选择了 “Custom partition table CSV”,手动编辑partitions.csv文件,可以分配片上flash的4-8M给不同的功能使用。下表一:
(一) NVS 表
通过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);
}
(二)程序和OTA分区
otadata,factory,ota_0,ota_1这4个分区是存储当前程序和ota下载新版本程序使用的功能,主要为上电后程序映射区和系统ota时使用,不展开讲解了。区域大小一般3-6M,视OTA场景而定,以后专题有机会可以讲讲。
(三)SPIFFS 文件系统
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