文件系统的作用

在一个完整的嵌入式系统中,进行一个简单的操作(如读取传感器数据并保存到文件)通常会涉及多个步骤。这些步骤包括硬件初始化、数据采集、处理、存储以及与外部系统交互。以下是一个通用的操作流程及文件系统在其中的作用。


嵌入式系统的操作流程

读取传感器数据并保存到文件为例,整个流程分为以下几步:

1. 系统启动和初始化
  • 硬件初始化

    • MCU 启动,从闪存加载固件到 RAM。
    • 初始化系统时钟、GPIO、通信总线(如 I2C/SPI)。
    • 启动设备驱动程序,准备传感器和存储设备。
  • 文件系统挂载

    • 如果系统中使用了闪存,需要挂载文件系统(如 LittleFS、SPIFFS)。
    • 检查文件系统是否存在或是否损坏,必要时格式化。

文件系统作用:
此时,文件系统确保存储介质上的数据结构合法,并为后续操作提供读写接口。


2. 数据采集
  • MCU 通过传感器驱动程序(I2C/SPI/ADC 等)采集数据。
  • 对采集到的原始数据进行简单处理或过滤(如单位转换、去噪等)。

文件系统作用:
此步与文件系统无直接关系,数据尚未存储。


3. 数据处理
  • 将采集到的数据存储到内存(RAM)中。
  • 可能进行进一步处理,如:
    • 数据格式化(JSON、二进制、CSV 等)。
    • 数据合并或压缩,减少存储需求。

文件系统作用:
此步仍与文件系统无直接关联,但准备好数据后会调用文件系统接口进行存储。


4. 数据存储(与文件系统密切相关)
  • 文件操作过程:

    1. 打开文件:
      lfs_file_open(&lfs, &file, "data.txt", LFS_O_WRONLY | LFS_O_CREAT);
      
      文件系统根据文件名检查是否存在,如果不存在则创建。
    2. 写入数据:
      lfs_file_write(&lfs, &file, buffer, size);
      
      文件系统将数据写入指定文件,并处理底层的闪存写入。
    3. 关闭文件:
      lfs_file_close(&lfs, &file);
      
      文件系统刷新数据到物理存储器并关闭文件,确保数据一致性。
  • 额外操作:

    • 如果存储设备满了,文件系统可以管理文件删除、重命名等操作。

文件系统作用:
文件系统在这一阶段负责:

  1. 抽象存储操作,使开发者只需关注文件接口而非底层闪存操作。
  2. 数据可靠性,通过日志结构和磨损均衡保证存储器寿命和数据一致性。

5. 数据上传(可选)
  • MCU 将存储在闪存中的文件通过通信模块(如 WiFi、BLE、UART)发送到外部系统。
  • 发送后,可选择清理文件系统中的旧数据。

文件系统作用:
文件系统提供文件的读取接口,用于发送前的数据加载。例如:

lfs_file_open(&lfs, &file, "data.txt", LFS_O_RDONLY);
lfs_file_read(&lfs, &file, buffer, size);
lfs_file_close(&lfs, &file);

6. 系统待机或继续操作
  • MCU 进入低功耗模式或等待下一次采集任务。
  • 文件系统挂载状态保留,或在低功耗模式中卸载以节省资源。

文件系统作用:
文件系统需要确保在下一次挂载时仍能正常访问数据。


文件系统在流程中的关键作用

  1. 初始化阶段

    • 格式化或挂载存储介质,确保文件系统有效。
    • 提供 API,方便后续读写操作。
  2. 数据写入阶段

    • 负责将数据从 RAM 转移到闪存。
    • 提供原子性操作,避免数据丢失或损坏。
    • 管理闪存的磨损均衡,延长设备寿命。
  3. 数据读取阶段

    • 提供文件读取接口,用于上传或处理存储的数据。
  4. 系统维护阶段

    • 管理存储空间(如删除旧文件)。
    • 在设备重启后确保数据一致性。

流程总结图

[启动与初始化]
    |
    +---> 挂载文件系统
    |
[数据采集]
    |
[数据处理]
    |
[数据存储 (文件系统核心操作)]
    |
[数据上传/读取]
    |
[系统待机或下一循环]

例子代码:完整实现

#include "lfs.h"

// LittleFS 配置
struct lfs_config cfg = {
    .read = flash_read,
    .prog = flash_prog,
    .erase = flash_erase,
    .sync = flash_sync,
    .block_size = 512,
    .block_count = 1024,
    .cache_size = 64,
    .lookahead_size = 64,
};

lfs_t lfs;           // 文件系统对象
lfs_file_t file;     // 文件对象

void main() {
    // 系统初始化
    system_init();
    sensor_init();

    // 文件系统挂载
    if (lfs_mount(&lfs, &cfg)) {
        lfs_format(&lfs, &cfg);
        lfs_mount(&lfs, &cfg);
    }

    // 数据采集
    int sensor_data = read_sensor();

    // 数据处理
    char buffer[64];
    snprintf(buffer, sizeof(buffer), "Sensor Value: %d\n", sensor_data);

    // 数据存储
    lfs_file_open(&lfs, &file, "data.txt", LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND);
    lfs_file_write(&lfs, &file, buffer, strlen(buffer));
    lfs_file_close(&lfs, &file);

    // 系统待机
    lfs_unmount(&lfs);
    system_sleep();
}

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

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

相关文章

从Full-Text Search全文检索到RAG检索增强

从Full-Text Search全文检索到RAG检索增强 时光飞逝,转眼间六年过去了,六年前铁蛋优化单表千万级数据查询性能的场景依然历历在目,铁蛋也从最开始做CRUD转行去了大数据平台开发,混迹包装开源的业务,机缘巧合下做了实时…

LLM PPT Translator

LLM PPT Translator 引言Github 地址UI PreviewTranslated Result Samples 引言 周末开发了1个PowerPoint文档翻译工具,上传PowerPoint文档,指定想翻译的目标语言,通过LLM的能力将文档翻译成目标语言的文档。 Github 地址 https://github.…

【踩坑】git中文乱码问题

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 背景说明 使用git diff显示中文乱码,如: 修复方法 执行一次: export LESSCHARSETutf-8 如果需要下次登录免输入…

安装Docker报错TCP connection reset by peer或者Timeout

原因:访问的外网下载导致超时或者断连接报错 修改为国内阿里下载地址 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

Linux宝塔部署wordpress网站更换服务器IP后无法访问管理后台和打开网站页面显示错乱

一、背景: wordpress网站搬家,更换服务器IP后,如果没有域名时,使用服务器IP地址无法访问管理后台和打开网站页面显示错乱。 二、解决方法如下: 1.wordpress搬家后,在新服务器上,新建站点时&am…

Rust Newtype模式(通过结构体封装现有类型来创建新的类型)(单字段结构体,通过.0访问)模式匹配、解构、DerefMut

文章目录 深入理解Rust中的Newtype模式什么是Newtype模式?Newtype模式的基本形式Newtype的访问访问 Newtype 的值1. 通过 .0 访问字段2. 通过方法访问3. 通过模式匹配(解构)访问 总结 Newtype模式的应用场景1. 类型安全2. 增强可读性3. 定制化…

【ArcGIS Pro】实现一下完美的坐标点标注

在CAD里利用湘源可以很快点出一个完美的坐标点标注。 但是在ArcGIS Pro中要实现这个效果却并不容易。 虽然有点标题党,这里就尽量在ArcGIS Pro中实现一下。 01 标注实现方法 首先是准备工作,准备一个点要素图层,包含xy坐标字段。 在地图框…

【ArcGIS Pro实操第10期】统计某个shp文件中不同区域内的站点数

统计某个shp文件中不同区域内的站点数 方法 1:使用“空间连接 (Spatial Join)”工具方法 2:使用“点计数 (Point Count)”工具方法 3:通过“选择 (Select by Location)”统计方法 4:通过“Python 脚本 (ArcPy)”实现参考 在 ArcGI…

学习threejs,使用设置lightMap光照贴图创建阴影效果

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshLambertMaterial…

Cocos编辑器

1、下载 下载地址:https://www.cocos.com/creator-download 2、编辑器界面介绍 官方链接:https://docs.cocos.com/creator/3.8/manual/zh/editor/ 3、项目结构 官方链接:https://docs.cocos.com/creator/3.8/manual/zh/getting-started/…

C++11特性(详解)

目录 1.C11简介 2.列表初始化 3.声明 1.auto 2.decltype 3.nullptr 4.范围for循环 5.智能指针 6.STL的一些变化 7.右值引用和移动语义 1.左值引用和右值引用 2.左值引用和右值引用的比较 3.右值引用的使用场景和意义 4.右值引用引用左值及其一些更深入的使用场景分…

Notepad++ 替换所有数字给数字加单引号

前言 今天遇到这样一个场景: 要去更新某张表里 code1,2,3,4,5,6 的数据,把它的 name 设置为 ‘张三’ 但是 code在数据库里面的字段类型是 vachar(64),它自身携带索引 原本可以这样写 SQL: update tableA set namezhangsan where code in …

Django 路由层

1. 路由基础概念 URLconf (URL 配置):Django 的路由系统是基于 urls.py 文件定义的。路径匹配:通过模式匹配 URL,并将请求传递给对应的视图处理函数。命名路由:每个路由可以定义一个名称,用于反向解析。 2. 基本路由配…

工作中可以用到的前端小知识(不定时更新)

1、split 结合 filter(Boolean)使用,可以过滤空字符 2、分割 Unicode 字符 用 Array.from() 实现 const text "👍😊👨‍👩‍👦"; const result Array.from(text); console.log(result); // 输…

第R4周:LSTM-火灾温度预测(TensorFlow版)

>- **🍨 本文为[🔗365天深度学习训练营]中的学习记录博客** >- **🍖 原作者:[K同学啊]** 往期文章可查阅: 深度学习总结 任务说明:数据集中提供了火灾温度(Tem1)、一氧化碳浓度…

CTF-Hub SQL 报错注入(纯手动注入)

​ 当输入1时,发现只有查询正确,基本上可以判断出没有回显 开始注入(工具hackerBar) 题目是报错注入,方向就比较明显,大致说一下用到的函数和原理。 常见报错注入函数: 通过 floor() 报错注入通过 extractValue() …

创建HTTPS网站

每天,我们都会听到网络上发生身份盗窃和数据侵权的案例,这导致用户对自己访问的网站更加怀疑。他们开始更加了解自己将个人信息放在哪里以及信任哪些类型的网站。了解如何使网站使用HTTPS变得比以往任何时候都更加重要。 解读缩略词:HTTP与HT…

计算(a+b)/c的值

计算(ab)/c的值 C语言代码C语言代码Java语言代码Python语言代码 💐The Begin💐点点关注,收藏不迷路💐 给定3个整数a、b、c,计算表达式(ab)/c的值,/是整除运算。 输入 输入仅一行&…

Flink Sink的使用

经过一系列Transformation转换操作后,最后一定要调用Sink操作,才会形成一个完整的DataFlow拓扑。只有调用了Sink操作,才会产生最终的计算结果,这些数据可以写入到的文件、输出到指定的网络端口、消息中间件、外部的文件系统或者是…

Java【多线程】(1)进程与线程

目录 1.前言 2.正文 2.1什么是进程 2.2PCB(进程控制块) 2.2.1进程id 2.2.2内存指针 2.2.3文件描述符表 2.2.4进程状态 2.2.4.1就绪状态 2.2.4.2阻塞状态 2.2.5进程优先级 2.2.6进程上下文 2.2.7进程的记账信息 2.3CPU操作进程的方法 2.4什…