Перейти к содержанию
    

Нужна помощь клуба.

 

Процессор 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 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И попутно другой вопрос - я первый раз с FatFs работаю, функия f_write начинается и ждет пока не закончиться запись блока. Т.е оно блокирует на время записи всю программу и не очень понятно зачем тогда DMA?

Это можно как-то обойти без OS ?

Обойти можно скорей всего - должен быть флаг завершения/прерывание по окончании обмена по DMA.

То есть запустить ДМА, и продолжить выполнять программу, иногда проверяя завершился ли обмен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обойти можно скорей всего - должен быть флаг завершения/прерывание по окончании обмена по DMA.

То есть запустить ДМА, и продолжить выполнять программу, иногда проверяя завершился ли обмен.

Это понятно, вопрос насколько FatFs к этому расположена - не хотелось бы ее всю перелопачивать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На счет скорости тут на форуме много тем вердикт которых - надо буферизировать и писать большими кусками сразу. И это общее правило при работе с SD картами. Надеюсь Вы предусмотрели внешнюю память для этих целей (SDRAM например).

 

На счет блокирующей записи - именно из-за неё мне пришлось спешно прикручивать ртос в своё время. Конечно можно выкрутиться и без неё, но имхо самое простое решение. В итоге наш девайс (lpc2478, но не суть) пишет видео со скоростью 5 МБайт/с. Ваш наверняка может показать аналогичные результаты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На счет скорости тут на форуме много тем вердикт которых - надо буферизировать и писать большими кусками сразу

 

Насколько "большими" ?

 

. Надеюсь Вы предусмотрели внешнюю память для этих целей (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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самое лучшее - найти на электрониксе тему, где это подробно обсуждается более осведомленными людьми. Там примерно говорится, что SD карта вещь в себе, с собственным контроллером, который может по спецификации давать задержки до 250 мс независимо от класса. Чем меньше объем карты, тем меньше вероятность задержек - вот у Вас скорость и выше при 1ГБ карте. Зная задержку можете рассчитать приемлемый буфер для записи. Я пишу по 6 МБайт в фат32, камень указывал - lpc2478. Помимо записи на карту идет поток на tcp, рисуется чб gui на oled, опрашивается емкостная клавиатура, всякие датчики температуры, акселерометр и т.п. - т.е. секрет успеха в большом буфере под запись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самое лучшее - найти на электрониксе тему, где это подробно обсуждается более осведомленными людьми.

 

Пока не нашел.

 

Там примерно говорится, что 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-мегагерцовом проце!

 

Потому я и думаю - что-то тут не так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не так, так не так. Я попытался Вас направить в нужном направлении - случайные задержки до 250 мс по спецификации, буфер по записи для улучшения скорости. Настаивать не буду. =)

 

PS: Одна из тем про время записи

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потому я и думаю - что-то тут не так.

Определенно. Убедитесь, что оптимизация не забыта, попробуйте просто читать-писать группы секторов без FS... Трясти надо, короче говоря.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не так, так не так. Я попытался Вас направить в нужном направлении - случайные задержки до 250 мс по спецификации, буфер по записи для улучшения скорости. Настаивать не буду. =)

 

 

Чем мне конкретно СЕЙЧАС, когда я не пишу реальных данных, а просто переписываю буфер в карточку, поможет его увеличение?

Да в и вобще - больший буфер поможет иметь большую постоянную мгновенную. Скорость, но каким образом он может повлиять на среднюю?! Если карточка делает задержу в 0.25с, то потом она должна быстро заглотить данные (накопленные в реальном устройстве за время этой паузы).

А средняя скорость даже для класс 2 заявлена 2MB/s.

НА 4гб Кингстоне кажется написано класс 4 (доберусь до работы проверю), т..е заявлено уже 4МБ/с, а получается 0.2!

 

Тут: http://elm-chan.org/docs/mmc/mmc_e.html Чен пишет что карточки PQI показали гораздо более высокую скорость чем Панасоник и Тошиба. Про Кингстон - ни слова.

 

 

PS: Одна из тем про время записи

 

Спасибо, почитаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тема, на которую я дал Вам ссылку должна ответить на все вопросы - особенно посты aaarrr и _3m. Еще раз - не надо пытаться подстроиться под работу контроллера с NAND в конкретной карточки, достаточно знать, что запись может занимать до 250 мс и рассчитать, какой должна быть минимальная порция данных для требуемой скорости.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тема, на которую я дал Вам ссылку должна ответить на все вопросы - особенно посты aaarrr и _3m. Еще раз - не надо пытаться подстроиться под работу контроллера с NAND в конкретной карточки, достаточно знать, что запись может занимать до 250 мс и рассчитать, какой должна быть минимальная порция данных для требуемой скорости.

 

Я прочитал ту тему, и aaarrr там говорит тоже самое, что я только что пытался Вам сказать - задержки и размер буфера НЕ влияют на среднюю скорость записи.

Наличие и размер буфера - это только вопрос непрерывности данных в реалтайме (из-за этих задержек), но на среднюю скорость записи это не влияет.

 

P.S. Проверил чтение, с той 4гб флешки что пишется 12МБ за 60с - читаются они за 2 сек, т.е. 6МБ/сек. Значит с железом самого SDIO пробем нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наличие и размер буфера - это только вопрос непрерывности данных в реалтайме (из-за этих задержек), но на среднюю скорость записи это не влияет.

Абсолютно согласен. :) Если речь заходит о критичности скорости записи на карточку, то подразумевается же, что нужна непрерывность.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Абсолютно согласен. :) Если речь заходит о критичности скорости записи на карточку, то подразумевается же, что нужна непрерывность.

 

Так я-то о СРЕДНЕЙ скорости и говорю сейчас.

Вопрос непрерывности данных пока не стоит, в конкретном проекте мне хватит и половины нынешней минимальной скорости (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МБ/сек !!!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

скорее всего оно форматирует с выравниваением (так чтоб блоки логические не пересекали границы физических страниц в флэшке)

http://forum.ixbt.com/topic.cgi?id=27:9465

 

А скорости чтения этого же фалйа не скажете сколько получается? особенно интересно было бы рандомное блоками по 32к например.

Изменено пользователем Serg_D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...