|
Вопрос по FatFs от мистера ChaN'а |
|
|
|
 |
Ответов
(1 - 14)
|
Nov 23 2007, 09:59
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(kanzler @ Nov 23 2007, 04:31)  Так и делаю, но после f_mount структура пустая. Значить я что то делаю не так. Что? Как что? Не прочитали документацию. Хотя бы на f_mount: Цитата This function only initializes the work area and registers its address to the internal table, any access to the disk I/O layer does not occure. The actual mounting process is performed depends on requirement in any other file funcitons. Можно было еще заглянуть в исходники, и увидеть, что f_mount только сохраняет адрес этой структуры во внутренней переменной. А заполнение произойдет потом, когда попытаетесь призвести какое-нибудь действие с файлом/директорией.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 23 2007, 16:49
|

Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728

|
Цитата(Сергей Борщ @ Nov 23 2007, 14:59)  Как что? Не прочитали документацию. А заполнение произойдет потом, когда попытаетесь призвести какое-нибудь действие с файлом/директорией. Читал, но мой англицкий оставляет желать лучшего. Так и пытаюсь произвести чтение директории с помощью f_readdir, возвращает - FR_NO_FILESYSTEM, хотя флешка перед тем была отформатированна FAT16 и записан файл. Цитата(prottoss @ Nov 23 2007, 18:30)  А Вы описали функции disk read/write sector/ioctl? Возможно проблема в этом? В этом нет проблемы драйвер был прикручен и он работает без сбоев. Цитата(GDI @ Nov 23 2007, 12:20)  Cделайте map-файл и посмотрите какие размеры стеков вам требуются Честно говоря я не сильно понимаю как можно узнать в map-файле что со стеком всё впорядке. Подскажите пожайлуста.
|
|
|
|
|
Nov 24 2007, 06:27
|

Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728

|
Цитата(zltigo @ Nov 24 2007, 01:52)  999 против 1, что disk_read() не смотря вышеприведенное утверждение не работает. В чем с легкостью можете убедится посмотрев что Вы получили вместо 0 сектора в fs. Ставка принята. Посмотрев код я не нашёл в функциях f_mount, f_opendir, f_readdir ссылок на да функцию disk_read(). Может быть я что то пропустил. Или может быть после того как произвели регистрацию fs с помощью f_mount нужно вызвать f_getfree()? Хотя и в ней нет ссылка на disk_read(). Вобщем ни одна функция f_opendir, f_readdir, f_getfree не возвращает FR_OK. Эсли это связанно с тем что функция disk_read() не работает, то я её проверю, только объясните по шагам как работать с FatFs, пожайлуста.
|
|
|
|
|
Nov 24 2007, 07:51
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(kanzler @ Nov 24 2007, 08:27)  Посмотрев код я не нашёл в функциях... Расстроили очень  Читаем: Цитата Так и пытаюсь произвести чтение директории с помощью f_readdir, возвращает - FR_NO_FILESYSTEM, Для начала f_readdir() в принципе не может возвращать FR_NO_FILESYSTEM, ибо работает с готовой заполненной структурой DIR. Сию ошибку возвращает f_opendir() которая и пытается прочитать с диска и заполнить вышеупомянутую структуру. В свою очередь FR_NO_FILESYSTEM возвращает только фунуция auto_mount(), которая в свою очередь вызывает функцию с совершенно ожидаемым названием check_fs(), которая в свою очередь ну совсем ожидаемо (а что ей еще остается делать?) вызывает disk_read() для разборок с содержимым диска. P.S. Кстати, auto_mount() очень сомнительное "удобство" введенное в V0.04, ибо узнается о проблемах с диском только при обращении к нему. Например, пришел, сменил носитель, ушел и через некоторое время узнал, что не сработало. Одно из моих изменений в собственно ff (немногих, кстати  ) касается замены auto_mount() на check_mount(), а собствено монтирование (полное, а не то, огрызок f_mount() ) осуществляется по детектированию вставления SD/MMC, ну и ручками при желании.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 24 2007, 08:15
|

Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728

|
Цитата(zltigo @ Nov 24 2007, 12:51)  Расстроили очень  Читаем: Для начала f_readdir() в принципе не может возвращать FR_NO_FILESYSTEM, ибо работает с готовой заполненной структурой DIR. Сию ошибку возвращает f_opendir() которая и пытается прочитать с диска и заполнить вышеупомянутую структуру. В свою очередь FR_NO_FILESYSTEM возвращает только фунуция auto_mount(), которая в свою очередь вызывает функцию с совершенно ожидаемым названием check_fs(), которая в свою очередь ну совсем ожидаемо (а что ей еще остается делать?) вызывает disk_read() для разборок с содержимым диска. Прошу прощения за то что вас расстроил. А теперь к делу. Согласен FR_NO_FILESYSTEM возвращает auto_mount(). Но в сей функции есть строки: /* Check if the drive number is valid or not */ if (drv >= _DRIVES) return FR_INVALID_DRIVE; /* Is the drive number valid? */ if (!(fs = FatFs[drv])) return FR_NOT_ENABLED; /* Is the file system object registered? */ Если первая строка у меня проходит то вторая у меня не хочет проходить, таким образом функция f_opendir возвращает не только FR_NO_FILESYSTEM но и FR_NOT_ENABLED. Как быть в этом случае?
|
|
|
|
|
Nov 24 2007, 08:29
|

Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728

|
Цитата(Сергей Борщ @ Nov 24 2007, 13:22)  А вот как раз f_mount() и должен был заранее прописать в FatFs[drv] адрес вашей структуры FATFS из первого вопроса. Спасибо за разъяснения, значить где то у меня изначально было неправильно сделанно, буду искать где. Вопрос: Структура FatFs[drv] описана как массив. Я же в начале описываю свою структуру таким образом FATFS fatfs; это может повлиять на то что у меня не заполняется fatfs. Может быть мне нужно было сделать как в примере FATFS fatfs[2]?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|