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文件系统结构框架:
! y0 I! G6 k+ ~3 S7 Z% G5 r
0 ^9 y# e- r9 J/ c& I使用辅助开发工具移植DFS组件7 `0 V5 u1 `' a! @; ]7 N" |
1、 使能文件系统' V) s1 |1 n" L% r/ ^
/ j) }2 L' ~6 S3 @$ b# v: S8 L
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 指令查看文件内容
8 M4 i. S6 b8 P( [17、经过以上步骤,DFS就移植完成 18、程序示例
" N! u. K, `# B6 U6 p$ l% q' c z
! Y7 i8 X9 B _! i G2 i- //文件系统示例
! @$ I8 ^. j6 V) N# A" G - void FileSystem_examples(){ \$ q& c/ _! h, K2 K2 j0 a- m
- ( s6 `; ?( V- | v1 O8 |
- char s[] = "RT-Thread Programmer!", buffer[80];
* h0 N& I4 [8 e) a; d+ i6 P - rt_device_t dev;
+ \) m' P8 `! b - int ret;$ h/ R0 I4 p3 ^8 I/ _% |
- int fd, size;+ c2 c% I8 W, j& J4 L. {
- while(1)
9 G/ y% l6 f9 C - {
7 ^% i" N* z s; v S - dev = rt_device_find("flash0");//查找设备
$ Y% o- _' C- [- `5 R9 ^1 U- R6 ^0 y - if (dev != RT_NULL)
( _8 P3 u- h3 V+ L - {
W# H& B" j" X$ n - //挂载文件系统8 g: \/ p$ m3 G/ H, ^0 ~+ B
- if(dfs_mount("flash0", "/", "elm", 0, 0) == 0)
) T W- _% w8 Y - {& l# Z8 ^8 P& S4 N' m& D" {5 H
- rt_kprintf("spiflash mount to /spi !\n");1 l! I: w! G8 s# q2 e& o
- % w! o+ l$ H1 e9 W$ q9 M( g
- ret = mkdir("/test", 0x777);//创建在根目录test文件夹5 H: h; ~6 I2 `$ b; S. d
- ' B. n. D4 Q7 T0 q# K
- //写模式打开文件,如果文件不存在则创建text.txt文件
! g" D4 ~+ n; ~0 J5 g4 f - fd = open("/test/text.txt", O_WRONLY | O_CREAT);5 r# \& J4 q( r5 [; G
- if (fd >= 0)
" q R4 I* |/ F0 B7 n4 ? - {( ]8 Y4 Z( h w+ [% G
- write(fd, s, sizeof(s));
6 Y- J! G" k. A; y% L( o - close(fd);
- _. N" {7 c0 O: H: G4 d - rt_kprintf("Write done.\n");
/ m! D! @7 D) X8 c- w" |( m - }+ u. X* n) s3 H1 P
& I( ^; u9 O \8 Q$ @8 G- //读模式打开test件4 l* E. T+ x, S& T
- fd = open("/test/text.txt", O_RDONLY);
3 |7 @# m) a9 s6 R: @5 f+ X - if (fd >= 0)( P, U9 V/ }- p8 u; n
- {
; D* C6 b: w8 z" y( C) x - read(fd, buffer, sizeof(buffer));
* r ]/ V/ T0 w4 N) q( b - close(fd);& M' Z" S% X: }, `0 q
- rt_kprintf("Read file test.txt : %s \n", buffer);
7 t+ b: `# K- V, e5 h" h! b' { -
) ~+ O) ^* ^" l6 x2 F/ i - break; N8 A- I) f5 A( v
- }! s& X p8 P% C( J
-
+ r3 l. s: h/ Z5 X - + @4 l- g# C5 x4 n" b+ z
- }
1 A& h$ D ~9 D3 A* R - 4 g/ k+ z0 M: x; J
- else' g7 o) e! l8 ~4 D5 ]* W% D; C
- rt_kprintf("spiflash mount to /spi failed!\n");. d( A0 f" W8 k
- break;7 X$ e$ \* `7 F; I7 I( k
6 u/ \( p$ b0 x, l! L" }-
+ h; B' [* }1 y' L - }
, e: `1 H+ p" P4 J5 z/ E - }( z8 x( Q3 i+ u3 L
- }
复制代码
^7 K! \+ w8 Q W; [源码参考:https://www.stmcu.org.cn/module/forum/thread-621278-1-1.html里面的资料! ? ]4 `( a9 _2 M$ N$ s6 @
& K, c4 |1 g2 S* s, t d/ M% s9 S8 F. z
|