FAT : file allocation table 文件分配表
最早,最简单,兼容性最强的 磁盘文件系统,,微软开发

esp-idf通过 FatFs库 支持这种文件系统


系统卷 volume : 卷就是一块呗格式化,可以存文件的存储区域,,,比如c盘,d盘,,等本质都是volume

VFS : virtual file system : 虚拟文件系统
给上层程序提供统一的文件操作系统

POSIX : portable operating system interface
可移植的操作系统接口 :POSIX规定了操作系统应该提供哪些接口,,让程序可以在不同的操作系统之间更容易移植

POSIX是标准,,, linux 。macOS,unix是实现

esp32是esp-idf提供了一部分POSIX的兼容层

POSIX : 是上层统一接口
VFS: 是中间抽象层
FAT / SPIFFS 是具体的文件系统

在这里插入图片描述


spiffs : spi flash file system
spi flash文件系统

FAT : file allocation table

  • SD卡,,u盘

spiffs : esp32内部的flash,,, 把一块存储空间管理成 文件和目录,,让程序可以直接 操作

spiffs: 是给esp32内部flash用的小型文件系统
FAT: 给SD卡 u盘,,这类存储用的通用文件系统

FAT电脑可以直接看到,,, spiffs,windows不认识spiffs

传统spiffs,,目录支持较弱,,大文件写入效率低,碎片问题,,,flash不能直接覆盖,需要擦除


spiffs :

#include <stdio.h>
#include <string.h>

#include "esp_spiffs.h"
#include "esp_vfs_fat.h"
#include "nvs_flash.h"
#include "driver/sdmmc_host.h"

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

// nvs最长15个字节

static char read_buffer[64];

#define NVS_SSID_KEY "ssid"

/**
 * spiffs 做不到使用全部的大小,,,只能稳定使用百分之75左右,,分配了1M,实际不到1M
 */
void app_main(void)
{

    esp_vfs_spiffs_conf_t conf = {
        .base_path = "/spiffs", // 挂载点
        .partition_label = NULL, // spiffs分区的名字,,标签
        .max_files = 5,
        .format_if_mount_failed = true
    };

    // 挂载     // 将文件系统  和 vfs关联起来  (virtual file system)
   esp_err_t  ret =  esp_vfs_spiffs_register(&conf);
    if (ret != ESP_OK) {
        printf("failed mount spiffs \n");
        return;
    }


    // esp-idf用来检查并修复spiffs文件系统一致性的函数,,,,
    // spiffs就像一个小硬盘,,突然断电,写入中断后,里面的文件索引可能不一致,,,需要调用这个做磁盘检查
    // 一般只在初始化的时候调用一次
    ret = esp_spiffs_check(conf.partition_label);
    if (ret != ESP_OK) {
        printf("spiffs check failed \n");
        return;
    }

    // 获取文件区域大小
    size_t total = 0;
    size_t used = 0;
    ret = esp_spiffs_info(conf.partition_label,&total,&used);
    if (ret != ESP_OK) {
        printf("spiffs info failed \n");
        return;
    }
    printf("spiffs total is %d,used is %d \n",total,used);



    // 写入文件,, 要在挂载点路径下面
    FILE * f = fopen("/spiffs/hello.txt","w");

    if (f == NULL) {
        printf("spiffs failed open file");
        return;
    }


    fprintf(f,"hello  world \n");
    fclose(f);

    vTaskDelay(pdMS_TO_TICKS(1000));

    FILE * fr = fopen("/spiffs/hello.txt","r");
    if (fr == NULL) {
        printf("spiffs failed open file");
        return;
    }
    char buffer[8];

    // 缓冲区足够大,,完整读完,末尾带 \n
    // 缓冲区不够,fgets读满缓冲区,就不会带\n
    fgets(buffer,8,fr);
    fclose(fr);
;

    // 将换行符替换成  结束符 0
    char *pos = strchr(buffer,'\n');
    if (pos) {
        *pos = 0;
    }

    printf("content is %s\n",buffer);


    // 写在spiffs。。并从vfs中注销
    esp_vfs_spiffs_unregister(conf.partition_label);
}


jpg图像数据

JPEG ,,jpg,,文件有固定的标志头和结束标志,,,
esp32摄像头mjpeg视频流,可以通过查找标志来切割jpeg数据

  • jpeg开始标志 FFD8
  • jpeg结束标志 FFD9

其中的数据是经过压缩的,不能直接输出到显示屏上

menuconfig 配置lvgl

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐