реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> FatFS пофиксена
megajohn
сообщение Oct 22 2013, 14:02
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Added selection of character encoding on the file. (_STRF_ENCODE)
Added f_closedir().
Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO)
Added forced mount feature with changes of f_mount().
Improved behavior of volume auto detection.
Improved write throughput of f_puts() and f_printf().
Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write().
Fixed f_write() can be truncated when the file size is close to 4GB.
Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect error code.

http://elm-chan.org/fsw/ff/ff10.zip


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
BratherLU
сообщение Oct 24 2013, 06:23
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 103
Регистрация: 16-05-06
Пользователь №: 17 126



Спрошу здесь дабы новую тему не создавать.
Вообщем в своем приложении нужно было создать таблицу разделов на SD карте и отформатировать - посмотрел код f_fdisk().
глаз зацепился за следуюжее:
CODE

/* Set partition table */
...
p[2] = (BYTE)((b_cyl >> 2) + 1); /* Start sector */
p[3] = (BYTE)b_cyl; /* Start cylinder */
...
p[6] = (BYTE)((e_cyl >> 2) + 63); /* End sector */
p[7] = (BYTE)e_cyl; /* End cylinder */

При удачном стечении обстоятельств в p[2] (p[6]) для номера цилиндра окажутся не те значения.
Если использовать LBA - нет проблем. А если через CHS - то ...
Собственно вопрос: я придираюсь или в f_disk() есть ошибка при заполнении полей таблицы разделов?
PS: В своем коде сделал примерно так: p[6] = ((BYTE)((e_cyl >> 2)&(0xC0)) | 63);
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Oct 25 2013, 10:47
Сообщение #3


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(BratherLU @ Oct 24 2013, 10:23) *
..
CODE

p[6] = (BYTE)((e_cyl >> 2) + 63); /* End sector */

PS: В своем коде сделал примерно так:
p[6] = ((BYTE)((e_cyl >> 2)&(0xC0)) | 63);


для номера цилиндра окажутся не те значения....есть ошибка..?


не вдаваясь логику работы...
>>2 есть сдвиг в право на две позиции бит. насколько я понимаешь - старшие биты заполняются нулями.
имеем
e_cyl = xxxx xxxx
после сдвига (деление на 4)
e_cyl = 00xx xxxx
в оригинале имеем
00xx xxxx + 0011 1111 (т.е. полностью будет звучать так (Z/4 + 63)
в Вашем варианте
(00xx xxxx & 1100 0000) + 0011 1111
что после наложения маски даст
0000 0000 + 0011 1111
что является всегда константой
0011 1111 т.е. всегда(!) 63

ик?

Go to the top of the page
 
+Quote Post
BratherLU
сообщение Oct 25 2013, 13:06
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 103
Регистрация: 16-05-06
Пользователь №: 17 126



Цитата(kolobok0 @ Oct 25 2013, 14:47) *
не вдаваясь логику работы...

немного подробностей:
1) e_cyl (b_cyl) - 16 или 32-битная пременная если смотреть исходники f_fdisk()
2) Под номер цилиндра используется 10-bit
3) p[6] должна содержать в старших 2х битах -> 8,9 биты номера цилиндра, а в младших 6 битах - номер сектора
В итоге:
допустим e_cyl = 0b0000001010001100 (0x028C)
0b0000001010001100 >> 2 == 0b0000000010100011 (0x00A3)
0b0000000010100011 + 63 == 0b0000000011100010 (0x00E2)
9й бит номера цилиндра не тот, номер сектора получился тоже непонятно какой, вот и интересуюсь... sm.gif



Go to the top of the page
 
+Quote Post
mantech
сообщение Oct 27 2013, 07:40
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(BratherLU @ Oct 25 2013, 16:06) *
немного подробностей:



Нашел глючок у Чана небольшой rolleyes.gif
Делаю многодисковую систему, при монтировании диска выскакивала ошибка, если был не 0й диск.
Ошибка в неучете изменения указателя пути и имени файла. Вот пофиксенная функция f_mount:

FRESULT f_mount (
FATFS* fs, /* Pointer to the file system object (NULL:unmount)*/
const TCHAR* path, /* Logical drive number to be mounted/unmounted */
BYTE opt /* 0:Do not mount (delayed mount), 1:Mount immediately */
)
{
FATFS *cfs;
int vol;
FRESULT res;
const TCHAR* cpath; //добавил копию указателя
cpath=path; //тоже


vol = get_ldnumber(&path);
if (vol < 0) return FR_INVALID_DRIVE;
cfs = FatFs[vol]; /* Pointer to fs object */

if (cfs) {
#if _FS_LOCK
clear_lock(cfs);
#endif
#if _FS_REENTRANT /* Discard sync object of the current volume */
if (!ff_del_syncobj(cfs->sobj)) return FR_INT_ERR;
#endif
cfs->fs_type = 0; /* Clear old fs object */
}

if (fs) {
fs->fs_type = 0; /* Clear new fs object */
#if _FS_REENTRANT /* Create sync object for the new volume */
if (!ff_cre_syncobj(vol, &fs->sobj)) return FR_INT_ERR;
#endif
}
FatFs[vol] = fs; /* Register new fs object */

if (!fs || opt != 1) return FR_OK; /* Do not mount now, it will be mounted later */

res = find_volume(&fs, &cpath, 0); /* Force mounted the volume - ИСПРАВЛЕНО! */

LEAVE_FF(fs, res);
}
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Oct 27 2013, 11:52
Сообщение #6


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (mantech @ Oct 27 2013, 16:40) *
Нашел глючок у Чана небольшой rolleyes.gif

А автору сообщили? laughing.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
mantech
сообщение Oct 27 2013, 13:16
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(haker_fox @ Oct 27 2013, 14:52) *
А автору сообщили? laughing.gif


Каюсь, не силен в языках...(человеческих) laughing.gif
Go to the top of the page
 
+Quote Post
mantech
сообщение Oct 27 2013, 18:00
Сообщение #8


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Пользуясь случаем про этот модуль. Вопрос - возможны-ли одновременные операции на одном физ. диске когда 1 или 2 файла читаются, а один пишется. На разных дисках работает нормально, а вот когда на одном, иногда сносится FAT. Еслт какая-то плюшка _FS_LOCK пока детально не разбирался, описание у чана - 3 предложения, примеров не видел.
Может у кого есть что сказать?
ЗЫ. да, файловые операции происходят в одном потоке, без ртосин, прерываний и многозадачности.

Сообщение отредактировал mantech - Oct 27 2013, 18:01
Go to the top of the page
 
+Quote Post
BratherLU
сообщение Oct 29 2013, 04:19
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 103
Регистрация: 16-05-06
Пользователь №: 17 126



Цитата(mantech @ Oct 27 2013, 22:00) *
возможны-ли одновременные операции на одном физ. диске когда 1 или 2 файла читаются, а один пишется.
...
ЗЫ. да, файловые операции происходят в одном потоке, без ртосин, прерываний и многозадачности.

Делал одновременные обращения к разным файлам на запись и на чтение на одном диске - все работает (версия FatFs - R0.08b). _FS_LOCK не использовал. Все делал через очередь запросов к файловой системе (была многопоточность). Низкоуровневые дисковые операции (disk_write() disk_read() ничего не знают о файлах и FAT - они работают с секторами диска. Если все в одном потоке - проблем быть не должно и при прямом обращении к функциям fatfs, без очередей.
Go to the top of the page
 
+Quote Post
Ndf
сообщение Oct 30 2013, 09:32
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 101
Регистрация: 22-08-07
Пользователь №: 29 977



Также воспользуюсь случаем... привожу простую функцию которая укладывает проц намертво:

if ((res = f_opendir(&dirs, path)) == FR_OK){
print("Open dir ok...\n");
while (((res = f_readdir(&dirs, &finfo)) == FR_OK) && finfo.fname[0]){
print("Read dir entry...\n");
//... любой код далее приводит к перезагрузке
}
}
Взято из примеров Chana, FatFs R0.10 ©ChaN, 2013 Revision ID 80960, платформа BlackFin.
Получаем:
Open dir ok...
Read dir entry...
Exception handler:: Hardware error
Убил пол дня на поиски места падения, но терпения не хватило.. пришлось вернуться к FatFs R0.07c где все работает без проблем sad.gif
ps: Проблема решилась установкой параметра:
#define _USE_LFN 1


Сообщение отредактировал Ndf - Oct 30 2013, 18:36
Go to the top of the page
 
+Quote Post
mantech
сообщение Nov 1 2013, 07:19
Сообщение #11


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(BratherLU @ Oct 29 2013, 07:19) *
Делал одновременные обращения к разным файлам на запись и на чтение на одном диске - все работает (версия FatFs - R0.08b). _FS_LOCK не использовал.


Да, тоже заработало. Были проблемы с доступом к СД-карте(слишком быстро) и УСБ запрос некорректно отрабатывался. Теперь все пишет и читает одновременно, хоть из 5и файлов biggrin.gif
Go to the top of the page
 
+Quote Post
InsolentS
сообщение Jan 10 2014, 22:32
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897



Надеюсь, перед этим вызовом
Цитата(Ndf @ Oct 30 2013, 14:32) *
while (((res = f_readdir(&dirs, &finfo)) == FR_OK) && finfo.fname[0]){

Вы делали finfo.lfsize = 0; finfo.lfname = NULL; ?
Это такая засадная засада sm.gif


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Jun 6 2014, 10:25
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Возник такой вопрос :

Использую библиотеку FatFS совместно с операционкой freertos . В устройстве две SD карты, и разумеется возникает желание создать два независимых потока записи. Но вот беда : в fatFS перед работой с файлом требуется выбрать диск функией f_chdrive, эта функция меняет глобальную переменную CurrVol . Получается, нельзя создать два независимых потока, а нужно ждать пока в первом потоке закончится работа с диском, переключится на второй, изменить выбор диска вызвав f_chdrive , и т.д. Это глупость fatFS , или я чего-то не понимаю ?

И зачем поле
BYTE drv; /* Physical drive number */
находится в структуре FATFS которая в свою очередь находится в структуре FIL ? Т.е. если в объекте файла уже есть номер диска, то зачем нужна функция f_chdrive, которая сохраняет номер диска в какой-то глобальной переменной ? Может быть выбирать диск при помощи f_chdrive нужно только при создании файла , а дальше при работе с файлом номер диска берётся из объекта файла, и с многопотоковостью проблем не возникает ? Ну а почему тогда не сделана просто передача номера диска как параметра в функцию f_open ?

Заранее спасибо за разъяснения !


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Jun 6 2014, 18:10
Сообщение #14


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(MiklPolikov @ Jun 6 2014, 18:35) *
Возник такой вопрос :


не знаю насколько в тему...но..
вроде как есть понятие текущий путь для каждого тома свой.
и собственно путь объекта файловой системы(если задаётся явно). скорее всего отсюда ноги растут.


И встречный вопрос:
Вы говорите что юзаете больше чем одну флэш. А что за железку запускаете? Интересует камень и как оперируете CS-ами? На аппаратном уровне
или софтверном? Есть ли поддержка со стороны железа, и что является фазой переключения(если переключаете)?


Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Jun 6 2014, 19:11
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Цитата(kolobok0 @ Jun 7 2014, 02:20) *
не знаю насколько в тему...но..
вроде как есть понятие текущий путь для каждого тома свой.
и собственно путь объекта файловой системы(если задаётся явно). скорее всего отсюда ноги растут.


Ну так это всё касается локальных переменных, с которыми происходит переключение контекста. А глобальная - она физически одна.


Цитата(kolobok0 @ Jun 7 2014, 02:20) *
И встречный вопрос:
Вы говорите что юзаете больше чем одну флэш. А что за железку запускаете? Интересует камень и как оперируете CS-ами? На аппаратном уровне
или софтверном? Есть ли поддержка со стороны железа, и что является фазой переключения(если переключаете)?


STM32L151RDT6 . У него хватает SPI что бы развесить флэшки. CS просто ногой. Т.е. для каждой флэшки независимый SPI


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 14th July 2025 - 06:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01494 секунд с 7
ELECTRONIX ©2004-2016