2013-11-03 39 views
1

(该项目将可能在话题上的超级用户或电子网站,但这个问题的重点是完成它的可编程软件。)框架filesystemless SD卡分区之前

我有产生数据的嵌入式系统大约100KB/s,需要存储并在Windows PC上处理。串行流式传输工作,但内部存储具有明显的优势,即不需要在收集数据的房间中存在笔记本电脑和电缆。

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

对FAT的另一个打击是,它是在没有事先清洁卸载功率损耗的情况下,很容易出现数据损坏,我的系统没有任何用户界面可能启动卸载。我意识到包括电源故障中断和电容在内的技术可以使处理器和SD卡保持几毫秒的时间,但由于这些技术无论如何都不利于热拆卸,而且我现有的电路没有这些技术, m试图实现一个只有崩溃的存储设计。

所以我决定跳过文件系统,只需使用该卡进行与块的原始序列。不过,我不希望我的用户被邀请重新格式化包含数据

enter image description here

所以,我想分区的卡放在前面,其操作系统将认识到,小FAT分区卡及解释性测试文件。用户需要能够替换卡,所以我需要在我的PC应用程序中自动执行分区和格式化过程。

原始访问可以通过调用CreateFile("\\\\.\\PhysicalDisk3")和相似的路径,而不需要管理员权限来实现,这样就可以在可移动磁盘来完成。不过,这是我不想自己写的代码。操作系统仍然需要被告知在更改后重新扫描卷。

是否有任何的API内置到Windows或分区SD卡的第三方的开源框架的一部分,而不需要对分区表直接按位访问?如果不是,在更改分区后应该怎样做Windows重新扫描卷?我更喜欢XP和更新的方法。

+0

问:什么类型的文件系统中,贵嵌入式操作系统的支持?否则,Q:你觉得如何在Windows DDK中感受到自己的亲密感(觉得你可能已经非常精通)?问:你有没有考虑过使用FAT32,但覆盖了你自己的错误检测/纠错?问:你的嵌入式操作系统是什么? – paulsm4

+0

没有嵌入式操作系统。嵌入式系统上总共有160KB的RAM,并且除了存储之外还必须处理其他功能。我的理解是,就内存使用而言,FAT32和exFAT至少与普通FAT(FAT12,FAT16)一样差。我很高兴使用DDK进行用户模式开发(DDK头文件被打包用于命令行构建过程,即使对于用户模式,我也可以处理),但是我不打算写内核模式代码,可以在用户模式下完成。 –

+0

还有一个建议:看看Win32DiskManager的源代码。您也许能为您的项目类似的东西:http://sourceforge.net/projects/win32diskimager/ – paulsm4

回答

0

看起来如果Windows使用分区管理的IOCTL机制。特别是,IOCTL_DISK_SET_DRIVE_LAYOUT_EX control code看起来非常有用。

我会进一步调查,然后更新这个答案。

+0

问:我提到的源代码中是否有ioctl()? ;) – paulsm4

+0

@ paulsm4:当然,但没有涉及到分区。 –

1

你的问题似乎是几乎完全一样的我现在有我们自己的项目之一来解决。

我会建议离开FAT32文件系统的卡上不变。
但是,然后你创建一个或多个大容器文件,连续块或预分配表。

这甚至可以用嵌入式系统本身完成。
elm-chan's FatFs

然后你就可以访问所有块的容器内的原生,没有任何进一步的访问胖,但该卡可以通过任何操作系统来处理,甚至普通用户可以复制文件。

Smaple功能分配连续的容器:
Allocate a contiguous area to the file
然后你就可以访问该块没有文件系统库,仅在第一次访问容器,以确定它开始的地方。

+0

我已经在使用文件系统库([efsl](http://sourceforge.net/projects/efsl/)),但它导致我的问题。它使用调用堆栈的状态,使其与中断驱动设计不兼容,它需要大量的内存作为块缓存,经常读取和写入元数据等。我见过使用像您这样的大容器文件的系统建议,但确保容器完全连续需要低级别的访问和直接调整文件系统结构;如果我必须这样做,我宁愿自己管理整个分区。 –