esp32 micropython spiffs_spiffs 文件系统在esp32中的应用

spiffs 介绍

SPIFFS 是一个开源文件系统,用于 SPI NOR flash 设备的嵌入式文件系统,支持磨损均衡、文件系统一致性检查等功能。spiffs 源码地址​github.com

spiffs 特点

而我们知道乐鑫的esp32的大部分存储都依赖于SPI flash ,spiffs可以说对于esp32 真可谓是最合适不过的了。

因此对于spiffs乐鑫提供了很好的支持,专门提供了工具(spiffsgen.py,mkspiffs)用于对实现spiffs 在esp32 上的创建、格式化等操作。在esp-idf中也提供了专门的接口函数用于操作spiffs。

源码分析

乐鑫提供的源码位于examples/storage/spiffs/ 下,代码​github.com

①配置csv文件

如果用户在不想使用spiffs工具去操作spiffs的话,乐鑫提供另外一种方式来定义spiffs的空间大小,那就是在.csv 中定义,csv文件是为esp32构建存储的配置文件,当编译时编译器根据这个文件分配flash的大小

在.csv最后定义了一个spiffs格式的存储空间,大小是0xF0000 = 960K,因为这个是最后一片存储空间了,只要地址不大于芯片整个flash的空间即可。

② 挂载文件系统

在使用spiffs之前应该对其进行简单的配置

esp_vfs_spiffs_conf_t conf = {

.base_path = "/spiffs",//文件系统的目录地址

.partition_label = NULL,//在.csv文件中的标签,如果设置为NULL则使用spiffs

.max_files = 5, //同时可以打开最大的文件数

.format_if_mount_failed = true//如果挂载失败,则格式化文件系统

};

配置完成后,需要将系统注册到vfs 操作系统中,vfs类似linux的vfs也是一个虚拟文件系统,这个系统的功能就是,使得用户可以使用C语言的通用库函数去访问不同的操作系统。

esp-idf 提供了注册函数将spiffs 挂载并注册到vfs中。

/**

* Register and mount SPIFFS to VFS with given path prefix.

*

* @param conf Pointer to esp_vfs_spiffs_conf_t configuration structure

*

* @return

* - ESP_OK if success

* - ESP_ERR_NO_MEM if objects could not be allocated

* - ESP_ERR_INVALID_STATE if already mounted or partition is encrypted

* - ESP_ERR_NOT_FOUND if partition for SPIFFS was not found

* - ESP_FAIL if mount or format fails

*/

esp_err_t esp_vfs_spiffs_register(const esp_vfs_spiffs_conf_t * conf);

查看spiffs 的信息

size_t total = 0, used = 0;

ret = esp_spiffs_info(NULL, &total, &used);

if (ret != ESP_OK) {

ESP_LOGE(TAG, "Failed to get SPIFFS partition information (%s)", esp_err_to_name(ret));

} else {

ESP_LOGI(TAG, "Partition size: total: %d, used: %d", total, used);

}

挂载成功之后,就可以使用c 标准库中的fopen,fread,fwrite等函数操作了。

例程源码

#include

#include

#include

#include

#include "esp_err.h"

#include "esp_log.h"

#include "esp_spiffs.h"

static const char *TAG = "example";

void app_main(void)

{

ESP_LOGI(TAG, "Initializing SPIFFS");

esp_vfs_spiffs_conf_t conf = {

.base_path = "/spiffs",

.partition_label = NULL,

.max_files = 5,

.format_if_mount_failed = true

};

// Use settings defined above to initialize and mount SPIFFS filesystem.

// Note: esp_vfs_spiffs_register is an all-in-one convenience function.

esp_err_t ret = esp_vfs_spiffs_register(&conf);

if (ret != ESP_OK) {

if (ret == ESP_FAIL) {

ESP_LOGE(TAG, "Failed to mount or format filesystem");

} else if (ret == ESP_ERR_NOT_FOUND) {

ESP_LOGE(TAG, "Failed to find SPIFFS partition");

} else {

ESP_LOGE(TAG, "Failed to initialize SPIFFS (%s)", esp_err_to_name(ret));

}

return;

}

size_t total = 0, used = 0;

ret = esp_spiffs_info(NULL, &total, &used);

if (ret != ESP_OK) {

ESP_LOGE(TAG, "Failed to get SPIFFS partition information (%s)", esp_err_to_name(ret));

} else {

ESP_LOGI(TAG, "Partition size: total: %d, used: %d", total, used);

}

// Use POSIX and C standard library functions to work with files.

// First create a file.

ESP_LOGI(TAG, "Opening file");

FILE* f = fopen("/spiffs/hello.txt", "w");

if (f == NULL) {

ESP_LOGE(TAG, "Failed to open file for writing");

return;

}

fprintf(f, "Hello World!\n");

fclose(f);

ESP_LOGI(TAG, "File written");

// Check if destination file exists before renaming

struct stat st;

if (stat("/spiffs/foo.txt", &st) == 0) {

// Delete it if it exists

unlink("/spiffs/foo.txt");

}

// Rename original file

ESP_LOGI(TAG, "Renaming file");

if (rename("/spiffs/hello.txt", "/spiffs/foo.txt") != 0) {

ESP_LOGE(TAG, "Rename failed");

return;

}

// Open renamed file for reading

ESP_LOGI(TAG, "Reading file");

f = fopen("/spiffs/foo.txt", "r");

if (f == NULL) {

ESP_LOGE(TAG, "Failed to open file for reading");

return;

}

char line[64];

fgets(line, sizeof(line), f);

fclose(f);

// strip newline

char* pos = strchr(line, '\n');

if (pos) {

*pos = '\0';

}

ESP_LOGI(TAG, "Read from file: '%s'", line);

// All done, unmount partition and disable SPIFFS

esp_vfs_spiffs_unregister(NULL);

ESP_LOGI(TAG, "SPIFFS unmounted");

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HDU - 1968】【UVA - 12096】The SetStack Computer (模拟,集合求交集并集操作,STL实现)

题干: Background from Wikipedia: 揝et theory is a branch of mathematics created principally by the German mathematician Georg Cantor at the end of the 19th century. Initially controversial, set theory has come to play the role of a foundational…

info testing mysql_SQLMASQLMAP中文说明(linux版本)

这个东西,是mickey整理的,不多说了,尊重一下原作者,转载注明mickey整理就好了更新svn checkout https://svn.sqlmap.org/sqlmap/trunk/sqlmap sqlmap-devsqlmap.py -u "http://www.islamichina.com/hotelinchina.asp?cityid…

关于C++里面使用set_union,set_intersections、set_merge、set_difference、set_symmetric_difference等函数的使用总结

set里面有set_intersection(取集合交集)、set_union(取集合并集)、set_difference(取集合差集)、set_symmetric_difference(取集合对称差集)等函数。其中,关于函数的五个…

java mouseenter_关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别

最近在做的在线考试和课程商城都遇到这样的问题:就是鼠标滑过的时候出现一个层,当鼠标滑到当前层的话mouseover和mouseout在低版本的浏览器会出现闪动的现象,解决这个现象的办法有许多,不过我觉得有一种是最简单的那就是把mouseov…

【HDU - 1465 】不容易系列之一 (组合数学,错排)

题干: 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一…

java gc回收机制种类_JAVA的垃圾回收机制(GC)

1.什么是垃圾回收?垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。2.什么时候垃圾回收?System.gc()Runtime.getRuntime().gc()上面的方法调用时用于显式通知…

【HDU - 4217 】Data Structure? (线段树求第k小数)

题干: Data structure is one of the basic skills for Computer Science students, which is a particular way of storing and organizing data in a computer so that it can be used efficiently. Today let me introduce a data-structure-like problem for y…

java redis 重连_突破Java面试(23-4) - Redis 复制原理

全是干货的技术号:本文已收录在github,欢迎 star/fork:在Redis复制的基础上(不包括Redis Cluster或Redis Sentinel作为附加层提供的高可用功能),使用和配置主从复制非常简单,能使得从 Redis 服务器(下文称 slave)能精确…

【HDU - 4006】The kth great number (优先队列,求第k大的数)

题干: Xiao Ming and Xiao Bao are playing a simple Numbers game. In a round Xiao Ming can choose to write down a number, or ask Xiao Bao what the kth great number is. Because the number written by Xiao Ming is too much, Xiao Bao is feeling giddy…

java获取u盘_实例分享java监听u盘的方法

package org.load.u;import java.io.File;import java.util.LinkedHashMap;import java.util.Map;// U盘检测public class CheckU {// 存放磁盘状态private static Map map new LinkedHashMap();// 定义磁盘private static final String[] arr new String[] {"C", …

【POJ - 1562】Oil Deposits (dfs搜索,连通块问题)

题干: The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. It …

python列表浅复制_Python列表深浅复制详解

转自:https://www.cnblogs.com/blaomao/p/7239203.html在文章《Python 数据类型》里边介绍了列表的用法,其中列表有个 copy() 方法,意思是复制一个相同的列表。例如1 names ["小明", "小红", "小黑", "小…

【HYSBZ - 1192】鬼谷子的钱袋(水题,二进制)

题干: 鬼谷子非常聪明,正因为这样,他非常繁忙,经常有各诸侯车的特派员前来向他咨询时政。有一天,他在咸阳游历的时候,朋友告诉他在咸阳最大的拍卖行(聚宝商行)将要举行一场拍卖会&a…

【CodeForces - 735B】Urbanization (找规律,思维)

题干: Local authorities have heard a lot about combinatorial abilities of Ostap Bender so they decided to ask his help in the question of urbanization. There are n people who plan to move to the cities. The wealth of the i of them is equal to a…

java 文本查找_Java基于正则表达式实现查找匹配的文本功能【经典实例】

本文实例讲述了Java基于正则表达式实现查找匹配的文本功能。分享给大家供大家参考,具体如下:REMatch.java:package reMatch;import java.util.regex.Matcher;import java.util.regex.Pattern;/*** Created by Frank*/public class REMatch {p…

【51nod - 1073】约瑟夫环问题模板

题干: N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。 例如:N 3,K 2。2号先出列,然后是1号&am…

java oracle database user dsn_跨会话序列化数据库连接

我正在开发一个web应用程序,它需要使用最终用户提供的凭据登录到数据库;应用程序本身没有登录到数据库。在问题是如何为每个用户会话创建一个连接。在一种方法是:请求用户凭据检查针对数据库后端的凭据是否有效在会话级变量中存储凭据这种方法…

【POJ - 3125 】Printer Queue(模拟,队列+优先队列,STL)

题干: The only printer in the computer science students union is experiencing an extremely heavy workload. Sometimes there are a hundred jobs in the printer queue and you may have to wait for hours to get a single page of output. Because some …

java循环单链表类构造函数_C++实现双向循环链表

本文实例为大家分享了C实现双向循环链表的具体代码,供大家参考,具体内容如下一、概念1.在双链表中的每个结点应有两个链接指针:lLink -> 指向前驱结点 (前驱指针或者左链指针)rLink->指向后继结点(后驱指针或者右链指针)2.双链表常采用…

*【CodeForces - 799C】Fountains (线段树 或 树状数组,类似二元组问题)

题干: Arkady plays Gardenscapes a lot. Arkady wants to build two new fountains. There are n available fountains, for each fountain its beauty and cost are known. There are two types of money in the game: coins and diamonds, so each fountain cos…