Тому кто не имеет физический накопитель, но хочет видеть своё устройство в виде диска в заветном «Мой компьютер». В корне диска при этом могут находиться инструкция, драйверы, файл с описанием версии устройства, и пр. В этом случае, нужно заметить, вместо эмуляции носителя, можно отдавать хосту части «вкомпиленного» слепка преподготовленной ФС.
Однако в этом случае, вероятнее всего, расход памяти МК будет существенно выше, а гибкость решения — нулевая. Итак, как это работает. При попытке пользователя прочитать или записать файл, соответствующий вызов транслируется в usb- запросы, которые передаются нашему устройству. Суть запросов проста — записать или считать сектор на конечном носителе.
При этом, надо отметить, винда (или другая ОС) ведёт себя как хозяйка в плане организации хранения на носителе. Только она знает какой сектор хочет считать или записать. А захочет — и вовсе дефрагментирует нас, устроив хаотичное «жанглирование» секторами. Наш «носитель» только для чтения. Это связано с повышенной сложностью контроля за формированием файловой таблицы. Тем не менее, в API модуля присутствует функция- пустышка emfat.
Возможно, в будущем будет найдено решение для корректной эмуляции записи. Задача модуля при запросе на чтение — «отдать» валидные данные.
В этом и состоит его основная работа. В зависимости от запрашиваемого сектора, этими данными могут являться: Запись MBR; Загрузочный сектор; Один из секторов файловой таблицы FAT1 или FAT2; Сектор описания директории; Сектор данных, относящийся к файлу. Поэтому накладные расходы были минимизированы. Из- за того что мы отказались от обслуживания записи на накопитель, мы вольны организовать структуру хранения, как нам захочется: Всё совершенно стандартно, кроме нескольких деталей: Данные не фрагментированы; Отсутствуют некоторые ненужные области FAT; Свободных кластеров нет (размер носителя «подогнан» под размер данных); Размер FAT- таблиц также «подогнан» под размер данных.
В реальности она не содержится в оперативной памяти, а формируется соответствующим образом, в зависимости от номера читаемого сектора. API модуля. API составлен всего из трёх функций: bool emfat. Значение max. Она заполняет данные по передаваемому ей адресу (data) в зависимости от запрашиваемого сектора (sector). При чтении сектора данных, относящегося к файлу, модуль emfat транслирует номер сектора в индекс читаемого файла и смещение, после чего вызывает пользовательскую callback- функцию чтения.
Пользователь, соответственно, отдаёт «кусок» конкретного файла. Откуда он берётся библиотеке не интересно. Так, например, в проекте заказчика, файлы настроек я отдавал из внутренней flash памяти, другие файлы — из ОЗУ и spi- flash. Код примера#include .
Можно воспользоваться эмулятором ФС. Библиотека реализовывает только базовые функции и имеет ряд ограничений: Нет поддержки длинных имён (только 8. Имя должно быть на латинице строчного регистра.