|
|
  |
Вопрос по FatFs от мистера ChaN'а |
|
|
|
Nov 23 2007, 09:59
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 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)
|
|
|
|
|
Nov 23 2007, 16:49
|

Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 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-файле что со стеком всё впорядке. Подскажите пожайлуста.
|
|
|
|
|
Nov 24 2007, 06:27
|

Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 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, пожайлуста.
|
|
|
|
|
Nov 24 2007, 07:51
|

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

|
Цитата(kanzler @ Nov 24 2007, 08:27)  Посмотрев код я не нашёл в функциях... Расстроили очень  Читаем: Цитата Так и пытаюсь произвести чтение директории с помощью 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, ну и ручками при желании.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 24 2007, 08:15
|

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

|
Цитата(zltigo @ Nov 24 2007, 12:51)  Расстроили очень  Читаем: Для начала 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. Как быть в этом случае?
|
|
|
|
|
Nov 24 2007, 08:29
|

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

|
Цитата(Сергей Борщ @ Nov 24 2007, 13:22)  А вот как раз f_mount() и должен был заранее прописать в FatFs[drv] адрес вашей структуры FATFS из первого вопроса. Спасибо за разъяснения, значить где то у меня изначально было неправильно сделанно, буду искать где. Вопрос: Структура FatFs[drv] описана как массив. Я же в начале описываю свою структуру таким образом FATFS fatfs; это может повлиять на то что у меня не заполняется fatfs. Может быть мне нужно было сделать как в примере FATFS fatfs[2]?
|
|
|
|
|
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. Помогите найти ошибку.
|
|
|
|
|
Mar 23 2009, 08:29
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
В симуляторе проверил fprintf , только убрал обращения к объекту file. Получилось следующее: в пустой функции main() вызываю Код const char format[] = "%u/%u/%u %u:%u:%u"; testfprintf(format, 1, 2, 3, 4, 5, 6); так выводит все числа. А вот если Код const char format[] = "%u/%u/%u %u:%u:%u"; testfprintf(format, 1, 22, 333, 4444, 55555, 6666); то на последнем аргументе (6666) va_arg() возвращает 0, и соответственно, выводит только 5 аргументов. Видимо, это та проблема, которая описана в patches.
|
|
|
|
|
Mar 23 2009, 08:42
|

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

|
Цитата(alux @ Mar 23 2009, 10:29)  Видимо, это та проблема, которая описана в patches. Откуда "видимо"? Аргументируйте. В описании патчей написано: Цитата will cause an incorrect behavior on the big-endian processor С каких пор AVR под IARом стал big-endian?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 23 2009, 09:21
|

Знающий
   
Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206

|
Цитата(Сергей Борщ @ Mar 23 2009, 14:42)  Откуда "видимо"? Аргументируйте. В описании патчей написано:С каких пор AVR под IARом стал big-endian? Да, там действительно упоминается по то, что эта ошибка возникает для big-endian. Но, я привык отвечать на вопросы в том объеме, в котором они заданы  В исходном вопросе я нигде не увидел упоминание о типе процессора. И хотя я понимаю, что "вероятностно" это проц. с маленькими индейцами, тем не менее формально рекомендация верна  . А дальше уже дело автора разбираться со своими индейцами (в данном конкртеном случае) или искать причину в другом.
--------------------
Пасу котов...
|
|
|
|
|
Mar 25 2009, 08:52
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Цитата(alux @ Mar 23 2009, 11:29)  В симуляторе проверил fprintf , только убрал обращения к объекту file. Получилось следующее: в пустой функции main() вызываю Код const char format[] = "%u/%u/%u %u:%u:%u"; testfprintf(format, 1, 2, 3, 4, 5, 6); так выводит все числа. А вот если Код const char format[] = "%u/%u/%u %u:%u:%u"; testfprintf(format, 1, 22, 333, 4444, 55555, 6666); то на последнем аргументе (6666) va_arg() возвращает 0, и соответственно, выводит только 5 аргументов. Видимо, это та проблема, которая описана в patches. 6666 это уже 32-битное число. Соответственно, надо const char format[] = "%u/%u/%u %u:%u:% lu";
Сообщение отредактировал Genadi Zawidowski - Mar 25 2009, 09:02
|
|
|
|
|
Mar 31 2009, 12:11
|
Частый гость
 
Группа: Свой
Сообщений: 80
Регистрация: 23-07-07
Из: Украина, г. Сумы
Пользователь №: 29 306

|
Скажите, если я пишу отак: Цитата FATFS fs; FIL fdst; FRESULT res; f_mount(0, &fs); res = f_open(&fdst, "test.dat", FA_CREATE_ALWAYS | FA_WRITE); fprintf(&fdst, "%s", "This is a test"); f_close(&fdst); f_mount(0, NULL); файловая система сама ищет свободные кластера и туда это всё дело записывает?? Нужно лишь беспокоиться о свободном месте на флешке??? или нет?
|
|
|
|
|
Apr 1 2009, 17:02
|
Участник

Группа: Участник
Сообщений: 61
Регистрация: 16-02-06
Пользователь №: 14 375

|
Цитата(Сергей Борщ @ Nov 23 2007, 12:59)  Как что? Не прочитали документацию. Хотя бы на f_mount:Можно было еще заглянуть в исходники, и увидеть, что f_mount только сохраняет адрес этой структуры во внутренней переменной. А заполнение произойдет потом, когда попытаетесь призвести какое-нибудь действие с файлом/директорией. Заинтересовался этим вопросом тоже. avr и flash. Можете, если у вас есть наработки поделиться ими. Буду очень благодарен. здравствуйте. заинтересовался этим вопросом тоже. о пока я не очень представляю механизм написания программы чтения и записи данных в flash. если не трудно, могете поделиться исходниками по работе с fat32 для avr. буду очень благодарен. kostiapan@mail.ru
|
|
|
|
|
Apr 4 2009, 15:28
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 15-11-04
Пользователь №: 1 137

|
Обновилась FatFS R0.07 Цитата R0.07, Apr 01, 2009 Merged Tiny-FatFs as a buffer configuration option. Added long file name support. Added multiple code page support. Added re-entrancy for multitask operation. Added auto cluster size selection to f_mkfs(). Added rewind option to f_readdir(). Changed result code of critical errors. Renamed string functions to avoid name collision.
|
|
|
|
|
Jun 30 2009, 07:22
|
Группа: Новичок
Сообщений: 4
Регистрация: 7-08-08
Из: Краснодар
Пользователь №: 39 472

|
[quote name='kanzler' date='Nov 23 2007, 20:49' post='328189'] Читал, но мой англицкий оставляет желать лучшего. Так и пытаюсь произвести чтение директории с помощью f_readdir, возвращает - FR_NO_FILESYSTEM, хотя флешка перед тем была отформатированна FAT16 и записан файл.
В этом нет проблемы драйвер был прикручен и он работает без сбое
Была такая же проблема: все функции в diskio.cpp корректно работали (тестил каждую после портирования на MSP430), но после успешного монтирования (FR_OK) функцией f_mount при попытки открыть фаил f_open возвращал - FR_NO_FILESYSTEM. Проблема была устранена путем коммента функции disk_initialize перед f_mount, которую вызывал для проверки ее же работоспособности. Наверное дело в том, что мой проект не поддерживает снятия питания с карты, и при повторной внутренней инициализации в f_open, происходила ошибка.
P.S. FatFs 007, IAR 4.10, MSP430
|
|
|
|
|
Aug 16 2009, 15:42
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 26-06-09
Пользователь №: 50 675

|
У меня вопрос новичка к вам. Если с помощью FATFs записывать файлы на флешку а потом подключить к компьютеру. То как она определиться по виндой? Как FAT16?
Заранее спасибо за ответ.
|
|
|
|
|
Aug 16 2009, 15:55
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 26-06-09
Пользователь №: 50 675

|
Я имею ввиду, у меня есть голая флешка, отформатированная. Я на ней создаю файловую систему под средством FATFs, записываю несколько файликов и так далее... Потом подключаю её к компу, она определиться в винде или нет? И если да то как?
|
|
|
|
|
Aug 16 2009, 18:01
|

Частый гость
 
Группа: Свой
Сообщений: 133
Регистрация: 30-04-07
Из: DP.UA
Пользователь №: 27 419

|
Цитата(piz2383 @ Aug 16 2009, 18:55)  Я имею ввиду, у меня есть голая флешка, отформатированная. Я на ней создаю файловую систему под средством FATFs, записываю несколько файликов и так далее... Потом подключаю её к компу, она определиться в винде или нет? И если да то как? Флешки "голыми" не выпускаются. От изготовителя они приходят уже отформатированными (как правило в FAT16), Форматирование необходимо только в случае "слета" файловой системы (да и то, если на карточке есть нужная информация, то ее нужно перед фоматированием извлечь, а это, как правило, делается с помощью ПК, там же обычно она и форматируется) или в каких либо особых случаях. Если все же нужно форматирование, то, вообще говоря, файловая система выбирается исходя из обьема носителя. Но в случае с обычными современными карточками памяти выбор невелик - ФАТ12 никак не подойдет, а ФАТ32 пока нет смысла(хотя возможность есть).
|
|
|
|
|
Aug 17 2009, 13:09
|
Участник

Группа: Свой
Сообщений: 69
Регистрация: 22-10-04
Пользователь №: 956

|
Цитата(VDLab @ Aug 16 2009, 22:01)  Если все же нужно форматирование, то, вообще говоря, файловая система выбирается исходя из обьема носителя. Но в случае с обычными современными карточками памяти выбор невелик - ФАТ12 никак не подойдет, а ФАТ32 пока нет смысла(хотя возможность есть). на карточку 8Gb и больше FAT16 будет затруднительно прикрутить... не разбивая на разделы так что FAT32 вполне востребована. /Gr
|
|
|
|
|
Sep 21 2009, 11:23
|
Группа: Участник
Сообщений: 7
Регистрация: 25-08-09
Пользователь №: 52 038

|
Цитата(VDLab @ Aug 16 2009, 18:47)  Если ее не форматировать средствами fatfs, то какая была до записи файлов, такая и останется. Извиняюсь за очень легкий вопрос, но никак не могу разобратся. А как форматировать накопитель средствами fatfs?
|
|
|
|
|
Nov 19 2009, 07:17
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 8-05-08
Пользователь №: 37 363

|
Не смог пока разобраться с такой проблемой. Есть реализация данной библиотеки на SDC, в контроллере зашита программка как в демке от автора FatFs для общения с контроллером через терминалку. Всё работает отлично, кроме русских букв в именах файлов.
Проблема состоит из двух частей: 1) Если создать файл с русскими буквами в имени средствами Windows, то при чтении директории через терминалку, буквы отображаются "закорючками". 2) Если то же самое сделать средствами контроллера из терминалки и прочитать директорию на компе под Windows, то эти имена вообще не воспринимаются системой (потом с этими файлами ничего не сделать - ругается на недопустимые символы).
Длинные имена отображаются как положено и с русскими буквами
Кодовая страница в настройках FatFs установлена 1251 (пробовал и 866 - при создании файла прога виснет). Смотрел на реализацию функции get_fileinfo(), там при выдаче имени файла перекодировок не происходит. В функции create_name() используется табличка соответствующая.
если по проблеме 2 еще можно грешить на то, что японец не верно построил перекодировку, то по 1-й вообще неясно...
Кто, что скажет?
Сообщение отредактировал Арк К - Nov 19 2009, 07:31
|
|
|
|
|
Nov 19 2009, 08:32
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 8-05-08
Пользователь №: 37 363

|
Очень похоже на то, что Windows для коротких имён использует CP866, а Элм это не учёл...
|
|
|
|
|
Nov 19 2009, 09:24
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Арк К @ Nov 19 2009, 12:17)  Кто, что скажет? Надо задать Код #define _CODE_PAGE 866 , и в терминалке выставить шрифт TERMINAL, тоже в DOS-кодировке.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Nov 19 2009, 12:22
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 8-05-08
Пользователь №: 37 363

|
Цитата(AHTOXA @ Nov 19 2009, 12:24)  Надо задать Код #define _CODE_PAGE 866 , и в терминалке выставить шрифт TERMINAL, тоже в DOS-кодировке. Да, действительно, так работает. осталось только перекодировку клавиш как-то осуществить - в моих терминалках этого нет (terminal v1.9 by Br@y++, в ZOC как-то коряво), но в целом проблема ясна: У русских, как всегда, особенный путь  : короткие имена Windows хранит в 866-й кодировке, длинные - в 1251-й, путаница ещё та.
|
|
|
|
|
Nov 19 2009, 19:11
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 8-05-08
Пользователь №: 37 363

|
Цитата(zltigo @ Nov 19 2009, 15:30)  Да ну? Согласен, у подавляющего большинства мыслей становится всё меньше и меньше...  Лично мне не удалось нормально настроить этот самый ZOC и больше на это время тратить не буду. Что касается локализации файловой системы, то дело это оказалось нетривиальным и ресурсоемким - всё зависит от конкретной задачи. Просто я хотел бы узнать как другие решали эти проблемы в своих разработках.
|
|
|
|
|
Mar 5 2017, 20:53
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Вопрос по Petit FatFs.
Для отладки использую Proteus VSM 8.4 с виртуальной CD/MMC картой. На карте есть единственный файл 7 с хвостиком килобайт, к которому осуществляется доступ в разные произвольные места. Поначалу все работает: файл открывается, из него читаются данные (все верно читается), функция pf_lseek отрабатывает разные смещения. Но потом по неизвестным причинам pf_lseek начинает выдавать ошибку FR_DISK_ERR, и все, разумеется, перестает работать.
При пошаговой отладке добрался до функции send_cmd(CMD17, sector), которая и вызывает эту ошибку. В начале эта функция вызывается многократно успешно, а ошибку возвращает, если sector == 512 (просто обратил внимание, не факт, что именно это значение играет роль).
Что-то никак не могу понять, куда копать... подскажите, пожалуйста, если не сложно...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Mar 10 2017, 14:39
|

Частый гость
 
Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474

|
А в железе пробовали отлаживать? Симулятор, конечно, хорошо, но не всегда помогает разобраться в причинах. Так же, можете добавить в обработчике ошибок (кстати, у себя в коде не нашёл такового - похоже, функции писались с бодуна, но работают почти без сбоев) сделать вывод ответа карты - так проще разобраться в ошибках. На ARM - такое крайне желательно. Предполагаю, что используете SPI?
|
|
|
|
|
Mar 17 2017, 15:24
|

Частый гость
 
Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474

|
Обработчики функций библиотеки дописывали сами? Попробую привести пример своих, может поможет чем. Сразу поясню: сталкивался с какими-то весёлыми косяками при работе с несколькими картами (всеми имевшимися на тот момент в наличии), код привёл к тому виду, в котором он сейчас. На тот момент всё работало стабильно, читалось, писалось. Попробуйте, может и заработает. CODE DRESULT disk_read ( uint8_t pdrv, /* Physical drive nmuber to identify the drive */ uint8_t *buff, /* Data buffer to store read data */ DWORD sector, /* Sector address in LBA */ UINT count /* Number of sectors to read */ ) { <...> //case MMC : //// translate the arguments here
//result = MMC_disk_read(buff, sector, count); result = 0; if (count == 1) { result = SPI_SD_READ_SECTOR_buf(sector, m_buf); } else { while (count>0) { result = SPI_SD_READ_SECTOR_buf(sector, m_buf); count--; sector++; }; }; return result; <...>
uint8_t SPI_SD_READ_SECTOR_buf(uint32_t Sector, uint8_t* buff) { uint16_t i; uint32_t calc_Addr; SPI_Select_CARD(); if (!(sd_raw_card_type & (1 << SD_RAW_SPEC_SDHC))) // Если карта НЕ является SDHC - добавляем 9 бит к адресу. { // !SDHC calc_Addr = ((Sector+249) << 9); // DaFaq?! But will not work in other case. } else { // SDHC calc_Addr = (Sector+2048); // And one more DAFAQ! }; i = SPI_SD_SendCMD(CMD_READ_SINGLE_BLOCK, calc_Addr); // Передаём вычисленный адрес карте card_answ_at_read = i; // DEBUUUUUG! if(i) { SPI_UnSelect_CARD(); // Отпускаем карту return R_ERR; // Возвращаем ошибку. =( }; while (SPI_Rd_Byte() != 0xFE); // Ждём начала блока. Чаще всего до 30-40 итераций. for (i=0; i<512; i++) // Читаем байт и заносим его в буфер (512 байт) { *buff = SPI_Rd_Byte(); buff++; }; SPI_Rd_Byte(); // CRC SPI_Rd_Byte(); // CRC (2) // IGNORED T_T /* deaddress card */ SPI_UnSelect_CARD(); // Отпускаем карту (шину) SPI_Rd_Byte(); // Тактирование. return R_OK; };
ЗЫ: Обратите внимание на комментарии около странных переводов значений секторов. Особенно, +249
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|