Arduino ESP32 flash数据存储结构


  • 分区表官方文档:《分区表》

想了解ESP32 flash数据存储结构需要从分区表开始了解。一点类似一台电脑上挂载的硬盘一样。

  • 分区表保存 SPI flash 各区信息,包括引导程序、各种应用程序二进制文件、数据及文件系统等
/*在Arduino环境中使用的flash布局
|----|-------|--------|-------|----------|
^    ^       ^        ^       ^
NVS otadata app0    app1 SPIFFS/FATFS

硬件信息配置文件位置:

这是我的电脑,文件位置:C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\tools\partitions

  • 里面存放着不同分区表配置文件。就如同电脑分区,根据不同的需求,自定义分区大小一样。

常规的数据分区结构:

非易失性存储库(NVS)

  • 《非易失性存储库(NVS)官方文档》

非易失性存储 (NVS) 库主要用于在 flash 中存储键值格式的数据。是esp-idf 存储配置信息的主要方法。

  1. 底层存储.
    NVS 通过调用 spi_flash_{read|write|erase} API 对主 flash 的部分空间进行读、写、擦除操作,包括 data 类型和 nvs 子类型的所有分区。应用程序可调用 nvs_open API 选择使用带有 nvs 标签的分区,也可以通过调用 nvs_open_from_part API 选择使用指定名称的任意分区。如果 NVS 分区被截断(例如,更改分区表布局时),则应擦除分区内容。可以使用 ESP-IDF 构建系统中的 idf.py erase_flash 命令擦除 flash 上的所有内容。
    NVS 最适合存储一些较小的数据,而非字符串或二进制大对象 (BLOB) 等较大的数据。如需存储较大的 BLOB 或2者字符串,请考虑使用基于磨损均衡库的 FAT 文件系统。
  2. 键值对的形式存储数据。

NVS 的操作对象为键值对,其中键是 ASCII 字符串,当前支持最大键长为 15 个字符,值可以为以下几种类型:

typedef enum {PT_I8, PT_U8, PT_I16, PT_U16, PT_I32, PT_U32, PT_I64, PT_U64, PT_STR, PT_BLOB, PT_INVALID
} PreferenceType;
  • 整数型:uint8_t、int8_t、uint16_t、int16_t、uint32_t、int32_t、uint64_t 和 int64_t
 size_t putChar(const char* key, int8_t value);size_t putUChar(const char* key, uint8_t value);size_t putShort(const char* key, int16_t value);size_t putUShort(const char* key, uint16_t value);size_t putInt(const char* key, int32_t value);size_t putUInt(const char* key, uint32_t value);size_t putLong(const char* key, int32_t value);size_t putULong(const char* key, uint32_t value);size_t putLong64(const char* key, int64_t value);size_t putULong64(const char* key, uint64_t value);size_t putFloat(const char* key, float_t value);size_t putDouble(const char* key, double_t value);size_t putBool(const char* key, bool value);
  • 以 \0 结尾的字符串
         size_t putString(const char* key, const char* value);size_t putString(const char* key, String value);size_t putBytes(const char* key, const void* value, size_t len);

可变长度的二进制数据 (BLOB) 键必须唯一,为现有的键写入新的值可能产生如下结果:如果新旧值数据类型相同,则更新值; 如果新旧值数据类型不同,则返回错误。

  • EEPROM

在EPS32中已经将EEPROM弃用。对于ESP32上的新应用程序,建议使用NVS为首选项。提供EEPROM是为了向后兼容现有的Arduino应用程序。EEPROM是使用NVS中的单个blob实现的,因此它是容器(Flash)中的容器(NVS)。因此,它不会是一种高性能存储方法。首选项将直接使用nvs,并将每个条目存储为其中的单个对象。所以现在的EEPROM也仅是在函数功能上向后兼容,实际储存方式已经完全变了,这需要我们在实际应用中注意。

  • 命名空间(namespace)

为了减少不同组件之间键名的潜在冲突,NVS 将每个键值对分配给一个命名空间。命名空间的命名规则遵循键名的命名规则,即最多可占 15 个字符。命名空间的名称在调用 nvs_open 或 nvs_open_from_part 中指定,调用后将返回一个不透明句柄,用于后续调用 nvs_read_、nvs_write_ 和 nvs_commit 函数。这样,一个句柄关联一个命名空间,键名便不会与其他命名空间中相同键名冲突。请注意,不同 NVS 分区中具有相同名称的命名空间将被视为不同的命名空间。

虚拟文件系统组件

虚拟文件系统 (VFS) 组件可为一些驱动提供一个统一接口。有了该接口,用户可像操作普通文件一样操作虚拟文件。这类驱动程序可以是 FAT、SPIFFS 等真实文件系统,也可以是有文件类接口的设备驱动程序。

VFS 组件支持 C 库函数(如 fopen 和 fprintf 等)与文件系统 (FS) 驱动程序协同工作。在高层级,每个 FS 驱动程序均与某些路径前缀相关联。当一个 C 库函数需要打开文件时,VFS 组件将搜索与该文件所在文件路径相关联的 FS 驱动程序,并将调用传递给该驱动程序。针对该文件的读取、写入等其他操作的调用也将传递给这个驱动程序。

  • 例如,您可以使用 /fat 前缀注册 FAT 文件系统驱动,之后即可调用 fopen("/fat/file.txt", “w”)。之后,VFS 将调用 FAT 驱动的 open 函数,并将参数 /file.txt 和合适的打开模式传递给 open 函数;后续对返回的 FILE* 数据流调用 C 库函数也同样会传递给 FAT 驱动。
  1. FAT 文件系统

使用 FatFs 库来实现 FAT 文件系统。FatFs 库位于 fatfs 组件中,您可以直接使用,也可以借助 C 标准库和 POSIX API 通过 VFS(虚拟文件系统)使用 FatFs 库的大多数功能。
此外,我们对 FatFs 库进行了扩展,新增了支持可插拔磁盘 I/O 调度层,从而允许在运行时将 FatFs 驱动映射到物理磁盘。

  1. SPIFFS 文件系统

SPIFFS 是一个用于 SPI NOR flash 设备的嵌入式文件系统,支持磨损均衡、文件系统一致性检查等功能。

Arduino ESP32 flash数据存储结构相关推荐

  1. 如何使用Arduino ESP32将数据存储到MicroSD(软SPI和硬SPI)

    如何使用Arduino ESP32将数据存储到MicroSD(软SPI和硬SPI) 主要针对使用这个库:github地址:https://github.com/nhatuan84/esp32-micr ...

  2. Arduino ESP32将数据保存到NVS中

    Arduino ESP32将数据保存到NVS中 该功能类似AVR单片机里面的EEPROM存储区域. 关于ESP32分区表参考<分区表> Preferences中数据以键值对(key - v ...

  3. Cassandra 的数据存储结构——本质是SortedMapRowKey, SortedMapColumnKey, ColumnValue

    Cassandra 的数据存储结构 Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型.它借鉴了 Amazon 的 Dynamo 和 Google's BigTab ...

  4. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)...

    Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...

  5. solr中文搜索倒排索引和数据存储结构

    solr中文搜索倒排索引和数据存储结构 我们传统的方式(正排索引)是从关键点出发,然后再通过关键点找到关键点代表的信息中能够满足搜索条件的特定信息,既通过KEY寻找VALUE.而Lucene的搜索则是 ...

  6. 【MongoDB】——数据存储结构与基本数据类型

    MongoDB数据存储结构 1.基本概念 在MongoDB中数据存储的基本概念是数据库.集合.文档. 文档(document)是MongoDB中数据的基本存储单元,非常类似与关系型数据库管理系统中的行 ...

  7. 【mysql】-【innodb数据存储结构】

    文章目录 数据库的存储结构:页 磁盘与内存交互基本单位:页 页结构概述 页的大小 页的上层结构 页的内部结构 File Header(文件头部)和File Trailer(文件尾部) File Hea ...

  8. MySQL笔记:第07章_InnoDB数据存储结构

    第07章_InnoDB数据存储结构 1.数据库的存储结构:页 1.1磁盘与内存交互基本单位:页 1.2页结构概述 1.3页的大小 1.4页的上层结构 2.页的内部结构 第1部分:File Header ...

  9. pg数据库表存放在哪里_超详细的PG数据存储结构--逻辑结构和物理存储总结,值得收藏...

    概述 今天主要讲讲PG的数据结构,PG数据存储结构分为:逻辑结构和物理存储. 其中逻辑存储结构是内部的组织和管理数据的方式.物理存储结构是操作系统中组织和管理数据的方式.逻辑存储结构适用于不同的操作系 ...

最新文章

  1. mongodb线程池_常用高并发网络线程模型设计及MongoDB线程模型优化实践
  2. 规则引擎选型及应用 邴越 2017-04-27 16:31:17 浏览614 评论0 HTTPS 模块 配置 string exception void input 规则引擎 摘要: 规则引擎具体执
  3. 三种SQL分页查询的存储过程
  4. Java两种设计模式_23种设计模式(11)java策略模式
  5. python数据预测模型算法_Python AI极简入门:4、使用回归模型预测房价
  6. C# 无法识别的转义序列
  7. 思特威电子通过注册:拟募资28亿 小米红杉联想是股东
  8. 如何将Web of Science中的题录及文章导入NoteExpress?
  9. VCL界面控件DevExpress VCL发布v18.1.7|附下载
  10. 焊接摆动与不摆动的区别
  11. word不能保存, 不能另存, 保存按钮 另存菜单不可用 的解决方法
  12. 开源工单系统 python_运维工单--服务器申请工单
  13. unity3d全版本百度网盘极速下载,包括unity3d 5.x及unity 4.x系列
  14. 【马红“名师+”】:【名师引路】聆听薛法根《语文学习任务设计》讲座学习活动(一)
  15. 常见外包公司(非全部)
  16. Vlan和pvlan全面解析
  17. 语音搜索引擎--Midomi
  18. 在 关闭页面/卸载(unload)文档 之前向服务器发送请求
  19. 大家都看得见学计算机的决定,卢须振二丫-图书检索系统.PDF
  20. 上三角矩阵的压缩存储

热门文章

  1. AI安全之对抗样本入门 (智能系统与技术丛书) pdf
  2. 网管员不需要培训吗?
  3. 表结构设计的基本思路
  4. 王老吉也玩元宇宙?发言要成为“全球饮料NO.1”
  5. ubuntu18 usb耳机_Ubuntu 18.10系统下蓝牙耳机连接失败或无法连接的解决
  6. 【传道自由职业】 自由职业意味着什么?
  7. 条码标签软件如何批量制作PZN条码
  8. 怎么查看windows系统的安装时间
  9. 四神分析报告生成系统 1.6.1发布
  10. Nick Vujicic Interview