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

 
 
> 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
 
Start new topic
Ответов
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



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

 


RSS Текстовая версия Сейчас: 8th August 2025 - 03:56
Рейтинг@Mail.ru


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