介绍

介绍

介绍

在我正在开发的 USB 设备上,我想提供一个 USB 大容量存储端点用于配置更新。

该设备通过 USB 针头进行内部连接,若要更新配置,用户只需将文件复制到“假”闪存驱动器上,因此无需其他软件。这使得该解决方案可在各种操作系统之间移植,并改善用户体验。

使用陆发,我已经设法实现了一个具有大容量存储端点的 USB 设备,该设备支持足够的基本 SCSI 命令,可以被 Windows 识别为存储设备。

但现在我正试图完全实现SCSI 精简块命令集,我意识到可能存在问题。我使用的 MCU Atmega32u4 只有 2.5KB 的 SRAM。其中一部分被主要功能的全局变量和缓冲区占用,因此我只想使用其中的 1KB 用于 SCSI 存储功能。

问题描述

TL;DR 如上所述:我只有大约 1KB 可用于存储缓冲区,以在 MCU 上实现最基本的 USB 大容量存储功能。

据我所知,要正确用作块设备,大容量存储设备需要格式化。我不知道最常用的(Windows 和 Linux)支持的文件系统是什么。我猜是 FAT32,但无论如何,除了文件本身之外,它还需要存储与分区和一个文件相关的所有信息。此外,SCSI 似乎可以在 512 字节块大小上工作,因此只需两次块写入就可以写入整个“闪存驱动器”,这听起来会造成麻烦。

我现在的问题是:

是否有可能仅使用 1KB 存储空间来制作/模拟一个功能齐全的 USB 闪存盘?什么会阻止我这样做?空分区需要多少开销空间?我甚至可以通过使用非 SCSI USB 模式来实现这一点而无需对设备进行分区吗?

答案1

您需要一个 512 字节的 MBR、FAT 表、备份 FAT 表、分区的第一个扇区(根目录),然后是存储。每个都需要 512 字节。FAT16 FAT 表可以容纳 256 个簇/扇区,因此如果您需要更多,您将需要 FAT 表中的更多扇区。

 1 MBR
 2 FAT
 3 Backup FAT
 4 Root directory partition 1
 5 512 bytes storage
 6 512 bytes storage

因此,使用 FAT16 至少需要 6 个扇区,而使用 FAT32 则需要多几个扇区。

如果您模拟 FAT 表和备份 FAT,那么每个可能只需要大约 20 个字节。(您只需将其余 FAT 报告为全零。)其他扇区将很难减少。

我强烈建议至少使用 10k 或 20 个扇区,这样如果您的文件随着时间的推移变得越来越大,您就有一定的回旋余地。

相关内容