ESP8266_RTOS_SDK之SPIFFS

        需要在ESP8266的FLASH中存储一些可变参数,有两种方式,一种是调用SPI Flash API直接指定地址读写FLASH;二是在SPI FLASH上创建一块SPIFFS 分区,以读写文件的形式存取数据。

下面记录第二种方式,使用SPIFFS文件系统存取参数。

查看当前分区情况:

进入编译目录,执行make partition_table编译分区,结果如下:

# Espressif ESP32 Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs,data,nvs,0x9000,16K,
otadata,data,ota,0xd000,8K,
phy_init,data,phy,0xf000,4K,
ota_0,app,ota_0,0x10000,960K,
ota_1,app,ota_1,0x110000,960K,

总共占了2M空间,SPI FLASH总尺寸为2M(2048K)。不过ota_0与ota_1之间还有64K没有使用,那么就将spiffs分区设置在此处,尺寸为64K。

重新生成分区表

在工程目录下创建一个partitions_two_ota_spiffs.csv文件,内容如下:

# Name,   Type, SubType, Offset,   Size, Flags
# Note: if you change the phy_init or app partition offset, make sure to change the offset in Kconfig.projbuild
nvs,      data, nvs,     0x9000,  0x4000
otadata,  data, ota,     0xd000,  0x2000
phy_init, data, phy,     0xf000,  0x1000
ota_0,    0,    ota_0,   0x10000, 0xF0000
storage,  data, spiffs,  0x100000,0x10000
ota_1,    0,    ota_1,   0x110000,0xF0000

其它分区不变,增加spiffs分区,地址:0x100000,大小:0x10000(64K)。

执行make menuconfig,Partition Table选择Custom partition table CSV,Custom partition CSV file 选择partitions_two_ota_spiffs.csv。

 

 保存之后,退出。

执行make partition_table重新编译分区文件,编译之后分区信息如下:

# Espressif ESP32 Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs,data,nvs,0x9000,16K,
otadata,data,ota,0xd000,8K,
phy_init,data,phy,0xf000,4K,
ota_0,app,ota_0,0x10000,960K,
storage,data,spiffs,0x100000,64K,
ota_1,app,ota_1,0x110000,960K,

 执行make partition_table-flash ESPPORT=COM10 ESPBAUD=115200烧写分区。

测试SPIFFS

参考esp-idf\ESP8266_RTOS_SDK\examples\storage\spiffs\例程,在void app_main(void)()中加入测试代码:

void SPIFFS_Init( 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");

}

 编译应用并烧写到设备,启动日志如下:

[0m[0;32mI (2971) storage: Partition size: total: 52961, used: 0[0m
[0mI (3030) storage: Opening file[0m
[0;32mI (3197) storage: File written[0m
[0;32mI (3229) storage: Renaming file[0m
[0;32mI (3279) storage: Reading file[0m
[0;32mI (3319) storage: Read from file: 'Hello World!'[0m
[0;32mI (3379) storage: SPIFFS unmounted[0m

实际可使用的空间大小为51k。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Unity入门】20.三维向量

【Unity入门】三维向量 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一)空间向量 (1)什么是三维向量 为什么会有这么一篇博客呢?主要是三维向量在unity中…

数据库之事务隔离级别详解

事务隔离级别详解 一、事务的四大特性(ACID)1. 原子性(atomicity):2. 一致性(consistency):3. 隔离性(isolation):4. 持久性(durability): 二、事务的四种隔离级别1. 读未提交(Read uncommitted)&#xff1…

吧佬联手抵制奸商,百元级游戏电脑横出江湖

最近小忆闲得在电商平台搜索了下关键词「游戏主机」,不出意外销量榜前列清一色全是「i9 级高端游戏主机」。 这些主机不论配置单介绍还是十万百万级销量宣传标语,都给人一种血赚不亏的「豪华」感。 咱就说时代在变,唯一不变的是奸商们的套路与…

指针函数和函数指针

本文目录 • 前言 • 一、返回指针的函数 二、指向函数的指针回到顶部 一、返回指针的函数 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的。 返回指针的函数的一般形式为:类型名 * 函数名(参数列表) 比如下面这个函数&#…

「Codeforces」771-div2 E. Colorful Operations

E. Colorful Operations https://codeforces.com/contest/1638/problem/E 题目描述 给你一个数组,默认初始元素为 0 ,颜色为 1,有三种操作: Color l r c:将 [l, r] 区间内的颜色修改为 cAdd c x:将所有颜…

SpringBoot整合Minio,一篇带你入门使用Minio

本文介绍SpringBoot如何整合Minio,解决文件存储问题 文章目录 前言环境搭建项目环境搭建添加依赖库yml配置 Docker安装minio 代码实现MiniConfigservicecontroller 测试 前言 参考链接: 官网 环境搭建 项目环境搭建 将minio单独封装成一个module&am…

LeetCode单链表OJ题目做题思路分享

目录 移除链表元素链表的中间节点链表中倒数第K个节点合并两个有序链表 移除链表元素 链接: link 题目描述: 思路分享: 我们上个博客分享了第一种方法,下面我们分析第二种方法:思路就是将每一个不等于我们要删除的值的节点依次尾…

如何快速获取已发表学术论文的期刊封面及目录(caj格式下载和caj转pdf)

目录 1 下载caj格式的封面和目录 2 CAJ格式的封面和目录转PDF格式 在进行职称评审或成果申报时,一般要求提交你发表的成果所在的期刊的当期封面和目录。本文就手把手带带你制作一个期刊目录。 重要提示:下载期刊封面和目录需要你有知网账号&#xff0…

Java读取Properties配置文件的6种方式

Java读取Properties的方式 项目结构:经典的maven项目结构 配置文件1和2内容一致: jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urlmysql://localhost:3306/database?useUnicodetrue&characterEncodingutf-8&serverTimezoneAsia/Shanghai jdbc.…

【深度学习】计算机视觉(13)——模型评价及结果记录

1 Tensorboard怎么解读? 因为意识到tensorboard的使用远不止画个图放个图片那么简单,所以这里总结一些关键知识的笔记。由于时间问题,我先学习目前使用最多的功能,大部分源码都包含summary的具体使用,基本不需要自己修…

找高清无水印视频素材,就上这9个网站。

推荐几个我的视频素材库,有免费、收费、商用,希望对大家有帮助! 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库可以找到设计、办公、图片、视频、音频等各种素材。视频素材就有上千个,全部都很高清&…

unityt光线透射目标

介绍 在Unity中,光线透射目标通常指的是在场景中放置的一些物体,用于模拟光线从一个物体透过到另一个物体的效果。canvas子物体组件中,勾不勾选“光线透射目标”有什么区别? 方法 在Canvas子物体组件中勾选“光线透射目标”时&…

Python基础合集 练习17(类与对象)

class Dog: pass papiDog() print(papi) print(type(papi)) 构建方法 创建类过后可以定义一个特殊的方法。在python中构建方法是__init__(),init()必须包含一个self参数 class pig(): #def__init__(self) -> None: print(‘你好’) pipgpig() 属性和方法 cl…

C++好难(2):类和对象(上篇)

okay,从这里开始,就进入c比较难的部分了~啊啊啊!!! (﹃ԅ) 坚持坚持啦 ~ ᵎ(•̀㉨•́)و ̑̑ 【本章目标】 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实…

(1)QT基础铺垫

目录 1.Qt特性 2. 新建项目 3. 工作目录与构建目录 4. 工作目录 4.1 .pro 项目配置文件 4.2 dialog.h 4.3 dialog.cpp 4.4 main.cpp 5. 帮助文档 6. 调试信息 1.Qt特性 Qt经常被当作是一个基于c语言的gui开发框架,但是这并不是qt的全部,除了开…

JavaWeb( 二 ) URL

1.4.URL统一资源定位符 URL代表Uniform Resource Locator 统一资源定位符,也叫 URL地址 。是用于标识和定位Web上资源的地址,通常用于在Web浏览器中访问网站和文件。 URL由若干部分组成,scheme:// host : port / path 例如: htt…

WxGL应用实例:绘制点云

WxGL附带了几个工具函数,其中read_pcfile用来解析.ply和.pcd格式的点云文件,该函数返回一个PointCloudData类实例,包含以下属性: PointCloudData.ok - 数据是否可用,布尔型PointCloudData.info - 数据可用性说明&…

《通过十几轮数据进行模型训练,实现精确的无创血糖测量的演绎学习》阅读笔记

目录 0 演绎学习 1 论文摘要 2 论文十问 3 论文亮点与不足之处 4 与其他研究的比较 5 实际应用与影响 6 个人思考与启示 参考文献 0 演绎学习 在本文中,DL指的是Deduction Learning,即演绎学习方法。该方法是一种机器学习方法,通过使…

简单毛概刷题网页制作 3.0(拖欠近一年版)

原因是大概一年之前学校的毛概期末刷题网站突然崩了,但是一直没有修复。当时眼看着复习时间逐渐被压缩,自己啥也做不了,遂自学前端完成毛概刷题网页一枚。 最早的毛概刷题网站仅仅是 1.0 版本(传送门),功能…

STM32F4_USMART调试组件

目录 1. USMART是什么? 2. USMART的特点 3. USMART实现流程 4. USMART组件 5. 在usmart_config.c中添加想要被USMART调用的函数 6. 实验程序 6.1 main.c 6.2 usmart.c 6.3 usmart.h 7. USMART调试的优越性说明 1. USMART是什么? USMART 是 AL…