问题标签 [fat]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1881 浏览

c# - 文件分配表读取

我正在开发一个自定义 FAT 文件系统资源管理器,并且进展顺利。但是,我想知道是否有更好的方法来有效地读取/写入链图。对于大型设备,这可能会占用大量资源,而且速度可能非常非常慢。尤其是分配空间的时候。

这是我的阅读方式:

该链有时可以达到数百兆字节。

这就是我写它的方式。当对chainMap uint数组的分配和修改完成后,它基本上会循环遍历该uint数组并重写整个chainmap。

我一直在研究缓存系统,但我想对如何让它变得更好有更多的想法。

0 投票
2 回答
4698 浏览

filesystems - 如何使用 SD 卡以 48 ksamples/s 记录 16 位数据?

背景

我的开发板在SPI上集成了一个带有SD/MMC 卡的STM32微控制器,并以 48 ksamples/s 的速度对模拟数据进行采样。我正在使用 Keil 实时库 RTX 内核和ELM FatFs

我有一个高优先级任务,通过 DMA 以 40 个样本(40 x 16 位)的块捕获模拟数据;数据通过长度为 128 的队列(构成大约 107 毫秒的样本缓冲)传递到第二个低优先级任务,该任务将样本块整理到 2560 字节缓冲区(这是 512 字节 SD 扇区大小和40 个样本块大小)。当此缓冲区已满(32 个块或大约 27 毫秒)时,数据将写入文件系统。

观察

通过检测代码,我可以看到每 32 个块写入数据,并且写入大约需要 6 毫秒。这一直持续到(在 FAT16 上)文件大小达到 1 MB,此时写入操作需要 440 毫秒,此时队列已填满并且日志记录被中止。如果我将卡格式化为FAT32,则“长写”事件之前的文件大小为 4 MB。

发生这种情况的文件大小在 FAT16 和 FAT32 之间发生变化的事实向我表明,这不是卡的限制,而是文件系统在 1 MB 或 4 MB 边界处执行的操作需要额外的时间。

我的任务似乎也被及时安排了,ELM FatFs代码在 1 MB(或 4 对于 FAT32)边界处消耗了时间。

问题

有解释或解决方案吗?是 FAT 问题,还是特定于 ELM 的 FatFs 代码?

我考虑过使用多个文件,但根据我的经验,FAT 不能很好地处理单个目录中的大量文件,这也会失败。完全不使用文件系统并写入原始卡是可能的,但理想情况下,我想在具有标准驱动程序且没有特殊软件的 PC 上读取数据。

我想到尝试编译器优化来缩短写入时间;这似乎有效果,但写入时间似乎更加多变。在 -O2 处,我确实得到了一个 8 MB 的文件,但结果不一致。我现在不确定文件大小与失败点之间是否存在直接关联;我已经看到它在没有特定边界的各种文件长度上以这种方式失败。可能是显卡性能问题。

我进一步检测了代码并应用了分而治之的方法。这一观察结果可能会使这个问题过时,并且所有先前的观察结果都是错误的或转移注意力的。

我最终将其缩小到一个多扇区写入 (CMD25) 的实例,其中卡的“等待就绪”轮询偶尔需要 174 毫秒,用于 5 个块中的前三个扇区。等待就绪的超时设置为500 毫秒,所以它会很乐意忙等待那么久。在一般情况下,迭代地使用 CMD24(单扇区写入)慢得多——每个扇区 140 毫秒——而不是偶尔。

所以这毕竟是卡的一种行为。我将努力尝试一系列 SD 和 MMC 卡。

0 投票
0 回答
405 浏览

backup - 如何执行 FAT 文件系统的增量 tar 备份

tar --listed-incremental=...过去常常在我的计算机上执行增量备份,并且在大多数情况下,它就像一个魅力。但是,它似乎不适用于我的旧 FAT 分区。它认为所有文件都已更改并备份所有内容。我在某处读到 tar 增量备份依赖于 inode,这就是为什么它不适用于 FAT。有没有办法伪造它,或者强制它只使用名称和修改日期而不是 inode?

0 投票
5 回答
1908 浏览

c - FAT 文件系统和大量写入

我正在考虑将 FAT 文件系统用于嵌入式数据记录应用程序。记录器只会创建一个文件,每分钟不断地向该文件附加 40 字节的数据。经过几年的使用,这将超过一百万个写入周期。我的问题是:FAT 系统是否会在每次附加文件时更改文件分配表?它如何跟踪文件末尾的位置?它只是在末尾放置一个 EndOfFile 标记还是将长度存储在 FAT 表中?如果它确实在我每次写入时都会更改 FAT 表,那么我会在短短几年内将 FLASH 存储器耗尽。FAT 系统是否适合用于此应用程序?

我的另一个想法是,我可以将原始数据字节存储在存储卡中,并在每次写入时在数据末尾放置一个 EndOfFile 标记。虽然这不太理想,因为这意味着从记录器中获取数据的唯一方法是通过串行传输,而不是通过 PC 和读卡器。

0 投票
3 回答
30662 浏览

filesystems - FAT32 格式存储上的文件系统链接

我知道 FAT32 以及 FAT16/12 既不支持符号链接也不支持硬链接。但是我想出了这个主意:

FAT 规范描述了每个文件都与一个目录条目相关联。据我了解,可以说目录中的文件条目以某种方式或其他方式指向文件的内容。

那么,如何定义两个指向相同文件内容的目录条目?或者,什么可以阻止我这样做?

用例:我的车载收音机有一个 USB 大容量存储设备,我想使用目录作为播放列表,因为收音机软件不支持播放列表。因此,对我而言,Windows 在执行此操作时的行为并不重要。

0 投票
1 回答
1047 浏览

c - 使用 ARM 进行 C 编程 - 结构到文件的输出和输入

我正在编写的程序中的结构有点问题。背景; 我正在 ARMv7 芯片上用 C 语言开发代码。该系统有一个带有 FAT16 文件系统的 SD 卡,用于文件访问。我正在使用一个用于 FAT16 文件读写操作的库来处理文件输出/输入的任何工作。目前我在主函数之前全局声明一个结构;

指针用于字符串。例如,我使用 &config.name 将数据读入这些变量。我必须使用我编写的函数将通过串行端口接收的字符读入另一个指向 strcat 到另一个的字符指针,但这可以正常工作,并且我已经验证了用户输入的详细信息与记录的输入相匹配(有一个快速如果有人想知道,终端窗口上的提示屏幕会提示详细信息)。

然后我实现提供的库函数以将结构保存到文件中;

其中 CONF_FILE 只是要使用的文件的文件句柄,&config 是输出缓冲区,READBUFSIZE 是缓冲区的大小(定义为 148,对我的目的来说足够大,但后来我希望更改它以计算结构的大小输出,然后计算文件大小以便能够正确读取它)。我已经添加了库提供的函数定义以及最后的开场白,以供参考,以防我不清楚。

这完美地工作,文件中的输出是;Name1.1 192.168.1.1 有很多空格。显然,我输入 Name 作为名称,1.1 作为固件,IP 是不言自明的。

我天真地以为我可以反过来将它读回我用这个声明的 loadconfig 结构;

显然,这没有希望工作,因为结构没有任何预定义的大小来知道要读回多少。

那么,我怎样才能将我保存的数据读回到它来自的同一个结构中呢?这个名字可以是任何大小,不是很大,但不能安全地预测。FW 版本永远只会是#.#,并且 IP 显然在已经定义的限制内。

感谢您在正确方向上的任何提示或轻推。请询问您是否需要更多信息来了解范围。

以供参考;

0 投票
1 回答
1823 浏览

assembly - 如何用汇编语言读取 FAT 表

NC - Norton Commander 我应该编写一个类似 NC 的程序。我需要在程序集中访问 Fat Table 以显示程序中的文件和目录。有谁知道我如何在汇编中访问 Fat(软盘和硬盘)我应该使用什么中断?

提前致谢。

0 投票
3 回答
666 浏览

assembly - FAT 如何让我知道通过文件的第一个簇加载下一个簇提示什么?

我正在阅读brokenthorn 的操作系统开发教程

http://www.brokenthorn.com/Resources/OSDev6.html

我坚持了好几天。

加载“stage2.sys”,

搜索根目录“stage2 sys”。

根目录包含文件名和起始集群地址。(即0x002)

加载第 0x002 个簇并查找 FAT 以了解下一个要加载的簇。

FAT由12位数组和

数组大小为 4077

现在,我不知道如何 FAT 让我知道文件的第一个簇加载下一个提示的内容。

问题是这样的。

  1. 有什么遗漏或错误的地方吗?

  2. FAT 如何让我知道通过文件的第一个簇加载下一个簇提示什么?

FAT 仅由 12 位数组组成.. 怎么样?

谢谢。

0 投票
1 回答
5779 浏览

sd-card - SDHC卡SPI初始化

我正在开发一个目前只支持 SDSC v1 卡的嵌入式系统。由于越来越难找到小于 2 GB 的卡,我正在尝试添加对 SDHC 卡的支持。与卡的通信是通过 SPI 总线完成的。

所以这是我初始化卡的方法:

  • 发送 CMD0。卡返回 0x1
  • 发送 CMD8 + 0x1AA。卡返回 0x1 和 0x1AA
  • 发送 ACMD41。卡返回 0x0。

之后,我阅读了MBR并发现在 0x30 LBA处有一个 FAT16 分区。但是,从该地址 (0x30*512) 读取扇区会返回重复的 0x01 0x09...

  • 发送 ACMD41 时,我发送命令 id 0x69。这是对的吗?还是我应该发送 CMD55 然后发送 CMD1?
  • 1显示我需要在发送 ACMD41 后发送 CMD58 和可能的 CMD16。有必要吗?我能够在不执行它们的情况下读取有效的 MBR。

1. http://elm-chan.org/docs/mmc/mmc_e.html

0 投票
6 回答
4074 浏览

macos - OSX Snow Leopard:为 32 位和 64 位构建 boost 1.47.0

我快疯了...我目前正在尝试在 osx snow leopard 上将我的项目的 boost 从 1.44.0 升级到 1.47.0。-我想使用以下命令构建它:

我希望它给我一个支持 i386 和 x86_64 的静态胖版本。无论如何,它显然不是,因为如果我查询lipo -info生成的库,它们都是 x86_64。- 我能做些什么来解决这个问题?会不会是构建脚本坏了?