当前位置: 首页 > news >正文

[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这些函数进行操作处理。

文件系统的初始化过程一般分为以下几个步骤:

  1. 初始化 DFS 组件。
  2. 初始化具体类型的文件系统。
  3. 在存储器上创建块设备。
  4. 格式化块设备。
  5. 挂载块设备到 DFS 目录中。
  6. 当文件系统不再使用,可以将它卸载。

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

  1.  通过MTD框架创建mtd nor flash设备,然后在该设备上挂载LFS文件系统。正如上面一样,使用mtd框架创建mtd nor flash设备,好处是再一次进行抽象,不用自己去实现norflash的操作接口.
  2. .直接与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编程基础(十二)函数

函数 概念定义调用函数综合脚本 概念 和其他编程语言一样&#xff0c;函数作为一种封装代码块&#xff0c;以提高代码复用性和可维护性的存在。 记住一点&#xff0c;先定义&#xff0c;再使用 定义 shell 函数的创建方式 function 函数名 空格{ xxxx return 返回码&#x…...

【雕爷学编程】MicroPython动手做(33)——物联网之天气预报3

天气&#xff08;自然现象&#xff09; 是指某一个地区距离地表较近的大气层在短时间内的具体状态。而天气现象则是指发生在大气中的各种自然现象&#xff0c;即某瞬时内大气中各种气象要素&#xff08;如气温、气压、湿度、风、云、雾、雨、闪、雪、霜、雷、雹、霾等&#xff…...

Screens 4 for mac VNC客户端 强大的远程控制工具

Screens 4 for Mac 是一款功能强大的 VNC 客户端软件&#xff0c;为 Mac 用户提供了便捷的远程访问和控制解决方案。无论您是需要远程管理服务器、办公电脑&#xff0c;还是需要远程协助他人解决问题&#xff0c;Screens 4 都是您的理想选择。 Screens 4 for Mac具备简洁直观的…...

搜索与图论(三)

一、最小生成树 1.1Prim算法 朴素版Prim 一般用于稠密图 算法流程: 集合表示当前已经在连通块的点 1.初始化距离&#xff0c;把所有距离都初始化为正无穷 2.n次迭代,找到集合外距离最小的点 ->t 3.用t来更新其它点到集合的距离 #include<iostream> #include&…...

阿里云“通义千问”开源,可免费商用

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 阿里云成为国内首个加入大模型开源行列的大型科技企业。就在昨天&#xff0c;阿里云公开表态&#xff0c;把自家的通义千问大模型开源。 阿里云把通用70亿参数模型&#xff0c;包括Qwen-7B和对话模…...

23.7.31 牛客暑期多校5部分题解

E - Red and Blue and Green 题目大意 构造一个长度为 n n n 的序列&#xff0c;满足 m m m 个条件&#xff0c;每个条件包含三个数 l , r , w l,\space r,\space w l, r, w&#xff0c;表示区间左端点&#xff0c;区间右端点&#xff0c;这个区间的逆序对数的奇偶性&…...

Python爬虫的学习day02 requests 模块post 函数, lmxl 模块的 etree 模块

1. requests 模块post 函数 1.1 post 函数的参数 &#xff08;简单版&#xff09; 参数1&#xff1a; url 网络地址 参数2&#xff1a; data 请求数据 &#xff08;一般数据是 账号&#xff0c;密码&#xff09; 参数3&#xff1a; headers 头请求 &#xff08…...

客户流失分析预测案例 -- 机器学习项目基础篇(7)

客户流失 它是指现有的客户、用户、订阅者或任何类型的回头客停止与公司开展业务或结束与公司的关系。 客户流失的类型 合同客户流失&#xff1a;当客户签订了服务合同并决定取消服务时&#xff0c;例如有线电视&#xff0c;SaaS。自愿流失&#xff1a;当用户自愿取消服务时…...

uniapp中我使用uni.navigateTo跳转webview页面传参,但是接收的参数只有一半。

在uniapp中使用uni.navigateTo跳转webview页面传参时&#xff0c;可能会遇到接收的参数只有一半的情况。这可能是因为在跳转时&#xff0c;url的长度超过了限制。为了解决这个问题&#xff0c;可以使用encodeURIComponent和decodeURIComponent进行编码和解码。 具体的解决办法…...

使用kaminari,在列表页实现分页功能

安装 1. bundller 大于1的话&#xff0c;可以使用这个版本 gem install kaminari -v 0.16.3 或者 gem kaminari 2. 使用命令&#xff1a; $ bundle install 3. 然后使用这个命令可以创建一个config文件 $ rails g kaminari:config 4. 重新启动服务器 bundle exec rail…...

Android 性能调优之bitmap的优化

背景 Android开发中&#xff0c;加载图片过多、过大很容易引起OutOfMemoryError异常&#xff0c;即我们常见的内存溢出。因为Android对单个应用施加内存限制&#xff0c;默认分配的内存只有几M&#xff08;具体视不同系统而定&#xff09;。而载入的图片如果是JPG之类的压缩格…...

HOT74-数组中的第K个最大元素

leetcode原题链接&#xff1a;数组中的第K个最大元素 题目描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O…...

类与对象【中】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析2 目录 &#x1f449;&#x1f3fb;类的默认6个成员函数&#x1f449;&#x1f3fb;构造…...

RISC-V开发板免费申请与实战指南:从环境搭建到项目移植

1. 项目概述&#xff1a;一次难得的RISC-V生态深度体验机会最近在开发者圈子里&#xff0c;一个消息引起了不小的讨论&#xff1a;可以免费申请到基于RISC-V架构的生态开发板。这对于我们这些常年和ARM、x86打交道的开发者来说&#xff0c;无疑是一个极具吸引力的“尝鲜”机会。…...

【AI概念设计黄金标准】:NASA前可视化总监揭秘——如何用Midjourney输出符合影视工业管线的分镜资产

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI概念设计黄金标准的工业级定义 在高可靠性AI系统开发中&#xff0c;“概念设计”并非抽象构思阶段&#xff0c;而是承载可验证性、可追溯性与可部署性的工程锚点。工业级定义要求该阶段输出必须满足…...

从芯片手册到PCB:手把手教你用TPS5430搞定24V转15V电源(附完整BOM清单)

从芯片手册到PCB&#xff1a;手把手教你用TPS5430搞定24V转15V电源&#xff08;附完整BOM清单&#xff09; 在硬件设计领域&#xff0c;电源模块的设计往往是最基础却也最考验工程师功底的环节。一个优秀的电源设计不仅需要满足电压转换的基本需求&#xff0c;还要兼顾效率、稳…...

Steam挂刀行情站:如何利用开源工具实现Steam饰品交易自动化监控

Steam挂刀行情站&#xff1a;如何利用开源工具实现Steam饰品交易自动化监控 【免费下载链接】SteamTradingSiteTracker Steam 挂刀行情站 —— 24小时更新的 BUFF & IGXE & C5 & UUYP & ECO 挂刀比例数据 | Track cheap Steam Community Market items on buff.…...

Upscayl终极指南:如何用免费AI工具让模糊图片变高清

Upscayl终极指南&#xff1a;如何用免费AI工具让模糊图片变高清 【免费下载链接】upscayl &#x1f199; Upscayl - #1 Free and Open Source AI Image Upscaler for Linux, MacOS and Windows. 项目地址: https://gitcode.com/GitHub_Trending/up/upscayl 你是否曾因照…...

CANN/asc-devkit ClearBias接口文档

ClearBias 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode.com/…...

从ChatGLM2到LLaMA2:大厂如何用GQA和MQA在推理速度与模型质量间做取舍?

大模型注意力机制实战&#xff1a;GQA与MQA如何重塑推理效率与生成质量的平衡 当ChatGLM2-6B在推理速度上展现出惊人优势时&#xff0c;技术团队发现其生成质量偶尔会出现波动&#xff1b;而LLaMA2虽然保持了稳定的输出品质&#xff0c;却在资源消耗上让不少企业望而却步。这背…...

【普中 51-Ai8051 开发攻略】-- 第 30 章 OLED 液晶显示实验-硬件 IIC

(1)实验平台&#xff1a; 普中 51-Ai8051 开发板​​https://item.taobao.com/item.htm?abbucket17&id1026052331067(2)资料下载 &#xff1a;普中科技-各型号产品资料下载链接 前面已经使用 IO 口软件模拟 IIC 时序与 OLED 通信实现字符汉字的显示。 本章学习使用 AI805…...

数据库云服务与Serverless

数据库云服务与Serverless 1. 技术分析 1.1 云数据库概述 云数据库是数据库服务的未来方向&#xff1a; 云数据库类型IaaS: 虚拟机部署PaaS: 托管服务Serverless: 无服务器云服务优势:弹性伸缩自动备份高可用性1.2 Serverless数据库 Serverless特点按需付费: 按使用量计费自动扩…...

别再死记FPN公式了!用PyTorch手把手带你画一遍特征金字塔的‘数据流图’

用PyTorch动态可视化FPN特征金字塔的数据流动 在目标检测领域&#xff0c;特征金字塔网络&#xff08;FPN&#xff09;已经成为处理多尺度目标的标配组件。但很多开发者虽然能背诵FPN的结构图&#xff0c;却对特征图在金字塔各层之间的流动变化缺乏直观感受。本文将带您用PyTor…...