zltigo 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба 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() вообще не сстоял-бы, ибо ОБЯЗАТЕЛЬНЫМ условием получения того сообщения является наличие смонтированной файловой системы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kanzler 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба Это значит только одно - Вы его успещно ОТМОНТИРОВАЛИ, а не примонтировали. В случае успешного монтирования в 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба Со случаем я разобрался в самом начале, а вот f_mount у меня проходит и возвращает FR_OK.Совсем тупой вопрос - а какой Logical drive number вы передаете в f_mount? Вообще, покажите код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба Делаю вывод - значить структуру FATFS fatfs ни когда не примонтировать и она всегда будет пустая. С чего-бы это? Там вообще-то пяток строчек! Так и хочется чего-нибудь спросить перефразируя классическое "Киса, скажите, как фидошник фидошнику, Вы почту качать умеете?".... f_mount() для монтирования нужно передать указатель на РЕАЛЬНО существующую память. Все больше ничего. Заполнять эту структуру, при условии что ЕСТЬ УКАЗАТЕЛЬ будет уже auto_mount() А вот если этого указателя нет, то тогда получите отлуп FR_NOT_ENABLED. Тогда просьба - дайте пример исходника как вы делаете инициализацию FATFS. А то примеров из документации и прилагаемых тестовых исходников УЖЕ не достаточно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kanzler 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба Огромное всем спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба У меня тоже вопрос по FatFS. Рассматриваю возможность прикрутить ее к DataFlash. Насколько я понял после быстрого просмотра исходников, FatFS пишет и читает данные секторами по 512 байт. А DataFlash перед записью надо стирать, причем не по 512 байт, а по блокам (для моей модели минимальный размер блока - 4 кб). Т.е. мне надо написать достаточно "толстую" прослойку, которая будет скрывать от FatFS этот механизм - или я чего-то не понял? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба Рассматриваю возможность прикрутить ее к DataFlash. А смысл, для несъемного носителя? Насколько я понял после быстрого просмотра исходников, FatFS пишет и читает данные секторами по 512 байт. Ну так можно и увеличить, если памяти не жалко. А DataFlash перед записью надо стирать Необязательно, просто можете периодически запускать процедуру освежения. Правда если делать правильно, надо счетчик перезаписей заводить для каждого сектора и где то его хранить.... Короче я для DataFlash свою простенькую системку сделал - количесво файлов ограничено, кластеры большие, но зато простая, учмтывает особенности DataFlash и памяти почти не требует - даже "FAT" в буфере DataFlash хранит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба А DataFlash перед записью надо стирать, причем не по 512 байт, а по блокам (для моей модели минимальный размер блока - 4 кб).Dataflash можно стирать не только блоками, но и страницами. Для FatFS достаточно указать размер сектора = размеру страницы, и размер кластера = 512 / размер страницы, если ничего не путаю (у меня 321, указан размер сектор 512 и размер кластера 1) А смысл, для несъемного носителя?А если нужна файловая система часто читать/очень редко писать, то вот она есть - готовая и свободно доступная. Альтернативы (кроме писать свою)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба Dataflash можно стирать не только блоками, но и страницами. Для FatFS достаточно указать размер сектора = размеру страницы, и размер кластера = 512 / размер страницы, если ничего не путаю (у меня 321, указан размер сектор 512 и размер кластера 1) У меня AT26DF321. Запись у нее страницами по 256 байт, а стирание - блоками по 4, 32, 64 Кб. Т.е. чтобы записать произвольную страницу, надо сначала перекопировать куда-нить остальные страницы блока, стереть блок, скопировать все страницы обратно и при этом записать нужную. Смысл прикручивать - хотелось что-нибудь стандартное и отлаженное :). Но для меня критична устойчивость к сбоям питания, а в FatFS как я понимаю с этим проблемы. Так что наверное придется писать что-то свое, заточненное под DataFlash и с примитивным журналом действий, чтобы восстановиться после сбоя. Необязательно, просто можете периодически запускать процедуру освежения. А что за процедура такая? Правда если делать правильно, надо счетчик перезаписей заводить для каждого сектора и где то его хранить.... Я думал хранить очередь свободных секторов - при надобности берется первая, при освобождении - ставится в конец. По-моему, получится эквивалентно счетчику... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба А что за процедура такая? Смотрите команды "Rewrite Trough". По-моему, получится эквивалентно счетчику... Я о счетчике записей через "Programm-Erase" (помнится порядка 10 тысяч) в сектор до проведения "Rewrite Trough". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба to zltigo - по моему, мы говорим о разных моделях. В моей AT26DF321 команд "Rewrite Trough" нет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба to zltigo - по моему, мы говорим о разных моделях. На момент моего ответа Вы не назвали модель. И уж о нерекомендуемой в новых разработках AT26 я при поминании "DataFlash" подумал-бы в последнюю очередь. Я говорю о AT45. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба На момент моего ответа Вы не назвали модель. И уж о нерекомендуемой в новых разработках AT26 я при поминании "DataFlash" подумал-бы в последнюю очередь. Я говорю о AT45. Называл в сообщении 24 :) А насчет нерекомендуемой - можно поподробней? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба Называл в сообщении 24 :) А теперь прочитайте 21 и 22 сообщения. А насчет нерекомендуемой - можно поподробней? А чего подробнее - посмотрите dataseet и там на первой станице черным жирным шрифтом набрано. http://www.atmel.com/dyn/products/product_...sp?part_id=3927 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 20 марта, 2009 Опубликовано 20 марта, 2009 · Жалоба В версии 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. Помогите найти ошибку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться