|
|
  |
Вопрос по FatFs от мистера ChaN'а |
|
|
|
Nov 24 2007, 08:48
|

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

|
Цитата(kanzler @ Nov 24 2007, 10:35)  f_mount у меня проходит и возвращает FR_OK. Это значит только одно - Вы его успещно ОТМОНТИРОВАЛИ, а не примонтировали. В случае успешного монтирования в FatFs[] никоем образом не может быть NULL и соответствено if (!(fs = FatFs[drv])) return FR_NOT_ENABLED; /* Is the file system object registered? */ никоем образом не FR_NOT_ENABLED Цитата(kanzler @ Nov 24 2007, 10:35)  Со случаем я разобрался в самом начале... Опять неправда - если-бы разобрались, то вопрос о f_mount() вообще не сстоял-бы, ибо ОБЯЗАТЕЛЬНЫМ условием получения того сообщения является наличие смонтированной файловой системы.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 24 2007, 09:21
|

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

|
Цитата(zltigo @ Nov 24 2007, 13:48)  Это значит только одно - Вы его успещно ОТМОНТИРОВАЛИ, а не примонтировали. В случае успешного монтирования в FatFs[] никоем образом не может быть NULL и соответствено if (!(fs = FatFs[drv])) return FR_NOT_ENABLED; /* Is the file system object registered? */ никоем образом не FR_NOT_ENABLED f_mount возвращает только два значениния - FR_OK или FR_INVALID_DRIVE. С FR_INVALID_DRIVE всё понятно, но не понятно тогда зачем нужна функция f_mount, если она делает только unmount? В итоге я совсем запуталься :-( Делаю вывод - значить структуру FATFS fatfs ни когда не примонтировать и она всегда будет пустая. Тогда просьба - дайте пример исходника как вы делаете инициализацию FATFS.
|
|
|
|
|
Nov 24 2007, 09:37
|

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

|
Цитата(kanzler @ Nov 24 2007, 11:21)  Делаю вывод - значить структуру FATFS fatfs ни когда не примонтировать и она всегда будет пустая. С чего-бы это? Там вообще-то пяток строчек! Так и хочется чего-нибудь спросить перефразируя классическое "Киса, скажите, как фидошник фидошнику, Вы почту качать умеете?".... f_mount() для монтирования нужно передать указатель на РЕАЛЬНО существующую память. Все больше ничего. Заполнять эту структуру, при условии что ЕСТЬ УКАЗАТЕЛЬ будет уже auto_mount() А вот если этого указателя нет, то тогда получите отлуп FR_NOT_ENABLED. Цитата Тогда просьба - дайте пример исходника как вы делаете инициализацию FATFS. А то примеров из документации и прилагаемых тестовых исходников УЖЕ не достаточно?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 24 2007, 13:14
|

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

|
Цитата(Непомнящий Евгений @ Nov 24 2007, 15:01)  Рассматриваю возможность прикрутить ее к DataFlash. А смысл, для несъемного носителя? Цитата Насколько я понял после быстрого просмотра исходников, FatFS пишет и читает данные секторами по 512 байт. Ну так можно и увеличить, если памяти не жалко. Цитата А DataFlash перед записью надо стирать Необязательно, просто можете периодически запускать процедуру освежения. Правда если делать правильно, надо счетчик перезаписей заводить для каждого сектора и где то его хранить.... Короче я для DataFlash свою простенькую системку сделал - количесво файлов ограничено, кластеры большие, но зато простая, учмтывает особенности DataFlash и памяти почти не требует - даже "FAT" в буфере DataFlash хранит.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 24 2007, 13:34
|

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

|
Цитата(Непомнящий Евгений @ Nov 24 2007, 15:01)  А DataFlash перед записью надо стирать, причем не по 512 байт, а по блокам (для моей модели минимальный размер блока - 4 кб). Dataflash можно стирать не только блоками, но и страницами. Для FatFS достаточно указать размер сектора = размеру страницы, и размер кластера = 512 / размер страницы, если ничего не путаю (у меня 321, указан размер сектор 512 и размер кластера 1) Цитата(zltigo @ Nov 24 2007, 15:14)  А смысл, для несъемного носителя? А если нужна файловая система часто читать/очень редко писать, то вот она есть - готовая и свободно доступная. Альтернативы (кроме писать свою)?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 24 2007, 14:00
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(Сергей Борщ @ Nov 24 2007, 16:34)  Dataflash можно стирать не только блоками, но и страницами. Для FatFS достаточно указать размер сектора = размеру страницы, и размер кластера = 512 / размер страницы, если ничего не путаю (у меня 321, указан размер сектор 512 и размер кластера 1) У меня AT26DF321. Запись у нее страницами по 256 байт, а стирание - блоками по 4, 32, 64 Кб. Т.е. чтобы записать произвольную страницу, надо сначала перекопировать куда-нить остальные страницы блока, стереть блок, скопировать все страницы обратно и при этом записать нужную. Смысл прикручивать - хотелось что-нибудь стандартное и отлаженное  . Но для меня критична устойчивость к сбоям питания, а в FatFS как я понимаю с этим проблемы. Так что наверное придется писать что-то свое, заточненное под DataFlash и с примитивным журналом действий, чтобы восстановиться после сбоя. Цитата(zltigo @ Nov 24 2007, 16:14)  Необязательно, просто можете периодически запускать процедуру освежения. А что за процедура такая? Цитата Правда если делать правильно, надо счетчик перезаписей заводить для каждого сектора и где то его хранить.... Я думал хранить очередь свободных секторов - при надобности берется первая, при освобождении - ставится в конец. По-моему, получится эквивалентно счетчику...
|
|
|
|
|
Nov 24 2007, 14:35
|

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

|
Цитата(Непомнящий Евгений @ Nov 24 2007, 16:00)  А что за процедура такая? Смотрите команды "Rewrite Trough". Цитата По-моему, получится эквивалентно счетчику... Я о счетчике записей через "Programm-Erase" (помнится порядка 10 тысяч) в сектор до проведения "Rewrite Trough".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 24 2007, 15:12
|

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

|
Цитата(Непомнящий Евгений @ Nov 24 2007, 17:00)  Называл в сообщении 24  А теперь прочитайте 21 и 22 сообщения. Цитата А насчет нерекомендуемой - можно поподробней? А чего подробнее - посмотрите dataseet и там на первой станице черным жирным шрифтом набрано. http://www.atmel.com/dyn/products/product_...sp?part_id=3927
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 20 2009, 09:46
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
В версии ff006 неправильно работает fprintf: Код void save_to_file(void) { RTC rtc; const char format[] = "%u/%u/%u %02u:%02u:%02u\n"; ds1338_gettime(&rtc); fprintf(&file, format, rtc.year, rtc.month, rtc.mday, rtc.hour, rtc.min, rtc.sec); } В файл не записывается последняя переменная и '\n'. В то же время через printf выводит как положено: Код printf_P("%u/%u/%u %02u:%02u:%02u\n", rtc.year, rtc.month, rtc.mday, rtc.hour, rtc.min, rtc.sec); Ошибка явно в функции fprintf. Помогите найти ошибку. В версии ff006 неправильно работает fprintf: Код void save_to_file(void) { RTC rtc; const char format[] = "%u/%u/%u %02u:%02u:%02u\n"; ds1338_gettime(&rtc); fprintf(&file, format, rtc.year, rtc.month, rtc.mday, rtc.hour, rtc.min, rtc.sec); } В файл не записывается последняя переменная и '\n'. В то же время через printf выводит как положено: Код printf_P("%u/%u/%u %02u:%02u:%02u\n", rtc.year, rtc.month, rtc.mday, rtc.hour, rtc.min, rtc.sec); Ошибка явно в функции fprintf. Помогите найти ошибку.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|