Перейти к содержанию
    

Вопрос по FatFs от мистера ChaN'а

Прикрутил FatFs на ATmega128. В примерах данных от мистера ChaN'а не очень понятно вот что. В программе описываю структуру типа FATFS, но ни как не могу найти где он заносит данные в эту структуру. Прошу уважаемые коллеги, разобраться с этим вопросом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В программе описываю структуру типа FATFS, но ни как не могу найти где он заносит данные в эту структуру.
Вы должны передать ее адрес через f_mount в начале работы. Потом он с ней будет работать сам внутри.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы должны передать ее адрес через f_mount в начале работы. Потом он с ней будет работать сам внутри.

Так и делаю, но после f_mount структура пустая. Значить я что то делаю не так. Что? Вопрос - в настройках используемой памяти в IAR какие значения нужно ставить? У меня Heap size 0x400, CSTACK = 256, RSTACK = 128

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Cделайте map-файл и посмотрите какие размеры стеков вам требуются

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так и делаю, но после 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 только сохраняет адрес этой структуры во внутренней переменной. А заполнение произойдет потом, когда попытаетесь призвести какое-нибудь действие с файлом/директорией.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так и делаю, но после f_mount структура пустая. Значить я что то делаю не так. Что? Вопрос - в настройках используемой памяти в IAR какие значения нужно ставить? У меня Heap size 0x400, CSTACK = 256, RSTACK = 128
А Вы описали функции disk read/write sector/ioctl? Возможно проблема в этом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как что? Не прочитали документацию. А заполнение произойдет потом, когда попытаетесь призвести какое-нибудь действие с файлом/директорией.

Читал, но мой англицкий оставляет желать лучшего.

Так и пытаюсь произвести чтение директории с помощью f_readdir, возвращает - FR_NO_FILESYSTEM, хотя флешка перед тем была отформатированна FAT16 и записан файл.

 

А Вы описали функции disk read/write sector/ioctl? Возможно проблема в этом?

В этом нет проблемы драйвер был прикручен и он работает без сбоев.

 

Cделайте map-файл и посмотрите какие размеры стеков вам требуются

Честно говоря я не сильно понимаю как можно узнать в map-файле что со стеком всё впорядке. Подскажите пожайлуста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В этом нет проблемы драйвер был прикручен и он работает без сбоев.

999 против 1, что disk_read() не смотря вышеприведенное утверждение не работает. В чем с легкостью можете убедится посмотрев что Вы получили вместо 0 сектора в fs.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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, пожайлуста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрев код я не нашёл в функциях...

Расстроили очень :( Читаем:

Так и пытаюсь произвести чтение директории с помощью 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, ну и ручками при желании.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Расстроили очень :( Читаем:

 

Для начала 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. Как быть в этом случае?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если первая строка у меня проходит то вторая у меня не хочет проходить
А вот как раз f_mount() и должен был заранее прописать в FatFs[drv] адрес вашей структуры FATFS из первого вопроса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот как раз f_mount() и должен был заранее прописать в FatFs[drv] адрес вашей структуры FATFS из первого вопроса.

Спасибо за разъяснения, значить где то у меня изначально было неправильно сделанно, буду искать где.

Вопрос: Структура FatFs[drv] описана как массив. Я же в начале описываю свою структуру таким образом FATFS fatfs; это может повлиять на то что у меня не заполняется fatfs. Может быть мне нужно было сделать как в примере FATFS fatfs[2]?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как быть в этом случае?

Вы это уж... как нибудь со "случаем" определитесь для начала, а то просто какой-то свободный поток слов.

В "новом случае" начните, однако, с начала, и вызовите f_mount().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы это уж... как нибудь со "случаем" определитесь для начала, а то просто какой-то свободный поток слов.

В "новом случае" начните, однако, с начала, и вызовите f_mount().

Со случаем я разобрался в самом начале, а вот f_mount у меня проходит и возвращает FR_OK. А вот в остальном - я прошу у вас многоуважаемые специалисты помощи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...