|
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 C( `6 r( w9 w4 i+ m! O
/ o7 O& x9 B: ?$ W1 s) m使用辅助开发工具移植DFS组件* M& U4 q. q q9 R1 [
1、 使能文件系统) F( u% y+ ` R9 b% v
8 ^# v6 T0 ]4 p2、设置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 指令查看文件内容
. A7 j) b6 p* j7 R3 {4 a2 n4 n' S17、经过以上步骤,DFS就移植完成 18、程序示例
! \, b+ o0 k3 w) d2 N
! M8 H5 M" q1 N1 U, s" Z+ g- //文件系统示例# g3 N0 \4 h% W
- void FileSystem_examples(){
& q: v0 z* M9 K0 r. G5 I3 l% ?8 \ - ( @0 h2 g+ ]8 r+ g# @' a
- char s[] = "RT-Thread Programmer!", buffer[80];1 _7 Y, \; {! }3 e) m( t9 K
- rt_device_t dev;! g% W4 W3 E+ M0 U$ x% d5 h
- int ret;
9 R, R9 {( Y# ~) V8 v/ o- x - int fd, size;
. F8 R% r/ m7 e p7 {, M - while(1)8 N5 ?% T! w, b, p
- {
- }$ s' I4 b$ O# V+ C" K1 p' n - dev = rt_device_find("flash0");//查找设备
1 m" Q# j$ J7 O( y - if (dev != RT_NULL)
6 |! m. H' m3 f+ U5 \6 u3 G - {
% ?& C8 i1 l; {$ Y! [ - //挂载文件系统
" f+ \0 V& r3 g3 g - if(dfs_mount("flash0", "/", "elm", 0, 0) == 0)" g. @6 l( y, D$ D' B8 a
- {
& V( U9 N# b7 i7 }9 @ - rt_kprintf("spiflash mount to /spi !\n");
6 C4 \% g' W5 o1 R
* |& J& n. F4 N- ret = mkdir("/test", 0x777);//创建在根目录test文件夹 [- w( D5 n& [. F( H8 y8 L' T' z$ Y2 g
-
4 E0 W! Y; ^1 J' ?- c - //写模式打开文件,如果文件不存在则创建text.txt文件+ j1 H0 k1 z3 \7 ?5 {3 _
- fd = open("/test/text.txt", O_WRONLY | O_CREAT);
% `" V, W- H* x - if (fd >= 0)
6 t" X5 ^5 G" W) o3 ~- o - {
S' M* B( D) q2 z" D9 b - write(fd, s, sizeof(s));
. O! \ E$ v+ k3 A& M8 n7 n+ S% { - close(fd);' j$ |3 s X3 Y* s3 l9 A
- rt_kprintf("Write done.\n");
& U, `2 R7 v" P; M- N5 q - }
* o% ?: P. `2 {. ^' L/ |! t3 M - 8 w) C/ B6 E6 [' y# Q; T( L
- //读模式打开test件
! P1 F2 l e% x' C - fd = open("/test/text.txt", O_RDONLY);
! q0 |5 o6 D3 g+ \6 Y% K - if (fd >= 0)
) i2 O$ A/ q- i! `$ p - {$ I( J( J& \+ D1 d" E
- read(fd, buffer, sizeof(buffer));) J6 t/ u) ]: d+ z2 K! _. P# Q6 }
- close(fd);6 ]$ z' G8 b1 f9 W! Q
- rt_kprintf("Read file test.txt : %s \n", buffer); e: T. n& E6 u; H/ k: D
- 1 ]1 R- Y h) ^% ^" C
- break;
* d1 ~3 k& s, c; ?( [ - }
2 \; n, z: v# M/ p" X6 @ k, F - ( L: P1 I) S( q0 x
- ! C# q: F% `5 p' ]( o( C5 P' h* V
- }" ~! [- r: |, D& L. _5 H# {
- 2 f6 A9 I4 l l# Q
- else
" R; _+ l9 q& x: `9 g - rt_kprintf("spiflash mount to /spi failed!\n");
) c7 n' k" I$ i d7 ~+ t0 I - break;- u3 V$ @; \ c: C8 A- ^+ ?
- 4 \) R0 a$ Q' }! B
- . ^1 U, Q& M* Y; ^1 F$ C2 a& e
- }
! g8 e( X' m, K9 C7 q - }- a/ @( m$ s+ f# Y9 [
- }
复制代码 ' I6 U' b2 |& q$ ^1 p3 m4 X: n2 {1 \
源码参考:https://www.stmcu.org.cn/module/forum/thread-621278-1-1.html里面的资料: z2 A) S2 `1 C9 E Q( F
2 g1 q0 Y2 c% Z( H
0 K5 H6 ~( D5 u5 l6 y5 p
|