首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模仿FatFS?

如何模仿FatFS?
EN

Stack Overflow用户
提问于 2019-09-30 01:21:27
回答 1查看 1.2K关注 0票数 2

我想在一个微控制器(STM32L4xx)上显示一些数据,就像它是安装在USB上的文件系统上的一个文件一样,安装到主机PC上。我有一些函数,可以在(模拟的)文件中任何请求的偏移量处生成数据。该文件只能读取,没有写入它的理由;它可以有固定的名称和大小。

这与陈氏FatFS和类似库的使用情况正好相反:我没有真正的文件系统,我也不想访问文件系统,我只想做任何必要的事情来向USB主机展示一个模拟(伪造)文件系统(带有一个文件)。

我认为,作为大规模存储设备(如Mbed)出现的引导加载程序必须执行类似的操作,因为当您将十六进制文件拖放到看起来像Mbed存储设备的文件系统上时,程序数据(可能)不会写入真正的文件系统;我设想它存储在某个地方,但不像可见的文件系统那样存储在实际的文件系统中。

有人能向我指出一些类似的示例代码吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-30 14:49:58

因为只有一个固定长度的文件,所以您不必过多地使用文件系统结构,而是在PC上创建一次,并将其视为一个固定的头。该设备根本不需要FatFS代码。否则,空FAT文件系统上的文件将从第一个空闲扇区开始连续存储。

首先,让我们创建一个最小的FAT文件系统映像,例如在linux上使用工具包。

代码语言:javascript
复制
mformat -v "EMBEDDED FS" -t 1 -h 1 -s 5 -S 2 -C -i fs.img -c 1 -r 1 -L 1

这将创建一个一边、一个轨道和五个512字节长扇区的磁盘映像。前四个扇区是引导扇区,两个FAT,和根目录,第五个扇区可以容纳一个512字节长的文件。

代码语言:javascript
复制
$ mdir -i fs.img 
 Volume in drive : is EMBEDDED FS
 Volume Serial Number is 061F-DA50
Directory for ::/

No files
                                512 bytes free

如果您需要更多的空间,请增加扇区的数量。

更新

我发现我的mformat很难创建更大的文件系统(或者我找不到正确的参数)。还有一个名为mkdosfs的实用程序,它对我工作得更好。

代码语言:javascript
复制
/sbin/mkdosfs -f 1 -n "EMBEDDED FS" -r 16 -s 64 -S 512 -v -C big.img 524256

创建一个512 MB的文件系统。

代码语言:javascript
复制
$ mdir -i big.img
 Volume in drive : is EMBEDDED FS
 Volume Serial Number is 5457-0DF4
Directory for ::/

No files
                        536 739 840 bytes free

一个更大的文件系统当然会包含更多的开销,但是您会发现,大多数文件只是一个运行号(FAT中的集群链),只要映像只包含一个大文件,就可以动态生成它。

现在创建一个具有所需长度的文件,并将其复制到图像中。

代码语言:javascript
复制
echo 'hello world' > testfile.txt
mcopy -i fs.img testfile.txt ::/

并使用hd转储结果(*表示重复前面的行)

代码语言:javascript
复制
$ hd fs.img
00000000  eb 3c 90 4d 54 4f 4f 34  30 31 38 00 02 01 01 00  |.<.MTOO4018.....|
00000010  02 10 00 05 00 f0 01 00  05 00 01 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 29 65  83 db 06 45 4d 42 45 44  |......)e...EMBED|
00000030  44 45 44 20 46 53 46 41  54 31 32 20 20 20 fa 31  |DED FSFAT12   .1|
00000040  c0 8e d8 8e c0 fc b9 00  01 be 00 7c bf 00 80 f3  |...........|....|
00000050  a5 ea 56 00 00 08 b8 01  02 bb 00 7c ba 80 00 b9  |..V........|....|
00000060  01 00 cd 13 72 05 ea 00  7c 00 00 cd 19 00 00 00  |....r...|.......|
00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 80 00  |................|
000001c0  01 00 01 00 05 00 00 00  00 00 05 00 00 00 00 00  |................|
000001d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200  f0 ff ff ff 0f 00 00 00  00 00 00 00 00 00 00 00  |................|
00000210  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000400  f0 ff ff ff 0f 00 00 00  00 00 00 00 00 00 00 00  |................|
00000410  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000600  45 4d 42 45 44 44 45 44  20 46 53 08 00 00 33 80  |EMBEDDED FS...3.|
00000610  3e 4f 3e 4f 00 00 33 80  3e 4f 00 00 00 00 00 00  |>O>O..3.>O......|
00000620  54 45 53 54 46 49 4c 45  54 58 54 20 18 00 a7 80  |TESTFILETXT ....|
00000630  3e 4f 3e 4f 00 00 a7 80  3e 4f 02 00 0c 00 00 00  |>O>O....>O......|
00000640  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000800  68 65 6c 6c 6f 20 77 6f  72 6c 64 0a 00 00 00 00  |hello world.....|
00000810  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000a00

正如预期的那样,文件内容从偏移量0x0800开始存储,就在四个保留扇区之后。现在可以获取映像的第一个2048字节,并将其放入程序中以初始化虚拟磁盘映像。

对于USB设备代码,您可以从STM32CubeL4中的STM32CubeL4演示开始,它将STM32转换为SD读卡器。扔掉与SD卡相关的代码,只为前四个扇区提供固定的图像数据,为其余的扇区提供文件数据。

我自己还没有试过,所以一些操作系统可能会阻塞这个小磁盘映像,在这种情况下,尝试用mformat创建一个标准的软盘映像。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58160492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档