реклама на сайте
подробности

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Вопрос по FatFs от мистера ChaN'а
kanzler
сообщение Nov 22 2007, 19:11
Сообщение #1


Местный
***

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



Прикрутил FatFs на ATmega128. В примерах данных от мистера ChaN'а не очень понятно вот что. В программе описываю структуру типа FATFS, но ни как не могу найти где он заносит данные в эту структуру. Прошу уважаемые коллеги, разобраться с этим вопросом.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 22 2007, 19:32
Сообщение #2


Гуру
******

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



Цитата(kanzler @ Nov 22 2007, 21:11) *
В программе описываю структуру типа FATFS, но ни как не могу найти где он заносит данные в эту структуру.
Вы должны передать ее адрес через f_mount в начале работы. Потом он с ней будет работать сам внутри.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
kanzler
сообщение Nov 23 2007, 02:31
Сообщение #3


Местный
***

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



Цитата(Сергей Борщ @ Nov 23 2007, 00:32) *
Вы должны передать ее адрес через f_mount в начале работы. Потом он с ней будет работать сам внутри.

Так и делаю, но после f_mount структура пустая. Значить я что то делаю не так. Что? Вопрос - в настройках используемой памяти в IAR какие значения нужно ставить? У меня Heap size 0x400, CSTACK = 256, RSTACK = 128
Go to the top of the page
 
+Quote Post
GDI
сообщение Nov 23 2007, 07:20
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 233
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



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


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 23 2007, 09:59
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 7 832
Регистрация: 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)
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 23 2007, 13:30
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 659
Регистрация: 24-03-05
Пользователь №: 3 659



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


--------------------
Go to the top of the page
 
+Quote Post
kanzler
сообщение Nov 23 2007, 16:49
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 339
Регистрация: 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-файле что со стеком всё впорядке. Подскажите пожайлуста.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 23 2007, 20:52
Сообщение #8


Гуру
******

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



Цитата(kanzler @ Nov 23 2007, 18:49) *
В этом нет проблемы драйвер был прикручен и он работает без сбоев.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
kanzler
сообщение Nov 24 2007, 06:27
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 339
Регистрация: 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, пожайлуста.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 24 2007, 07:51
Сообщение #10


Гуру
******

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



Цитата(kanzler @ Nov 24 2007, 08:27) *
Посмотрев код я не нашёл в функциях...

Расстроили очень sad.gif Читаем:
Цитата
Так и пытаюсь произвести чтение директории с помощью 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 (немногих, кстати smile.gif ) касается замены auto_mount() на check_mount(), а собствено монтирование (полное, а не то, огрызок f_mount() ) осуществляется по детектированию вставления SD/MMC, ну и ручками при желании.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
kanzler
сообщение Nov 24 2007, 08:15
Сообщение #11


Местный
***

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



Цитата(zltigo @ Nov 24 2007, 12:51) *
Расстроили очень sad.gif Читаем:

Для начала 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. Как быть в этом случае?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 24 2007, 08:22
Сообщение #12


Гуру
******

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



Цитата(kanzler @ Nov 24 2007, 10:15) *
Если первая строка у меня проходит то вторая у меня не хочет проходить
А вот как раз f_mount() и должен был заранее прописать в FatFs[drv] адрес вашей структуры FATFS из первого вопроса.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
kanzler
сообщение Nov 24 2007, 08:29
Сообщение #13


Местный
***

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



Цитата(Сергей Борщ @ Nov 24 2007, 13:22) *
А вот как раз f_mount() и должен был заранее прописать в FatFs[drv] адрес вашей структуры FATFS из первого вопроса.

Спасибо за разъяснения, значить где то у меня изначально было неправильно сделанно, буду искать где.
Вопрос: Структура FatFs[drv] описана как массив. Я же в начале описываю свою структуру таким образом FATFS fatfs; это может повлиять на то что у меня не заполняется fatfs. Может быть мне нужно было сделать как в примере FATFS fatfs[2]?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 24 2007, 08:29
Сообщение #14


Гуру
******

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



Цитата(kanzler @ Nov 24 2007, 10:15) *
Как быть в этом случае?

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
kanzler
сообщение Nov 24 2007, 08:35
Сообщение #15


Местный
***

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



Цитата(zltigo @ Nov 24 2007, 13:29) *
Вы это уж... как нибудь со "случаем" определитесь для начала, а то просто какой-то свободный поток слов.
В "новом случае" начните, однако, с начала, и вызовите f_mount().

Со случаем я разобрался в самом начале, а вот f_mount у меня проходит и возвращает FR_OK. А вот в остальном - я прошу у вас многоуважаемые специалисты помощи.
Go to the top of the page
 
+Quote Post

5 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th March 2017 - 23:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01539 секунд с 7
ELECTRONIX ©2004-2016