(这个项目可能会在SuperUser或Electronics网站上发表主题,但这个问题的重点是用于完成它的可编程软件。)
我有一个嵌入式系统,可以产生大约100KB / s的数据,需要在Windows PC上存储和后续处理。串行流工作,但内部存储具有明显的优势,即不需要在收集数据的房间内存在笔记本电脑和电缆。
我的电路板有一个SD卡插槽(SPI连接),我以前曾尝试将文件写入FAT文件系统。但事实证明这是一个可怕的瓶颈,其中最重要的原因是,为了支持在任意时间增长的任意长度的多个文件,FAT中的文件访问需要读取和写入多层元数据 - 分配表本身和目录 - 除了实际内容,这些都不能完全适合微控制器RAM,因此卡访问次数被放大了。更糟糕的是,一些任务(例如找到新的空闲块)在卡片大小上具有线性复杂性。
对FAT的另一个打击是,如果没有先前的干净卸载,它很容易在断电的情况下发生数据损坏,并且我的系统没有任何可以启动卸载的用户界面。我知道包括电源故障中断和电容在内的技术可以使处理器和SD卡保持几毫秒的速度,但是由于这些技术无论如何都不能帮助我进行热移除,而且我现有的电路没有它们,我我试图实现仅限崩溃的存储设计。
所以我决定跳过文件系统,只使用卡作为块的原始序列。但是,我不希望我的用户被邀请重新格式化包含数据的卡
因此,我想对卡片进行分区,并在前面放置一个小的FAT分区,操作系统将识别该分区,并附带解释性测试文件。用户需要能够更换卡,因此我需要在PC应用程序中自动执行分区和格式化过程。
可以通过调用CreateFile("\\\\.\\PhysicalDisk3")
和类似路径来实现原始访问,这可以在可移动磁盘上完成,而无需管理员权限。不过,这是代码,我宁愿不必写自己。在改变之后,操作系统仍然必须被告知重新扫描卷。
是否有内置于Windows的API或第三方开源框架的一部分用于分区SD卡而无需直接按位访问分区表?如果没有,在更改分区后,如何更新Windows重新扫描卷?我更喜欢在XP和更新版本上运行的方法。
答案 0 :(得分:1)
您的问题似乎与我目前在我们自己的一个项目中解决的问题几乎完全相同。
我建议将fat32文件系统保持不变 但随后您将创建一个或多个大容器文件,包含连续块或预先缓存的分配表。
这甚至可以通过嵌入式系统本身完成 elm-chan's FatFs
然后,您可以访问容器本机内的所有块,而无需进一步访问胖,但该卡可以由任何操作系统处理,甚至普通用户也可以复制文件。
用于分配连续容器的Smaple函数:
Allocate a contiguous area to the file
然后,您可以在没有文件系统库的情况下访问这些块,仅用于第一次访问容器以确定它的启动位置。
答案 1 :(得分:0)
看起来Windows使用IOCTL机制进行分区管理。特别是,IOCTL_DISK_SET_DRIVE_LAYOUT_EX
control code看起来非常有用。
我会进一步调查,然后更新这个答案。