2014-10-30 6 views
1

Я использую CMX-RTX RTOS и Elm Chan FatFS. Все работает хорошо, пока задачи не выйдут в линию, чтобы попасть в файловую систему.Лучший способ обработки многозадачной файловой системы с использованием RTOS во встроенном C?

Для тех, кто знаком с Chan FatFS, я изменил макросы ENTER_FS и LEAVE_FS, чтобы взять и освободить ресурс. Если задача пытается ввести FS и ресурс является собственностью, он будет находиться в ожидании, пока ресурс не будет выпущен.

У меня возникают сомнения, что это лучший способ обработки доступа к FS из нескольких задач. У меня было несколько случаев, когда FS генерирует сбои и даже простые команды для SD получают неверные ответы. Ни один из этих сбоев не возникает, если я ограничиваю только 1 задачу доступа к FS.

Чтобы получить главный вопрос, какие мысли и рекомендации для многопроцессорного доступа FS? Например, более изящный метод, который я изначально использовал? Или, возможно, единственная задача, которая будет отмечена различными задачами для доступа к FS?

ответ

0

Поскольку большинство доступов читается, очевидным и простым улучшением является многочиповой, одиночный писатель. Дальнейшим усовершенствованием будет обращение к корневому каталогу FAT и создание обхода, чтобы записи в другом месте не блокировали чтение корневого каталога. (Это может также включать кэш R/W корневого каталога)

0

Я использую один поток для доступа к своей SD-карте с помощью FatFS. Как вы говорите, это хорошо работает. Я использую основной поток для запуска файловой системы, так как он имеет наибольший стек (поскольку он должен запускать crt, статические ctors C++ и другие вещи). main() становится потоком, запускает все остальные потоки, запускающие приложение, а затем запускает цикл файловой системы, который обрабатывает запросы из очереди производителя-потребителя.

Любой поток, требующий файловых операций, должен поставить объект FSrequest в поток FS. Поток FS обрабатывает запросы последовательно, как они появляются в очереди. Все потоки, которые требуют FS, получают FSnotifiable, сам по себе класс, полученный из FSrequest, который имеет метод FSnotify, который принимает параметр FSrequest в качестве параметра. Поток FS выдает FSrequests из очереди, обрабатывает их по запросу члена команды «команда», загружает член «error» с нулевым указателем или указателем строки ошибки, а затем вызывает метод FSnotify с завершенным FSrequest в качестве параметра.

Как правило, FSnotify() сигнализирует о семафоре, на котором ожидает возникающий поток.

EDIT: И ЭТО ВСЕ МУСОР ИЗ-ЗА ЭТО AC ВОПРОС: ((

Попробую еще раз:

ОК, так что нет классов :(не Declare-структуру Ань FSrequest 'для представления запроса FS/response. Он должен иметь перечисление для представления желаемой операции, а функция обратного вызова «завершения» должна быть заполнена в исходном потоке. Вероятно, она также имеет указатель буфера (для тех отпечатков, которые нуждаются в буфере для чтения/запись из/в сообщение или сообщение об ошибке не удалось), а также успешное/сбой boolean.

Используйте один поток, который появляется из продукта er-consumer queue struct/code для обработки файловой системы. Если поток хочет выполнить операцию FS, ему необходимо объявить запрос FS, заполнить детали и поставить очередь в поток FS. Он должен указывать обратный вызов завершения на функцию, которая сигнализирует семафор. Запрашивающий поток ожидает семафора для уведомления о завершении из потока FS. Нить FS выполняет любую операцию, запрашивает, заполняет успех/сбой/ошибку, а затем вызывает обратный вызов завершения.