Allregia 9 3 сентября, 2012 Опубликовано 3 сентября, 2012 · Жалоба Нужна помощь клуба. Процессор 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 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 3 сентября, 2012 Опубликовано 3 сентября, 2012 · Жалоба И попутно другой вопрос - я первый раз с FatFs работаю, функия f_write начинается и ждет пока не закончиться запись блока. Т.е оно блокирует на время записи всю программу и не очень понятно зачем тогда DMA? Это можно как-то обойти без OS ? Обойти можно скорей всего - должен быть флаг завершения/прерывание по окончании обмена по DMA. То есть запустить ДМА, и продолжить выполнять программу, иногда проверяя завершился ли обмен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 3 сентября, 2012 Опубликовано 3 сентября, 2012 · Жалоба Обойти можно скорей всего - должен быть флаг завершения/прерывание по окончании обмена по DMA. То есть запустить ДМА, и продолжить выполнять программу, иногда проверяя завершился ли обмен. Это понятно, вопрос насколько FatFs к этому расположена - не хотелось бы ее всю перелопачивать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lotor 0 3 сентября, 2012 Опубликовано 3 сентября, 2012 · Жалоба На счет скорости тут на форуме много тем вердикт которых - надо буферизировать и писать большими кусками сразу. И это общее правило при работе с SD картами. Надеюсь Вы предусмотрели внешнюю память для этих целей (SDRAM например). На счет блокирующей записи - именно из-за неё мне пришлось спешно прикручивать ртос в своё время. Конечно можно выкрутиться и без неё, но имхо самое простое решение. В итоге наш девайс (lpc2478, но не суть) пишет видео со скоростью 5 МБайт/с. Ваш наверняка может показать аналогичные результаты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 3 сентября, 2012 Опубликовано 3 сентября, 2012 · Жалоба На счет скорости тут на форуме много тем вердикт которых - надо буферизировать и писать большими кусками сразу Насколько "большими" ? . Надеюсь Вы предусмотрели внешнюю память для этих целей (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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lotor 0 3 сентября, 2012 Опубликовано 3 сентября, 2012 · Жалоба Самое лучшее - найти на электрониксе тему, где это подробно обсуждается более осведомленными людьми. Там примерно говорится, что SD карта вещь в себе, с собственным контроллером, который может по спецификации давать задержки до 250 мс независимо от класса. Чем меньше объем карты, тем меньше вероятность задержек - вот у Вас скорость и выше при 1ГБ карте. Зная задержку можете рассчитать приемлемый буфер для записи. Я пишу по 6 МБайт в фат32, камень указывал - lpc2478. Помимо записи на карту идет поток на tcp, рисуется чб gui на oled, опрашивается емкостная клавиатура, всякие датчики температуры, акселерометр и т.п. - т.е. секрет успеха в большом буфере под запись. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 3 сентября, 2012 Опубликовано 3 сентября, 2012 · Жалоба Самое лучшее - найти на электрониксе тему, где это подробно обсуждается более осведомленными людьми. Пока не нашел. Там примерно говорится, что 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-мегагерцовом проце! Потому я и думаю - что-то тут не так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lotor 0 3 сентября, 2012 Опубликовано 3 сентября, 2012 · Жалоба Не так, так не так. Я попытался Вас направить в нужном направлении - случайные задержки до 250 мс по спецификации, буфер по записи для улучшения скорости. Настаивать не буду. =) PS: Одна из тем про время записи Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 3 сентября, 2012 Опубликовано 3 сентября, 2012 · Жалоба Потому я и думаю - что-то тут не так. Определенно. Убедитесь, что оптимизация не забыта, попробуйте просто читать-писать группы секторов без FS... Трясти надо, короче говоря. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 4 сентября, 2012 Опубликовано 4 сентября, 2012 · Жалоба Не так, так не так. Я попытался Вас направить в нужном направлении - случайные задержки до 250 мс по спецификации, буфер по записи для улучшения скорости. Настаивать не буду. =) Чем мне конкретно СЕЙЧАС, когда я не пишу реальных данных, а просто переписываю буфер в карточку, поможет его увеличение? Да в и вобще - больший буфер поможет иметь большую постоянную мгновенную. Скорость, но каким образом он может повлиять на среднюю?! Если карточка делает задержу в 0.25с, то потом она должна быстро заглотить данные (накопленные в реальном устройстве за время этой паузы). А средняя скорость даже для класс 2 заявлена 2MB/s. НА 4гб Кингстоне кажется написано класс 4 (доберусь до работы проверю), т..е заявлено уже 4МБ/с, а получается 0.2! Тут: http://elm-chan.org/docs/mmc/mmc_e.html Чен пишет что карточки PQI показали гораздо более высокую скорость чем Панасоник и Тошиба. Про Кингстон - ни слова. PS: Одна из тем про время записи Спасибо, почитаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lotor 0 4 сентября, 2012 Опубликовано 4 сентября, 2012 · Жалоба Тема, на которую я дал Вам ссылку должна ответить на все вопросы - особенно посты aaarrr и _3m. Еще раз - не надо пытаться подстроиться под работу контроллера с NAND в конкретной карточки, достаточно знать, что запись может занимать до 250 мс и рассчитать, какой должна быть минимальная порция данных для требуемой скорости. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 4 сентября, 2012 Опубликовано 4 сентября, 2012 · Жалоба Тема, на которую я дал Вам ссылку должна ответить на все вопросы - особенно посты aaarrr и _3m. Еще раз - не надо пытаться подстроиться под работу контроллера с NAND в конкретной карточки, достаточно знать, что запись может занимать до 250 мс и рассчитать, какой должна быть минимальная порция данных для требуемой скорости. Я прочитал ту тему, и aaarrr там говорит тоже самое, что я только что пытался Вам сказать - задержки и размер буфера НЕ влияют на среднюю скорость записи. Наличие и размер буфера - это только вопрос непрерывности данных в реалтайме (из-за этих задержек), но на среднюю скорость записи это не влияет. P.S. Проверил чтение, с той 4гб флешки что пишется 12МБ за 60с - читаются они за 2 сек, т.е. 6МБ/сек. Значит с железом самого SDIO пробем нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lotor 0 4 сентября, 2012 Опубликовано 4 сентября, 2012 · Жалоба Наличие и размер буфера - это только вопрос непрерывности данных в реалтайме (из-за этих задержек), но на среднюю скорость записи это не влияет. Абсолютно согласен. :) Если речь заходит о критичности скорости записи на карточку, то подразумевается же, что нужна непрерывность. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 4 сентября, 2012 Опубликовано 4 сентября, 2012 · Жалоба Абсолютно согласен. :) Если речь заходит о критичности скорости записи на карточку, то подразумевается же, что нужна непрерывность. Так я-то о СРЕДНЕЙ скорости и говорю сейчас. Вопрос непрерывности данных пока не стоит, в конкретном проекте мне хватит и половины нынешней минимальной скорости (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МБ/сек !!!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg_D 0 4 сентября, 2012 Опубликовано 4 сентября, 2012 (изменено) · Жалоба скорее всего оно форматирует с выравниваением (так чтоб блоки логические не пересекали границы физических страниц в флэшке) http://forum.ixbt.com/topic.cgi?id=27:9465 А скорости чтения этого же фалйа не скажете сколько получается? особенно интересно было бы рандомное блоками по 32к например. Изменено 4 сентября, 2012 пользователем Serg_D Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться