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

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

f_mount у меня проходит и возвращает FR_OK.

Это значит только одно - Вы его успещно ОТМОНТИРОВАЛИ, а не примонтировали.

В случае успешного монтирования в FatFs[] никоем образом не может быть NULL и соответствено

if (!(fs = FatFs[drv])) return FR_NOT_ENABLED; /* Is the file system object registered? */

никоем образом не FR_NOT_ENABLED

 

 

 

Со случаем я разобрался в самом начале...

Опять неправда - если-бы разобрались, то вопрос о f_mount() вообще не сстоял-бы, ибо ОБЯЗАТЕЛЬНЫМ условием получения того сообщения является наличие смонтированной файловой системы.

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


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

Это значит только одно - Вы его успещно ОТМОНТИРОВАЛИ, а не примонтировали.

В случае успешного монтирования в 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.

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


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

Со случаем я разобрался в самом начале, а вот f_mount у меня проходит и возвращает FR_OK.
Совсем тупой вопрос - а какой Logical drive number вы передаете в f_mount? Вообще, покажите код.

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


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

Делаю вывод - значить структуру FATFS fatfs ни когда не примонтировать и она всегда будет пустая.

С чего-бы это?

Там вообще-то пяток строчек! Так и хочется чего-нибудь спросить перефразируя классическое "Киса, скажите, как фидошник фидошнику, Вы почту качать умеете?"....

 

f_mount() для монтирования нужно передать указатель на РЕАЛЬНО существующую память.

Все больше ничего. Заполнять эту структуру, при условии что ЕСТЬ УКАЗАТЕЛЬ будет уже auto_mount()

А вот если этого указателя нет, то тогда получите отлуп FR_NOT_ENABLED.

Тогда просьба - дайте пример исходника как вы делаете инициализацию FATFS.

А то примеров из документации и прилагаемых тестовых исходников УЖЕ не достаточно?

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


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

У меня тоже вопрос по FatFS.

Рассматриваю возможность прикрутить ее к DataFlash. Насколько я понял после быстрого просмотра исходников, FatFS пишет и читает данные секторами по 512 байт. А DataFlash перед записью надо стирать, причем не по 512 байт, а по блокам (для моей модели минимальный размер блока - 4 кб). Т.е. мне надо написать достаточно "толстую" прослойку, которая будет скрывать от FatFS этот механизм - или я чего-то не понял?

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


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

Рассматриваю возможность прикрутить ее к DataFlash.

А смысл, для несъемного носителя?

Насколько я понял после быстрого просмотра исходников, FatFS пишет и читает данные секторами по 512 байт.

Ну так можно и увеличить, если памяти не жалко.

А DataFlash перед записью надо стирать

Необязательно, просто можете периодически запускать процедуру освежения. Правда если делать правильно, надо счетчик перезаписей заводить для каждого сектора и где то его хранить....

Короче я для DataFlash свою простенькую системку сделал - количесво файлов ограничено, кластеры большие, но зато простая, учмтывает особенности DataFlash и памяти почти не требует - даже "FAT" в буфере DataFlash хранит.

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


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

А DataFlash перед записью надо стирать, причем не по 512 байт, а по блокам (для моей модели минимальный размер блока - 4 кб).
Dataflash можно стирать не только блоками, но и страницами. Для FatFS достаточно указать размер сектора = размеру страницы, и размер кластера = 512 / размер страницы, если ничего не путаю (у меня 321, указан размер сектор 512 и размер кластера 1)

 

 

А смысл, для несъемного носителя?
А если нужна файловая система часто читать/очень редко писать, то вот она есть - готовая и свободно доступная. Альтернативы (кроме писать свою)?

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


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

Dataflash можно стирать не только блоками, но и страницами. Для FatFS достаточно указать размер сектора = размеру страницы, и размер кластера = 512 / размер страницы, если ничего не путаю (у меня 321, указан размер сектор 512 и размер кластера 1)

 

У меня AT26DF321. Запись у нее страницами по 256 байт, а стирание - блоками по 4, 32, 64 Кб.

Т.е. чтобы записать произвольную страницу, надо сначала перекопировать куда-нить остальные страницы блока, стереть блок, скопировать все страницы обратно и при этом записать нужную.

 

Смысл прикручивать - хотелось что-нибудь стандартное и отлаженное :).

Но для меня критична устойчивость к сбоям питания, а в FatFS как я понимаю с этим проблемы. Так что наверное придется писать что-то свое, заточненное под DataFlash и с примитивным журналом действий, чтобы восстановиться после сбоя.

 

 

Необязательно, просто можете периодически запускать процедуру освежения.

А что за процедура такая?

Правда если делать правильно, надо счетчик перезаписей заводить для каждого сектора и где то его хранить....

Я думал хранить очередь свободных секторов - при надобности берется первая, при освобождении - ставится в конец. По-моему, получится эквивалентно счетчику...

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


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

А что за процедура такая?

Смотрите команды "Rewrite Trough".

По-моему, получится эквивалентно счетчику...

Я о счетчике записей через "Programm-Erase" (помнится порядка 10 тысяч) в сектор до проведения "Rewrite Trough".

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


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

to zltigo - по моему, мы говорим о разных моделях. В моей AT26DF321 команд "Rewrite Trough" нет...

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


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

to zltigo - по моему, мы говорим о разных моделях.

На момент моего ответа Вы не назвали модель. И уж о нерекомендуемой в новых разработках AT26 я при поминании "DataFlash" подумал-бы в последнюю очередь. Я говорю о AT45.

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


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

На момент моего ответа Вы не назвали модель. И уж о нерекомендуемой в новых разработках AT26 я при поминании "DataFlash" подумал-бы в последнюю очередь. Я говорю о AT45.

Называл в сообщении 24 :)

А насчет нерекомендуемой - можно поподробней?

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


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

Называл в сообщении 24 :)

А теперь прочитайте 21 и 22 сообщения.

А насчет нерекомендуемой - можно поподробней?

А чего подробнее - посмотрите dataseet и там на первой станице черным жирным шрифтом набрано.

http://www.atmel.com/dyn/products/product_...sp?part_id=3927

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


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

В версии 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. Помогите найти ошибку.

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


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

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

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

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

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

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

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

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

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

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