DFS 是 RT-Thread 提供的虚拟文件系统组件,全称为 Device FileSystem,即设备虚拟文件系统。文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型(Abstract data type),是一种用于向用户提供底层数据访问的机制。文件系统通常存储的基本单位是文件,即数据是按照一个个文件的方式进行组织。当文件比较多时,将导致文件繁多,不易分类、重名的问题。而文件夹作为一个容纳多个文件的容器而存在。 rtthreadDFS组件特点: 为应用程序提供统一的 POSIX 文件和目录操作接口:read、write、poll/select等。 支持多种类型的文件系统,如 FatFS、RomFS、DevFS 等,并提供普通文件、设备文件、网络文件描述符的管理。 支持多种类型的存储设备,如 SD Card、SPI Flash、Nand Flash 等。 本章实验用W25Q16作为存储设备 DFS文件系统结构框架:
5 Y2 I) S9 J1 i7 p( j# w4 z
1 [: u7 q; K5 D" w, W6 ]" Z
使用辅助开发工具移植DFS组件$ R6 k$ h& P% X8 x1 l6 F& q4 Y& Z' R
1、 使能文件系统
6 Z5 x! r2 e: P. H0 g: t
- _/ S- ?4 t5 n$ H
2、设置elm-chan's FatFs, Generic FATFilesystem Module 选项中修改关于长文件名支持的选项,否则在后面使用文件系统的过程中,创建的文件或者文件夹的名称不能超过 8 个字符。修改方式如下图所示: 3、设置长文件名支持 4、因为要使用一些 C 库函数,所以需要打开 libc 功能: 5、在 RT-Thread Components → Device Drivers 界面中选中 Using SPI Bus/Device device drivers 以及 Using Serial Flash Universal Driver 选项,如下图所示: 6、(38)SPI NOR flash ce pin index ,是SPI的CS管脚,第38个管脚 7、在RT-ThreadKernel路径,将内核时间片设置到1000 8、保存配置,scons --target=mdk5,生成工程。编译无错误后,下载程序。可以看到系统启动成功,但是flash没有读取成功,原因软件配置生成的代码SPI2的管脚与开发板的SPI2复用的管脚不同。如下图所示: 9、修改如下: 10、重新编译,下载。Flash读取成功 11、通过 list_device指令,查看当前系统中的设备 12、可以使用 sf prode norspi命令对该设备做 benchmark 测试。如下图 13、通过mkfs –t mle flash0指令,挂载文件系统 14、可以通过ls 指令,可以查询当前文件系统下面的文件;通过cd 可以跳转目录;通过cp可以拷贝数据;通过cat可以某个文件内容;rm删除特定文件;mkdir创建文件夹;mv移动文件 15、通过cd 指令跳转目录 16、通过cat 指令查看文件内容 0 u! L- N' m3 T% Y
17、经过以上步骤,DFS就移植完成 18、程序示例 - 1 C# m- _8 Q1 O& u
# ]2 I$ x' T' z* r& k* f3 J- //文件系统示例3 A: O x! w( V0 [1 A7 N- u6 p2 @
- void FileSystem_examples(){
& F! @; O) z. g -
# n; |3 S5 Q; T4 @9 v0 i - char s[] = "RT-Thread Programmer!", buffer[80];9 r7 D# a% y1 w- a' O5 I# a m
- rt_device_t dev;3 Z0 b, Q+ G; Q
- int ret;0 V4 |5 W. o4 q6 H
- int fd, size;
7 l U* C6 `# x - while(1)3 G- X# ]+ F% \- m5 s5 O$ w$ x3 z( Q
- {
5 ~% [1 K; e3 A/ q3 V z' t/ S - dev = rt_device_find("flash0");//查找设备
6 |0 A9 i: f* m - if (dev != RT_NULL)1 [3 S4 T: V5 K1 V* i+ x0 s
- {* ], a- O& u) J6 k" O8 K
- //挂载文件系统6 ?6 A! s1 D( {; z5 u! K
- if(dfs_mount("flash0", "/", "elm", 0, 0) == 0)1 |( o# q" B9 |6 f: ~7 @
- {
* ^' N$ I) E, @' F$ `" _ - rt_kprintf("spiflash mount to /spi !\n");
2 L$ M4 a; {+ g* R! b - * L0 j- z/ s/ t' N
- ret = mkdir("/test", 0x777);//创建在根目录test文件夹/ ]% U1 Z6 |9 G% L' V
- + D7 `8 S; w+ r& [4 A/ y) E& o
- //写模式打开文件,如果文件不存在则创建text.txt文件" Z. F4 V. u8 Q1 J n' M" W
- fd = open("/test/text.txt", O_WRONLY | O_CREAT);/ r6 l0 y2 F9 J
- if (fd >= 0)
6 J# j8 s3 L+ ^: s. Q s4 J - {2 ^, w2 k5 ~& v9 J2 U. `! a
- write(fd, s, sizeof(s));- Q: z8 k' T( b7 p: t: A
- close(fd);
. @0 l% _' |7 q; x/ w* i( q6 C4 t - rt_kprintf("Write done.\n");
3 i6 A8 M6 r$ A; C# F - }; D* i# w4 J9 W% |& w/ k+ E% F* M
! q9 s0 a# ?2 \) T- //读模式打开test件
3 m$ q n! e" g$ Q( C7 N5 q2 n - fd = open("/test/text.txt", O_RDONLY);
4 h0 r) G" D; K* ~% Y' {/ |/ | - if (fd >= 0)
}2 E$ ^ I. c3 q) C+ [6 C0 G - {
" w( T, p) `, q* Y- R' A - read(fd, buffer, sizeof(buffer));" f! V {% X$ [% F' L
- close(fd);
) U9 _) x6 f) [) W: R7 b, Y - rt_kprintf("Read file test.txt : %s \n", buffer);
0 W: ~% h8 G1 B1 z; }" _8 N7 y4 E - : c5 d3 R& v9 d3 u- h
- break;1 l, [1 b( V' P0 r! t+ h
- }1 U9 L- C$ d6 a G. q# c) A$ @
-
g( ^: E' Z( S' e6 \4 m - ) `9 a# R5 ]3 g3 S) ~5 b# {
- }
& i n+ N r( X6 b/ v$ c/ r - - C# P! U& n- T7 M
- else
- |8 f; K, ]! f( x$ U - rt_kprintf("spiflash mount to /spi failed!\n");
$ T0 l2 P# F3 g' l - break;" O9 w5 {" X8 E% n) ?- ^2 {
) A4 d* `3 C- r6 t-
$ G/ x) f. a( H6 e. \0 ~. X2 p$ J - }' X3 B5 c- d9 f# \! V. u& D
- }
n5 b6 d$ a5 U; @, _0 d% ]( x - }
复制代码 _2 I* u0 H% y: s8 L
源码参考:https://www.stmcu.org.cn/module/forum/thread-621278-1-1.html里面的资料
% [( l6 _' R! y. q+ a. R2 u) L" u* {1 g- H5 G, ~4 L/ l
3 |5 `6 R0 z4 f1 {
|