当前位置: 首页 > 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进行开发.实现了上层应用与底层的解耦.

http://www.lryc.cn/news/110734.html

相关文章:

  • 动态规划+二分查找
  • 8.2小非农ADP数据来袭黄金将会如何表现?
  • linux启动oracle
  • AssetBundleBrowser导入报错解决方案
  • vue-baidu-map-3x 使用记录
  • 《GPU并行计算与CUDA编程》笔记
  • Shell编程基础(十二)函数
  • 【雕爷学编程】MicroPython动手做(33)——物联网之天气预报3
  • Screens 4 for mac VNC客户端 强大的远程控制工具
  • 搜索与图论(三)
  • 阿里云“通义千问”开源,可免费商用
  • 23.7.31 牛客暑期多校5部分题解
  • Python爬虫的学习day02 requests 模块post 函数, lmxl 模块的 etree 模块
  • 客户流失分析预测案例 -- 机器学习项目基础篇(7)
  • uniapp中我使用uni.navigateTo跳转webview页面传参,但是接收的参数只有一半。
  • 使用kaminari,在列表页实现分页功能
  • Android 性能调优之bitmap的优化
  • HOT74-数组中的第K个最大元素
  • 类与对象【中】
  • uni-app:实现列表单选功能
  • vue中axios二次封装并发起网络请求配置
  • 开源全文搜索引擎汇总
  • gitlab CI/CD 安装 gitlab runner
  • 服务器中了malox勒索病毒后怎么办怎么解决,malox勒索病毒解密数据恢复
  • Python小白学习:超级详细的字典介绍(字典的定义、存储、修改、遍历元素和嵌套)
  • word转pdf两种方式(免费+收费)
  • 基于图像形态学处理的目标几何形状检测算法matlab仿真
  • python系列教程211——map
  • SW - 3D打印件最好带上浮雕文字标记
  • Kafka-副本数量设置