|
STM32F4 + FatFS + uSD, проблема со скоростью. |
|
|
|
Sep 3 2012, 13:03
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Нужна помощь клуба. Процессор STM32F407VG, 168МГц. Использую SDIO 4 бита на 24Мгц. DMA. Запись/чтение через SD_ReadMultiBlocks/SD_WriteMultiBlocks. На всех сигналах SDIO пуллапы 10к. проверочный код: Код SDInitResult=SD_Init(); if(SDInitResult==SD_OK) LEDOn(LED1); else LEDOn(LED2);
if(SDInitResult==SD_OK){ if ( f_mount( 1, &MSD_fatfs ) != FR_OK ){ LEDOn(LED2); // fatfs initialisation fails }else{ res = f_open(&myfile, "1:test_sd.dat", FA_CREATE_ALWAYS | FA_WRITE);
for(i=0; i<3000;i++){ res=f_write(&myfile, buffer,4096, &bw); }
f_close(&myfile); f_mount(1, NULL); if(res==0) LEDOn(LED2); else LEDOn(LED1); } } Итого, записывается 3тыс блоков по 4096 байт, засекаю секундомером. На флешке PQI 1Gb (FAT) - 36 секунд, получается 340кБайт/сек или 2.7мбит/с На Кингстон 4Gb (FAT32) - 60с, т.е. 200 кБайт/сек, или 1.6мбит/с. Дополнение - при изменении блока с 4к на 16к, на 4гб фат32 флешке те-эе 60 сек., а на 1гб фат16 уменшилось до 12 сек, т.е. 1МБайт/с или 8 МБит/с. У кого какие результаты получались? Я честно говоря, ожидал скорости побольше (хотя для конкретной задачи мне ее хватит. И попутно другой вопрос - я первый раз с FatFs работаю, функия f_write начинается и ждет пока не закончиться запись блока. Т.е оно блокирует на время записи всю программу и не очень понятно зачем тогда DMA? Это можно как-то обойти без OS ?
|
|
|
|
|
 |
Ответов
(1 - 14)
|
Sep 3 2012, 14:15
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Lotor @ Sep 3 2012, 16:01)  На счет скорости тут на форуме много тем вердикт которых - надо буферизировать и писать большими кусками сразу Насколько "большими" ? Цитата . Надеюсь Вы предусмотрели внешнюю память для этих целей (SDRAM например). Нет, внешней памяти там нет, но буфер до 64к могу выделить. Мне вот еще что непонятно: 1) Почему 1гб флешка почти вдвое быстрее чем 4гб - потому что ФАТ 16 а не ФАТ32? 2) Я писал блокми по 4К, это как раз размер кластера для 4гб флешки. Когда я попробовал писать блоками по 16К - скорость на 1гб флешке увеличилась почти втрое! Достигнув примерно 1МБайт/сек. И это понятно, потому что у нее кластер 16к. А вот для 4гб флешки скорость не изменилась, и это тоже понятно - потому что блок кратен и больше кластера. Но получается, что 1гб флешка с фат16 уже не вдвое а примерно в 5 раз быстрее чем 5гб флешка с фат32! И этого я совершенно не могу понять - обьем передаваемых по DMA данных одинаков, и уж намного больше чем обьем данных таблиц фат. Неужели 32-х разрядный 168МГц процессор не просто во много раз медленее работает с фат32 чем с фат16, а настолько, что это становиться более значимым чем обьем передаваемых данных?! Цитата На счет блокирующей записи - именно из-за неё мне пришлось спешно прикручивать ртос в своё время. Конечно можно выкрутится и без неё, но имхо самое простое решение. В итоге мой девайс пишет видео со скоростью 5 МБайт/с. Нихренассе! У меня максимум 1МБайт/с пока получается, на 1гб флешке с ФАТ16, при блоке равном кластеру (16К). При том, что проц сейчас вообще больше ничего не делает (кроме SysTick прерывания, но там почти ничего нет кроме пары счетчиков и пары флагов). На каком проце у Вас это было ? Может есть еще какой-то "fine tuning" в конфиге FatFs?
|
|
|
|
|
Sep 3 2012, 17:37
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Самое лучшее - найти на электрониксе тему, где это подробно обсуждается более осведомленными людьми. Там примерно говорится, что SD карта вещь в себе, с собственным контроллером, который может по спецификации давать задержки до 250 мс независимо от класса. Чем меньше объем карты, тем меньше вероятность задержек - вот у Вас скорость и выше при 1ГБ карте. Зная задержку можете рассчитать приемлемый буфер для записи. Я пишу по 6 МБайт в фат32, камень указывал - lpc2478. Помимо записи на карту идет поток на tcp, рисуется чб gui на oled, опрашивается емкостная клавиатура, всякие датчики температуры, акселерометр и т.п. - т.е. секрет успеха в большом буфере под запись.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Sep 3 2012, 20:23
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Lotor @ Sep 3 2012, 19:37)  Самое лучшее - найти на электрониксе тему, где это подробно обсуждается более осведомленными людьми. Пока не нашел. Цитата Там примерно говорится, что SD карта вещь в себе, с собственным контроллером, который может по спецификации давать задержки до 250 мс независимо от класса Это не очень обьясняет, почему на одной карте запись 12МБ идет 12 секунд, а на другой - 60. Цитата . Чем меньше объем карты, тем меньше вероятность задержек - вот у Вас скорость и выше при 1ГБ карте. Зная задержку можете рассчитать приемлемый буфер для записи. Я пишу по 6 МБайт в фат32, камень указывал - lpc2478. Помимо записи на карту идет поток на tcp, рисуется чб gui на oled, опрашивается емкостная клавиатура, всякие датчики температуры, акселерометр и т.п. - т.е. секрет успеха в большом буфере под запись. У Чена есть бенчмарки: http://elm-chan.org/fsw/ff/img/rwtest2.pngТам проц типа Вашего, с 72мгц тактовой, дает при 16К блоках 5.5 МБайт/сек. А тут: http://elm-chan.org/fsw/ff/img/rwtest.png АТМега на 9мгц на 256мб карточке дает при 2К блоках скорость в 300 мбайт/сек, прием я так понимаю это с SPI на 9мгц, а не с SDIO на 25мгц, это выше чем у меня дает 4гб карточка на 168-мегагерцовом проце! Потому я и думаю - что-то тут не так.
|
|
|
|
|
Sep 3 2012, 20:29
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Не так, так не так. Я попытался Вас направить в нужном направлении - случайные задержки до 250 мс по спецификации, буфер по записи для улучшения скорости. Настаивать не буду. =) PS: Одна из тем про время записи
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Sep 4 2012, 04:48
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Lotor @ Sep 3 2012, 22:29)  Не так, так не так. Я попытался Вас направить в нужном направлении - случайные задержки до 250 мс по спецификации, буфер по записи для улучшения скорости. Настаивать не буду. =) Чем мне конкретно СЕЙЧАС, когда я не пишу реальных данных, а просто переписываю буфер в карточку, поможет его увеличение? Да в и вобще - больший буфер поможет иметь большую постоянную мгновенную. Скорость, но каким образом он может повлиять на среднюю?! Если карточка делает задержу в 0.25с, то потом она должна быстро заглотить данные (накопленные в реальном устройстве за время этой паузы). А средняя скорость даже для класс 2 заявлена 2MB/s. НА 4гб Кингстоне кажется написано класс 4 (доберусь до работы проверю), т..е заявлено уже 4МБ/с, а получается 0.2! Тут: http://elm-chan.org/docs/mmc/mmc_e.html Чен пишет что карточки PQI показали гораздо более высокую скорость чем Панасоник и Тошиба. Про Кингстон - ни слова. Цитата PS: Одна из тем про время записи Спасибо, почитаю.
|
|
|
|
|
Sep 4 2012, 07:38
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Lotor @ Sep 4 2012, 08:38)  Тема, на которую я дал Вам ссылку должна ответить на все вопросы - особенно посты aaarrr и _3m. Еще раз - не надо пытаться подстроиться под работу контроллера с NAND в конкретной карточки, достаточно знать, что запись может занимать до 250 мс и рассчитать, какой должна быть минимальная порция данных для требуемой скорости. Я прочитал ту тему, и aaarrr там говорит тоже самое, что я только что пытался Вам сказать - задержки и размер буфера НЕ влияют на среднюю скорость записи. Наличие и размер буфера - это только вопрос непрерывности данных в реалтайме (из-за этих задержек), но на среднюю скорость записи это не влияет. P.S. Проверил чтение, с той 4гб флешки что пишется 12МБ за 60с - читаются они за 2 сек, т.е. 6МБ/сек. Значит с железом самого SDIO пробем нет.
|
|
|
|
|
Sep 4 2012, 08:40
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(Allregia @ Sep 4 2012, 11:38)  Наличие и размер буфера - это только вопрос непрерывности данных в реалтайме (из-за этих задержек), но на среднюю скорость записи это не влияет. Абсолютно согласен.  Если речь заходит о критичности скорости записи на карточку, то подразумевается же, что нужна непрерывность.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Sep 4 2012, 10:44
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Lotor @ Sep 4 2012, 10:40)  Абсолютно согласен.  Если речь заходит о критичности скорости записи на карточку, то подразумевается же, что нужна непрерывность. Так я-то о СРЕДНЕЙ скорости и говорю сейчас. Вопрос непрерывности данных пока не стоит, в конкретном проекте мне хватит и половины нынешней минимальной скорости (100КБайт/с достаточно), и имеющегося буфера хватит на полсекунды, что больше любой паузы флешки. Так что вопрос почему средняя так мала - это не к конкретному проекту а "вообще". Хочется разобраться, на будующее. Добавление:Думаю, это будет многим интересно. Напомню: - 1гб флешка в фат16, кластер 16к при записи 12 мбайт блоками 4к - время 36с (340кЬ/с), блками 16к - 12с (1МБ/с) - 4гб флешка в фат32, кластер 4к при записи 12 мбайт блоками 4к, 16к, 64к - время 60с (200кЬ/с). Форматирование ффлешки 4гб на РС ничего не изменило. А теперь внимание, призовая игра  После форматирования этой флешки через FatFS командой f_mkfs(0,0,0) произшли две вещи: 1) кластер с 4к стал 32к. 2) время записи 12МБ файла изменилось, и стало: блоками 4к - 12с (1МБ/с) блоками 32К - 6с (2МБ). Т.е. как и для первой флешки. когда блок=кластер скорость сильно увеличивается, но даже при 4к блоке при кластере 32к, скорость после форматирования увеличилась в 5 раз, с 0.2 до 1МБ/сек !!!!!
|
|
|
|
|
Sep 4 2012, 14:36
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 3-12-04
Пользователь №: 1 307

|
скорее всего оно форматирует с выравниваением (так чтоб блоки логические не пересекали границы физических страниц в флэшке) http://forum.ixbt.com/topic.cgi?id=27:9465А скорости чтения этого же фалйа не скажете сколько получается? особенно интересно было бы рандомное блоками по 32к например.
Сообщение отредактировал Serg_D - Sep 4 2012, 14:47
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|