FATFS на ST32 с устройством, настроенным как USB-накопитель
В настоящее время я разрабатываю приложение для ST32 (STM32F103xC) с использованием Micrium OS-II. Пока что все прошло гладко, но сейчас я попал в блок и не могу продолжить.
Плата настроена для работы в качестве запоминающего устройства USB с использованием SD-карты, так что хост-компьютер может копировать файлы, сохраненные на устройстве. Это работает нормально, поскольку вы можете видеть файлы, которые в настоящее время находятся на SD-карте в проводнике Windows.
Однако, когда я пытаюсь использовать FATFS для создания файла в моей программе, f_open() возвращает FR_NOT_READY. Для дальнейшего изучения я создал пример кода, который записывает файлы на SD и работает нормально. Поэтому я переместил код написания кода в своей программе и обнаружил, что если я вызову f_open до того, как начну тик многозадачности ОС, он будет работать правильно - я могу открыть файл и записать в него. Помещение кода сразу после включения галочки (но до создания задач) возвращает к получению FR_NOT_READY.
Я не уверен, что знаю, что это значит. Есть ли ограничения на то, где я могу писать в файлы? Нужно ли отключать многозадачность при записи? (Конечно, нет?) Просто я не могу записать на SD-карту, которую я сейчас использую в качестве USB-устройства?
1 ответ
Действительно, вы не можете выставить SD-карту в качестве устройства хранения данных на внешний USB-хост, а также одновременно монтировать ее локально как файловую систему.
Чтобы прояснить это немного - на самом деле вы можете попытаться сделать это с помощью простого арбитража доступа к оборудованию, но вы вскоре столкнетесь с несогласованностью, если не повреждением данных, поскольку каждый фрагмент кода файловой системы будет предполагать, что у него есть свобода изменять файловая система, нет необходимости немедленно фиксировать изменения согласованным образом и безопасно предполагать, что любые данные файловой системы, которые она кэшировала в памяти, все еще действительны, потому что никто другой не может изменить блоки хранения, не сообщив об этом.
Если вы хотите, чтобы два хоста два обращались к тому хранилищу, вам нужно реализовать что-то с защитой согласованности нескольких клиентов, общей для сетевой файловой системы - то, что FAT определенно не является примером.
Перечисляя ваши варианты, должно быть возможно следующее:
А) Интерфейс SD-карты и USB, выставить SD-карту как устройство хранения данных без локального доступа
Б) Интерфейс SD-карты и использовать его с кодом локальной файловой системы; также есть интерфейс USB для каких-то других целей без режима хранения.
C) Интерфейс SD-карты и USB, управление SD-картой как локальной файловой системой и предоставление доступа к ПК с помощью механизма типа сетевого обмена файлами, который управляет согласованностью
D) Поддержка более чем одного из вышеперечисленных, но в качестве независимых режимов, которые не могут быть активными одновременно и требуют значительных усилий для переключения между ними.