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

 
 
> 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



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 01:09
Рейтинг@Mail.ru


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