здрав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шные макароны.... у нас за такое убили бы, закопали и табличку написали

)
д) 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-сокеты это для "бытовой" аппрптуры, разваливается и не контачит...