0

(这个项目可能会在 SuperUser 或 Electronics 网站上成为主题,但这个问题的重点是用于完成它的可编程软件。)

我有一个嵌入式系统,它以大约 100KB/s 的速度生成数据,这些数据需要存储并稍后在 Windows PC 上进行处理。串行流式传输有效,但内部存储具有明显的优势,即不需要在进行数据收集的房间内使用笔记本电脑和电缆。

我的电路板有一个 SD 卡插槽(SPI 连接),我之前曾尝试将文件写入 FAT 文件系统。但事实证明这是一个可怕的瓶颈,其中最重要的原因是,为了支持在任意时间增长的任意长度的多个文件,FAT 中的文件访问需要读取和写入多层元数据——分配表本身和目录——除了实际内容之外,这些不能完全适合微控制器 RAM,因此卡访问的数量被放大了。更糟糕的是,某些任务(例如寻找新的空闲块)在卡片大小上具有线性复杂性。

对 FAT 的另一个打击是,如果没有事先彻底卸载,它很容易在断电的情况下出现数据损坏,而且我的系统没有任何可以启动卸载的用户界面。我知道一些技术,包括断电中断和电容,可以让处理器和 SD 卡多运行几毫秒,但由于这些技术无论如何都无助于热移除,而且我现有的电路没有它们,我我试图实现一个只崩溃的存储设计。

所以我决定跳过文件系统,只使用卡作为原始块序列。但是,我不希望我的用户被邀请重新格式化包含数据的卡片

在此处输入图像描述

所以,我想对卡进行分区,并在前面放置一个操作系统可以识别的小 FAT 分区,并带有一个解释性测试文件。用户需要能够更换卡,因此我需要在我的 PC 应用程序中自动执行分区和格式化过程。

原始访问可以通过调用CreateFile("\\\\.\\PhysicalDisk3")和类似路径实现,这可以在可移动磁盘上完成,无需管理员权限。尽管如此,这是我不想自己编写的代码。并且仍然必须告知操作系统在更改后重新扫描卷。

是否有 API 内置于 Windows 或第三方开源框架的一部分,用于对 SD 卡进行分区,而无需直接按位访问分区表?如果没有,我应该如何在更改分区后让 Windows 重新扫描卷?我更喜欢适用于 XP 和更新版本的方法。

4

2 回答 2

1

您的问题似乎与我目前必须在我们自己的一个项目中解决的问题几乎完全相同。

我建议在卡上保持 fat32 文件系统不变。
但随后您创建一个或多个大容器文件,具有连续块或预缓存分配表。

这甚至可以通过嵌入式系统本身来完成。
elm-chan 的 FatFs

然后您可以访问容器本机内的所有块,而无需进一步访问 fat,但是该卡可以由任何操作系统处理,甚至普通用户也可以复制文件。

用于分配连续容器的Smaple函数:
为文件分配一个连续区域
然后您可以在没有文件系统库的情况下访问块,仅用于第一次访问容器以确定它从哪里开始。

于 2013-11-04T07:21:51.927 回答
0

看起来 Windows 使用 IOCTL 机制进行分区管理。特别是,IOCTL_DISK_SET_DRIVE_LAYOUT_EX控制代码看起来非常有用。

我将进一步调查,然后更新此答案。

于 2013-11-03T20:49:00.073 回答