[RT-Thread]基于ARTPI的文件系统认识与搭建
[写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,故以此作文]
目录
[写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,故以此作文]
前提
内容
认识
基于ARTPI的文件系统的挂载
ROMFS与LFS. (默认自动挂载,romfs可读不可写)
搭建RAMFS文件系统(快,可读可写,掉电丢失数据)
ARPI使用外部SPI FLASH搭建外部文件系统(可读可写)
总结
前提
首先RT-Thread官网对文件系统已经有非常详细的文档了,这得益于rtt的强大给力的社区团队.
更何况我用的还是rtt官方的开发板 ART PI,A代表第一个,RT代表RT-Thread,不知道以后会不会是BRT-PI ,CRT-PI哈哈哈.本次的搭建文件系统收益于官方给出的BSP的快速开发.ARTPI也是一个极其经典的开发板了.
内容
认识
认识文件系统,以经典的话来总结,文件系统是一层软件,用来对真实的设备如FLASH,RAM,SD卡以文件的形式进行操作或者直接对设备进行访问等。一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型 (Abstract data type),是一种用于向用户提供底层数据访问的机制.后面这一段加粗的正是官方给的定义.
各种不同的文件系统通过多层的封装可以像linux那样通过open,write,read这些函数进行操作处理。
文件系统的初始化过程一般分为以下几个步骤:
- 初始化 DFS 组件。
- 初始化具体类型的文件系统。
- 在存储器上创建块设备。
- 格式化块设备。
- 挂载块设备到 DFS 目录中。
- 当文件系统不再使用,可以将它卸载。
DFS是虚拟文件系统组件,dfs为什么文件系统被冠以虚拟二字?
1. 提供标准化的文件/设备访问API。通过标准的open/read/write等接口访问不同的文件系统和设备。
2. 支持多种文件系统和设备的挂载。如FATFS、RomFS、RAMFS以及字符设备、块设备等。
3. 通过统一的接口处理不同文件系统的差异性。对上层透明,方便应用端口。
4. 支持不同文件系统间的操作。如可以读取RomFS上的文件写入FATFS。
5. 异步化设计,API可工作在中断服务例程中。
6. 相关源代码在components/dfs目录下。使用VFS的好处是方便移植不同的文件系统,对访问文件系统的应用程序透明,使应用程序可以应用于不同的RTOS上。RT-Thread中的VFS实现了POSIX风格的文件和设备访问API,可以支持FatFS、LittleFS、RomFS等多种文件系统,也可以访问各种设备,使用起来方便灵活。
简而言之,DFS是一层软件来管理具体的文件系统,其他的具体的文件系统都要注册到dfs中,这样就能使用统一的接口进行操作.
基于ARTPI的文件系统的挂载
dfs提供了根目录 / .
ROMFS与LFS. (默认自动挂载,romfs可读不可写)
一般romfs会在根目录下创建几个目录,用来给别的文件系统挂载,文件系统必须要挂载在存在的目录下面.ARTPI开启了对应的文件系统后,初始化和注册都是自动完成的.romfs在ARTPI中自动初始化了并挂载在了根目录下.并创建了几个其他的目录.
若是需要新增其他的目录,则自行更改_romfs_root[]数组.
在mount_init中自动挂载romfs,并根据宏判断是否挂载LFS或SDCARD_FS
int mount_init(void)
{if (dfs_mount(RT_NULL, "/", "rom", 0, &(romfs_root)) != 0){LOG_E("rom mount to '/' failed!");}#ifdef BSP_USING_SPI_FLASH_FSstruct rt_device *flash_dev = RT_NULL;#ifndef RT_USING_WIFIfal_init();#endifflash_dev = fal_mtd_nor_device_create("filesystem");if (flash_dev){//mount filesystemif (dfs_mount(flash_dev->parent.name, "/flash", "lfs", 0, 0) != 0){LOG_W("mount to '/flash' failed! try to mkfs %s", flash_dev->parent.name);dfs_mkfs("lfs", flash_dev->parent.name);if (dfs_mount(flash_dev->parent.name, "/flash", "lfs", 0, 0) == 0){LOG_I("mount to '/flash' success!");}}else{LOG_I("mount to '/flash' success!");}}else{LOG_E("Can't create block device filesystem or bt_image partition.");}#endif#ifdef BSP_USING_SDCARD_FSrt_thread_t tid;rt_pin_mode(SD_CHECK_PIN, PIN_MODE_INPUT_PULLUP);tid = rt_thread_create("sd_mount", sd_mount, RT_NULL,2048, RT_THREAD_PRIORITY_MAX - 2, 20);if (tid != RT_NULL){rt_thread_startup(tid);}else{LOG_E("create sd_mount thread err!");}#endifreturn RT_EOK;
}
INIT_APP_EXPORT(mount_init);
这里的是BSP写好的,使能SPI filesystem后则自动在NOR SPI flash 上挂载LFS.正如上面的代码一样.有两种方式可以使用lfs
- 通过MTD框架创建mtd nor flash设备,然后在该设备上挂载LFS文件系统。正如上面一样,使用mtd框架创建mtd nor flash设备,好处是再一次进行抽象,不用自己去实现norflash的操作接口.
- .直接与NOR Flash芯片进行交互,实现LFS需要的4个操作接口,然后可以直接在NOR Flash上创建LFS文件系统,不需要mtd设备。第二种方式可以减少一次抽象层,但需要自己处理底层NOR Flash的操作。
搭建RAMFS文件系统(快,可读可写,掉电丢失数据)
这个就相当于使用内部的ram来作为文件系统,ARTPI内部有1M的ram.
使用1K来挂载RAMFS在根目录下
void myramstest1(void)
{dfs_unmount("/"); //unmounted romvoid * ret = rt_malloc(1024);if(ret == NULL){rt_kprintf("malloc error\r\n");return ;}if (dfs_mount(RT_NULL, "/", "ram", 0, dfs_ramfs_create(ret,1024)) == 0){rt_kprintf("RAM file system initializated!\n");}else{rt_kprintf("RAM file system initializate failed!\n");}}
ARPI使用外部SPI FLASH搭建外部文件系统(可读可写)
ARTPI有一个NOR SPI接口的FLASH,还有一个qspi接口的flash,这两个FLASH都挺大的,在它的bsp中默认把这个nor spi flash进行了分区:
在fal.cfg.h下定义了分区表
在norflash0设备的filesystem分区(12M)下挂载fat文件系统到/flash目录下,/flash目录是由romfs创建的一个目录.
/*** mount fat filesystem* */#include "fal.h"
#include "dfs_file.h"
#define FS_PARTITION_NAME "filesystem"
#define mymountpoint "/flash"void MountFAT(void )
{// tate flash partition to block devicestruct rt_device *flash_dev = fal_blk_device_create(FS_PARTITION_NAME);if (flash_dev == NULL){rt_kprintf("Can't create a block device on '%s' partition.\n", FS_PARTITION_NAME);}else{rt_kprintf("Create a block device on the %s partition of flash successful.\n", FS_PARTITION_NAME);}if(rt_device_find(FS_PARTITION_NAME) != RT_NULL){rt_kprintf("find device\r\n");//mount in the first timeif(dfs_mount(FS_PARTITION_NAME, mymountpoint, "elm", 0, 0) != RT_EOK){//not find file system then init fike system and formatingdfs_mkfs("elm", FS_PARTITION_NAME);//try again to mountif(dfs_mount(FS_PARTITION_NAME, mymountpoint, "elm", 0, 0) == RT_EOK){rt_kprintf(" elm filesystem mount to '%s'\n",mymountpoint);}else{rt_kprintf("elm filesystem mount to '%s' failed!\n",mymountpoint);}}// last exist fat file system ,ignore 'dfs_mkfs'else{rt_kprintf(" elm filesystem mount to '%s'\n",mymountpoint);}}else{rt_kprintf("find filesystem portion failed\r\n");}return RT_EOK;
}
INIT_APP_EXPORT(MountFAT);
总结
ARTPI是极好的开发板,M7的处理器,大容量的FLASH,有基于RT-Thread完善的软件包和组件,有BSP,极大能够让人快速面向bsp进行开发.实现了上层应用与底层的解耦.
相关文章:

[RT-Thread]基于ARTPI的文件系统认识与搭建
[写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,故以此作文] 目录 [写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,故以此作文] 前提 内容 认识 基于ARTPI的文件系统的挂载 ROMFS与LFS. (默认自动挂载,romfs可读不可写) 搭…...
动态规划+二分查找
题目描述:给定一个区间数组,[[1,2,3],[3,4,2],[2,4,4]],每个区间有价值,求在获取k个区间的条件下面,求获得的最大的价值,关键是dp的定义和二分查找的写法(小于tar额最右下标) import…...
8.2小非农ADP数据来袭黄金将会如何表现?
近期有哪些消息面影响黄金走势?黄金多空该如何研判? 黄金消息面解析: 周二(8月1日)现货黄金价格回落,原因是美元指数升创7月10日以来新高至102.43.美联储官员乐观言论夯实美国经济软着陆预期。此外,中国刺激措施将…...
linux启动oracle
一、启动方法 方法1: Sql代码 cd $ORACLE_HOME/bin #进入到oracle的安装目录 ./dbstart #重启服务器 ./lsnrctl start #重启监听器 ----------------------------------- 方法2: (1) 以oracle身份登录数据库&am…...

AssetBundleBrowser导入报错解决方案
第一次导入AssetBundleBrowser遇到报错有 Assets\Scenes\AssetBundles-Browser-master\AssetBundles-Browser-master\Tests\Editor\ABModelTests.cs(13,7): error CS0246: The type or namespace name Boo could not be found (are you missing a using directive or an assem…...

vue-baidu-map-3x 使用记录
在 Vue3 TypeScript 项目中,为了采用 标签组件 的方式,使用百度地图组件,冲浪发现了一个开源库 ovo,很方便!喜欢的朋友记得帮 原作者 点下 star ~ vue-baidu-map-3xbaidu-map的vue3/vue2版本(支持v2.0、v…...

《GPU并行计算与CUDA编程》笔记
第一个GPU程序 #include <stdio.h>__global__ void square(float* d_out,float* d_in){int idx threadIdx.x;float f d_in[idx];d_out[idx] f * f; }int main(int argc,char** argv){const int ARRAY_SIZE 8;const int ARRAY_BYTES ARRAY_SIZE * sizeof(float);// …...
Shell编程基础(十二)函数
函数 概念定义调用函数综合脚本 概念 和其他编程语言一样,函数作为一种封装代码块,以提高代码复用性和可维护性的存在。 记住一点,先定义,再使用 定义 shell 函数的创建方式 function 函数名 空格{ xxxx return 返回码&#x…...

【雕爷学编程】MicroPython动手做(33)——物联网之天气预报3
天气(自然现象) 是指某一个地区距离地表较近的大气层在短时间内的具体状态。而天气现象则是指发生在大气中的各种自然现象,即某瞬时内大气中各种气象要素(如气温、气压、湿度、风、云、雾、雨、闪、雪、霜、雷、雹、霾等ÿ…...

Screens 4 for mac VNC客户端 强大的远程控制工具
Screens 4 for Mac 是一款功能强大的 VNC 客户端软件,为 Mac 用户提供了便捷的远程访问和控制解决方案。无论您是需要远程管理服务器、办公电脑,还是需要远程协助他人解决问题,Screens 4 都是您的理想选择。 Screens 4 for Mac具备简洁直观的…...
搜索与图论(三)
一、最小生成树 1.1Prim算法 朴素版Prim 一般用于稠密图 算法流程: 集合表示当前已经在连通块的点 1.初始化距离,把所有距离都初始化为正无穷 2.n次迭代,找到集合外距离最小的点 ->t 3.用t来更新其它点到集合的距离 #include<iostream> #include&…...

阿里云“通义千问”开源,可免费商用
我是卢松松,点点上面的头像,欢迎关注我哦! 阿里云成为国内首个加入大模型开源行列的大型科技企业。就在昨天,阿里云公开表态,把自家的通义千问大模型开源。 阿里云把通用70亿参数模型,包括Qwen-7B和对话模…...
23.7.31 牛客暑期多校5部分题解
E - Red and Blue and Green 题目大意 构造一个长度为 n n n 的序列,满足 m m m 个条件,每个条件包含三个数 l , r , w l,\space r,\space w l, r, w,表示区间左端点,区间右端点,这个区间的逆序对数的奇偶性&…...

Python爬虫的学习day02 requests 模块post 函数, lmxl 模块的 etree 模块
1. requests 模块post 函数 1.1 post 函数的参数 (简单版) 参数1: url 网络地址 参数2: data 请求数据 (一般数据是 账号,密码) 参数3: headers 头请求 (…...

客户流失分析预测案例 -- 机器学习项目基础篇(7)
客户流失 它是指现有的客户、用户、订阅者或任何类型的回头客停止与公司开展业务或结束与公司的关系。 客户流失的类型 合同客户流失:当客户签订了服务合同并决定取消服务时,例如有线电视,SaaS。自愿流失:当用户自愿取消服务时…...
uniapp中我使用uni.navigateTo跳转webview页面传参,但是接收的参数只有一半。
在uniapp中使用uni.navigateTo跳转webview页面传参时,可能会遇到接收的参数只有一半的情况。这可能是因为在跳转时,url的长度超过了限制。为了解决这个问题,可以使用encodeURIComponent和decodeURIComponent进行编码和解码。 具体的解决办法…...
使用kaminari,在列表页实现分页功能
安装 1. bundller 大于1的话,可以使用这个版本 gem install kaminari -v 0.16.3 或者 gem kaminari 2. 使用命令: $ bundle install 3. 然后使用这个命令可以创建一个config文件 $ rails g kaminari:config 4. 重新启动服务器 bundle exec rail…...

Android 性能调优之bitmap的优化
背景 Android开发中,加载图片过多、过大很容易引起OutOfMemoryError异常,即我们常见的内存溢出。因为Android对单个应用施加内存限制,默认分配的内存只有几M(具体视不同系统而定)。而载入的图片如果是JPG之类的压缩格…...
HOT74-数组中的第K个最大元素
leetcode原题链接:数组中的第K个最大元素 题目描述 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O…...

类与对象【中】
欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析2 目录 👉🏻类的默认6个成员函数👉🏻构造…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...