kanzler 0 22 ноября, 2007 Опубликовано 22 ноября, 2007 · Жалоба Прикрутил FatFs на ATmega128. В примерах данных от мистера ChaN'а не очень понятно вот что. В программе описываю структуру типа FATFS, но ни как не могу найти где он заносит данные в эту структуру. Прошу уважаемые коллеги, разобраться с этим вопросом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 22 ноября, 2007 Опубликовано 22 ноября, 2007 · Жалоба В программе описываю структуру типа FATFS, но ни как не могу найти где он заносит данные в эту структуру.Вы должны передать ее адрес через f_mount в начале работы. Потом он с ней будет работать сам внутри. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kanzler 0 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба Вы должны передать ее адрес через f_mount в начале работы. Потом он с ней будет работать сам внутри. Так и делаю, но после f_mount структура пустая. Значить я что то делаю не так. Что? Вопрос - в настройках используемой памяти в IAR какие значения нужно ставить? У меня Heap size 0x400, CSTACK = 256, RSTACK = 128 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GDI 0 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба Cделайте map-файл и посмотрите какие размеры стеков вам требуются Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба Так и делаю, но после 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 только сохраняет адрес этой структуры во внутренней переменной. А заполнение произойдет потом, когда попытаетесь призвести какое-нибудь действие с файлом/директорией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба Так и делаю, но после f_mount структура пустая. Значить я что то делаю не так. Что? Вопрос - в настройках используемой памяти в IAR какие значения нужно ставить? У меня Heap size 0x400, CSTACK = 256, RSTACK = 128 А Вы описали функции disk read/write sector/ioctl? Возможно проблема в этом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kanzler 0 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба Как что? Не прочитали документацию. А заполнение произойдет потом, когда попытаетесь призвести какое-нибудь действие с файлом/директорией. Читал, но мой англицкий оставляет желать лучшего. Так и пытаюсь произвести чтение директории с помощью f_readdir, возвращает - FR_NO_FILESYSTEM, хотя флешка перед тем была отформатированна FAT16 и записан файл. А Вы описали функции disk read/write sector/ioctl? Возможно проблема в этом? В этом нет проблемы драйвер был прикручен и он работает без сбоев. Cделайте map-файл и посмотрите какие размеры стеков вам требуются Честно говоря я не сильно понимаю как можно узнать в map-файле что со стеком всё впорядке. Подскажите пожайлуста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба В этом нет проблемы драйвер был прикручен и он работает без сбоев. 999 против 1, что disk_read() не смотря вышеприведенное утверждение не работает. В чем с легкостью можете убедится посмотрев что Вы получили вместо 0 сектора в fs. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kanzler 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба 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, пожайлуста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба Посмотрев код я не нашёл в функциях... Расстроили очень :( Читаем: Так и пытаюсь произвести чтение директории с помощью 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, ну и ручками при желании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kanzler 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба Расстроили очень :( Читаем: Для начала 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. Как быть в этом случае? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба Если первая строка у меня проходит то вторая у меня не хочет проходитьА вот как раз f_mount() и должен был заранее прописать в FatFs[drv] адрес вашей структуры FATFS из первого вопроса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kanzler 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба А вот как раз f_mount() и должен был заранее прописать в FatFs[drv] адрес вашей структуры FATFS из первого вопроса. Спасибо за разъяснения, значить где то у меня изначально было неправильно сделанно, буду искать где. Вопрос: Структура FatFs[drv] описана как массив. Я же в начале описываю свою структуру таким образом FATFS fatfs; это может повлиять на то что у меня не заполняется fatfs. Может быть мне нужно было сделать как в примере FATFS fatfs[2]? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба Как быть в этом случае? Вы это уж... как нибудь со "случаем" определитесь для начала, а то просто какой-то свободный поток слов. В "новом случае" начните, однако, с начала, и вызовите f_mount(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kanzler 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба Вы это уж... как нибудь со "случаем" определитесь для начала, а то просто какой-то свободный поток слов. В "новом случае" начните, однако, с начала, и вызовите f_mount(). Со случаем я разобрался в самом начале, а вот f_mount у меня проходит и возвращает FR_OK. А вот в остальном - я прошу у вас многоуважаемые специалисты помощи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться