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

 
 
6 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> stm32f4 + Chan's FatFS, работа с большими SD картами
klen
сообщение Aug 1 2018, 20:40
Сообщение #1


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Здравсвуйте!
с флехами размером 4 гигабайта работает все хорошою с большими 16/32 и тд начинаются глюки.
при отладке выловил в функции clst2sect что индекс сектора становится выше диапазона и FatFS вываливается с ошибкой FR_INT_ERR
это я что то не так делаю или это не только у меня?
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 1 2018, 20:52
Сообщение #2


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

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



кэши, выравнивание... Все там работает. Версию поновее.
проверял до 64 гиг
Go to the top of the page
 
+Quote Post
Integro
сообщение Aug 2 2018, 08:04
Сообщение #3


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

Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460



Поддерживаю, работал с одной из последних версий, с 16 и 32 проблем нет! Помимо рекомендаций из предыдущего поста стоит также посмотреть на нижний слой, интерфейс карты и проверить адресацию для High Capacity
Go to the top of the page
 
+Quote Post
klen
сообщение Aug 3 2018, 07:27
Сообщение #4


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



спасибо!
вроде заработало.
тестировался на шести 2ГБ файлах на 16ГБ SanDISC uSD, читал начало и конец файла.
использую крайний FatFS
свой самописный драйвер (SDIO+DMA)->SDCARD

как было сказано нужно обращать внимание на адресацию. в моем коде был косяг с умножением индекса блока на размер блока (512), до тех пор пока 32 бит хватало - работает, если файл лежал далеко за 2 ГБ все естественно читалось и писалось в неправильные блоки.

еще нужно обратить внимание, что если не включать опцию FF_USE_EXFAT тип аргумента f_lseek - uint32_t и по большому файлу не полазишm даже если он есть. если FF_FS_EXFAT=1 то указатель позиции uint64_t
ff.h:
Код
...
/* Type of file size variables */

#if FF_FS_EXFAT
typedef QWORD FSIZE_t;
#else
typedef DWORD FSIZE_t;
#endif
...


настоятельно рекомендую использовать фичу FF_USE_FASTSEEK=1, без карты индексов FatFS итерациями в цикле индексы блокв индексирует. на маленьких файлах это не заметно. на больших все замедляется.
http://elm-chan.org/fsw/ff/doc/lseek.html
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 3 2018, 07:36
Сообщение #5


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

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



Вот мой конфиг, служит хорошо. За FF_USE_FASTSEEK спасибо, при формировании wav файлов это полезно.

Сообщение отредактировал Genadi Zawidowski - Aug 3 2018, 07:44
Прикрепленные файлы
Прикрепленный файл  ffconf.rar ( 4.09 килобайт ) Кол-во скачиваний: 10
 
Go to the top of the page
 
+Quote Post
klen
сообщение Aug 26 2018, 15:38
Сообщение #6


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



здравcтуйте.
с помощью такой то матери дописал sdio->sdcard драйвер ( взамен НАL и libopencm3, т.к. использую свой самодельный SDK)
попробывал выжать скорость чтения/запись. блоки читаются через DMA до максимального размера позволяющего эти модулем - 256к.
stm32f405rgt6 168MHz
шина sdio модуля включена на максимальноую скорость - делитель клока = 0
при записи на карту источником является флеш (т.е делается дамп прошивки и кладется на карту с последующей проверкой на большой машине правильности работы записи)
с чтением посложнее - нет линейного куска памяти на запись размером 1M поэтому максимальый блок 96k - то что в своей тестовой програмке удалось отжать от системного стека, кучи и статических переменных
карта Кингстон 16G class 10 UHS1
Цитата
RAW WRITE 1M by 256.000k: 9.256 Mbyte/s 0.108s total
RAW WRITE 1M by 128.000k: 8.845 Mbyte/s 0.113s total
RAW WRITE 1M by 64.000k: 8.125 Mbyte/s 0.123s total
RAW WRITE 1M by 48.000k: 7.836 Mbyte/s 0.127s total
RAW WRITE 1M by 32.000k: 6.987 Mbyte/s 0.143s total
RAW WRITE 1M by 16.000k: 4.285 Mbyte/s 0.233s total
RAW WRITE 1M by 8.000k: 3.430 Mbyte/s 0.291s total
RAW WRITE 1M by 4.000k: 1.727 Mbyte/s 0.578s total
RAW WRITE 1M by 2.000k: 1.025 Mbyte/s 0.975s total
RAW WRITE 1M by 1.000k: 0.515 Mbyte/s 1.938s total
RAW WRITE 1M by 0.500k: 0.273 Mbyte/s 3.662s total

чтение
Цитата
RAW READ 1M by 96.000k: 11.067 Mbyte/s 0.090s total
RAW READ 1M by 64.000k: 10.107 Mbyte/s 0.098s total
RAW READ 1M by 48.000k: 10.023 Mbyte/s 0.099s total
RAW READ 1M by 32.000k: 9.391 Mbyte/s 0.106s total
RAW READ 1M by 24.000k: 9.355 Mbyte/s 0.106s total
RAW READ 1M by 16.000k: 2.604 Mbyte/s 0.384s total
RAW READ 1M by 8.000k: 6.965 Mbyte/s 0.143s total
RAW READ 1M by 4.000k: 5.379 Mbyte/s 0.185s total
RAW READ 1M by 2.000k: 3.523 Mbyte/s 0.283s total
RAW READ 1M by 1.000k: 1.773 Mbyte/s 0.563s total
RAW READ 1M by 0.500k: 1.295 Mbyte/s 0.771s total


SAMSUN 32G EVO Plus UHS1
Цитата
RAW WRITE 1M by 256.000k: 10.171 Mbyte/s 0.098s total
RAW WRITE 1M by 128.000k: 10.083 Mbyte/s 0.099s total
RAW WRITE 1M by 64.000k: 8.279 Mbyte/s 0.120s total
RAW WRITE 1M by 48.000k: 8.410 Mbyte/s 0.118s total
RAW WRITE 1M by 32.000k: 7.952 Mbyte/s 0.125s total
RAW WRITE 1M by 24.000k: 6.836 Mbyte/s 0.146s total
RAW WRITE 1M by 16.000k: 7.396 Mbyte/s 0.135s total
RAW WRITE 1M by 8.000k: 5.311 Mbyte/s 0.188s total
RAW WRITE 1M by 4.000k: 3.837 Mbyte/s 0.260s total
RAW WRITE 1M by 2.000k: 1.875 Mbyte/s 0.533s total
RAW WRITE 1M by 1.000k: 0.952 Mbyte/s 1.049s total
RAW WRITE 1M by 0.500k: 0.486 Mbyte/s 2.057s total


Цитата
RAW READ 1M by 96.000k: 10.830 Mbyte/s 0.092s total
RAW READ 1M by 64.000k: 10.054 Mbyte/s 0.099s total
RAW READ 1M by 48.000k: 9.697 Mbyte/s 0.103s total
RAW READ 1M by 32.000k: 8.490 Mbyte/s 0.117s total
RAW READ 1M by 24.000k: 8.581 Mbyte/s 0.116s total
RAW READ 1M by 16.000k: 8.955 Mbyte/s 0.111s total
RAW READ 1M by 8.000k: 6.206 Mbyte/s 0.161s total
RAW READ 1M by 4.000k: 5.819 Mbyte/s 0.171s total
RAW READ 1M by 2.000k: 3.707 Mbyte/s 0.269s total
RAW READ 1M by 1.000k: 1.809 Mbyte/s 0.552s total
RAW READ 1M by 0.500k: 1.720 Mbyte/s 0.581s total


какой то noname промаркированный class 4
Цитата
RAW WRITE 1M by 256.000k: 10.173 Mbyte/s 0.098s total
RAW WRITE 1M by 128.000k: 10.063 Mbyte/s 0.099s total
RAW WRITE 1M by 64.000k: 8.218 Mbyte/s 0.121s total
RAW WRITE 1M by 48.000k: 8.081 Mbyte/s 0.123s total
RAW WRITE 1M by 32.000k: 8.082 Mbyte/s 0.123s total
RAW WRITE 1M by 16.000k: 8.192 Mbyte/s 0.122s total
RAW WRITE 1M by 8.000k: 6.135 Mbyte/s 0.162s total
RAW WRITE 1M by 4.000k: 3.267 Mbyte/s 0.306s total
RAW WRITE 1M by 2.000k: 1.896 Mbyte/s 0.527s total
RAW WRITE 1M by 1.000k: 0.953 Mbyte/s 1.048s total
RAW WRITE 1M by 0.500k: 0.486 Mbyte/s 2.056s total


Цитата
RAW READ 1M by 96.000k: 10.830 Mbyte/s 0.092s total
RAW READ 1M by 64.000k: 9.985 Mbyte/s 0.100s total
RAW READ 1M by 32.000k: 9.767 Mbyte/s 0.102s total
RAW READ 1M by 16.000k: 9.243 Mbyte/s 0.108s total
RAW READ 1M by 8.000k: 8.047 Mbyte/s 0.124s total
RAW READ 1M by 4.000k: 6.397 Mbyte/s 0.156s total
RAW READ 1M by 2.000k: 4.469 Mbyte/s 0.223s total
RAW READ 1M by 1.000k: 2.473 Mbyte/s 0.404s total
RAW READ 1M by 0.500k: 1.810 Mbyte/s 0.552s total


выводы которые я сделал пока карячился с написанием драйвера.
а) нужно обрабатывать все сотояния SDIO модуля и статусы SD карты, иначе можно залететь в куданибудь и зависнуть. SDIO стейт-машина ...
б) как Вы видте при чтении и записи большими кусками все упирается в SDIO модуль - сорт карты не влияет на пиковую скорость, разница возникает толькана маленьких, но тут както нужно отделять время кода драйвера.
с) FatFS дробит запросы на чтение и запись кратным 32 блокам(32*512 = 16k) поэтому она тоже ограничивает скорость (это согласовалось с результатами сырых измерений скорости довольно точно соответсвует 16к - тоесть FatFS выдал при линейной записи порядка 7-8Mb/s, а запись 6-7Mb/s)
тут также нужно сказать что код самого FatFS при длинных линейных операциях практически не влият на скорость - что хорошо ( но на вид код у Чана - сплjшные макароны.... у нас за такое убили бы, закопали и табличку написалиsm.gif)
д) FatFS можно поковырять на предмет увеличения батча записи/чтения более 32 блоков - вплоть до 512 ( 256k - то на что способна DMA со своим гребанным 16-битным NDTR недосчетчиком)
е) кому надо наипобыстрей - писать руками в сектора без файловых систем - 10Mb/s как бы реальность.
ё) провел "грязные игры с клоком" - клок шинного интерфейс sdio модуля тот же что и usb (48MHz) в доке написано что можно до 50.. попробывал потихоньку гнать множителем rcc.q - результат - скорость обмена пропорционально увеличилась, работает свплоть до множителя rcc.q=5 , при таком множетеле и раскачегаренном системном клоке в 240МГц скорость обмена на чтение достигла 20Мb/s, на запись ~15Mb/s. тут еще флешка наверно должна быть хорошей чтобы проканало как у меня.

... теперь будем плавно пробовать прикручивать eMMC микросхему - жизнь показала что sd-сокеты это для "бытовой" аппрптуры, разваливается и не контачит...
Go to the top of the page
 
+Quote Post
mantech
сообщение Aug 27 2018, 08:00
Сообщение #7


Гуру
******

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



Цитата(klen @ Aug 26 2018, 18:38) *
... теперь будем плавно пробовать прикручивать eMMC микросхему - жизнь показала что sd-сокеты это для "бытовой" аппрптуры, разваливается и не контачит...


Ну не знаю... Все зависит от кривизны рук оператора, и чего он там засовывает(в смысле, чистая карточка или вся измазана в пыли и грязи) За 5и летний срок использования карточек и холдеров проблемы были только в этом.
А вот пайка этих ммэсин, с шагом шаров 0.5мм, причем сгруппированных в один маленький квадрат может привести к боольшим проблемам laughing.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 27 2018, 08:25
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(mantech @ Aug 27 2018, 11:00) *
А вот пайка этих ммэсин, с шагом шаров 0.5мм, причем сгруппированных в один маленький квадрат может привести к боольшим проблемам laughing.gif

Если производство нормальное и платы качественные, то никаких проблем нет.
А вот с SD... ставим массово DM3C от Hirose - в плане механической прочности просто отвратительная дрянь sm.gif
Go to the top of the page
 
+Quote Post
klen
сообщение Aug 27 2018, 09:06
Сообщение #9


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



дело в том что платы летают+вибрируют, и иногда с сильно ударяются об земную поверхность. опыт показал что sd-сокет на стационарных приборах допустим, а на перемещающейся в пространстве нет. на вибростенде проверяли - нарушение электрического контакта при вибрации. к тому же все надо покрыть лаком - и что? сокет проливать ? еще качество у сокетов от партии к партии разное....
я сам не видел, но коллеги говорят что часто встречают тупо припаянные sd-карты к платам без сокетов в девайсах подобного толка.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Aug 27 2018, 12:36
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(klen @ Aug 27 2018, 12:06) *
я сам не видел, но коллеги говорят что часто встречают тупо припаянные sd-карты к платам без сокетов в девайсах подобного толка.

Изи же.
Go to the top of the page
 
+Quote Post
Grape
сообщение Aug 27 2018, 13:19
Сообщение #11


Участник
*

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



Цитата(klen @ Aug 3 2018, 10:27) *
...
еще нужно обратить внимание, что если не включать опцию FF_USE_EXFAT тип аргумента f_lseek - uint32_t и по большому файлу не полазишm даже если он есть. если FF_FS_EXFAT=1 то указатель позиции uint64_t


а в fat32 может быть файл размером больше UINT32_MAX?


Цитата(klen @ Aug 3 2018, 10:27) *
...
как было сказано нужно обращать внимание на адресацию. в моем коде был косяг с умножением индекса блока на размер блока (512), до тех пор пока 32 бит хватало - работает, если файл лежал далеко за 2 ГБ все естественно читалось и писалось в неправильные блоки.


32 бит должно хватать для адресации карт до 2Tb включительно.
Умножение требуется для карт SDSC (max 2Gb), там байтная адресация.


4.3.14 Command Functional Difference in Card Capacity Types
CCS in the response of ACMD41 determines card capacity types: CCS=0 is SDSC and CCS=1 is SDHC or SDXC.
Memory access commands include block read commands (CMD17, CMD18), block write commands
(CMD24, CMD25), and block erase commands (CMD32, CMD33).
Following are the functional differences of memory access commands between SDSC and SDHC, SDXC:

Command Argument
SDHC and SDXC use the 32-bit argument of memory access commands as block address
format. Block length is fixed to 512 bytes regardless CMD16,

SDSC uses the 32-bit argument of memory access commands as byte address format. Block
length is determined by CMD16,
i.e.:
(a) Argument 0001h is byte address 0001h in the SDSC and 0001h block in SDHC and SDXC
(cool.gif Argument 0200h is byte address 0200h in the SDSC and 0200h block in SDHC and SDXC
Go to the top of the page
 
+Quote Post
Obam
сообщение Aug 27 2018, 15:50
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(Arlleex @ Aug 27 2018, 15:36) *
Изи же.

Ну, если проволочным хомутиком по слову "Taiwan" прихватить для устранения эффекта "консоли", то... может быть и проканает wink.gif


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Aug 27 2018, 15:57
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(Obam @ Aug 27 2018, 18:50) *
Ну, если проволочным хомутиком по слову "Taiwan" прихватить для устранения эффекта "консоли", то... может быть и проканает wink.gif

Да держится прекрасно laughing.gif И тряску прошла...
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Aug 31 2018, 01:42
Сообщение #14


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

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



Тоже недавно сделал свой драйвер для SD. Правда для шины SPI. И вот вопрос: в примерах от Чана мультисекторная запись реализована CMD25. Интересно, а есть гарантия, что ФС при записи нескольких секторов подряд запишет именно последоватлеьные сектора. Например, нужно записать 3 сектора. ФС должна записать 128, 129, 130. А не 129, 150, 130.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
AlanDrakes
сообщение Aug 31 2018, 08:55
Сообщение #15


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

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



Гарантия есть. Она в самой команде CMD25, которая пишет сектора последовательно, не получая номеров в процессе выполнения.
Для её окончания даже есть команда CMD12 - STOP_TRANSMISSION.

Документ SD Phisical Layer Specification так же говорит:
CMD25: [Address (PTP) data transfer command]
Args: [31..0] - Data Address
Continuously writes blocks of data until a STOP_TRANSMISSION follows. Block length is specified the same as WRITE_BLOCK command.

Переводим.
"Последовательно пишет блоки данных до получения команды STOP_TRANSMISSION. Длина блока определяется аналогично команде CMD24 - WRITE_BLOCK" Для карт высокой ёмкости длина блока ВСЕГДА равна 512 (размеру сектора). Для карт обычной ёмкости её можно задавать командой CMD16 - SET_BLOCK_LEN
Go to the top of the page
 
+Quote Post

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

 


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


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