|
STM32F103 + MicroSD + USB = Mass Storage, низкая скорость чтения - записи -- нужна оптимизация |
|
|
|
Dec 13 2014, 12:44
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-10-10
Пользователь №: 60 152

|
Здравствуйте! Я успешно адаптировал пример с сайта ST USB MassStorage на своей плате (использовал F103VCT6). Однако, измеренная скорость чтения оказалась 200, а записи - 36 кБайт/с. На карточку ( TRANSCEND 2 G MicroSD ) с ПК пишутся файлы по 2МБайт, поэтому надо побыстрее. Как я понял, в обмене задействован блок 512 байт, равный сектору ( 8 блоков по 64=MAX_BULK_SIZE). Функция WriteMultiBLocks у меня работает около 12 мс (из-за встроенного цикла задержки, без которого пишет быстро, почти 1 МБ/с, но только в файлах одни нули потом ), отсюда 512/0.012 = 42 кБ/с, минус накладные расходы, получаем 36 кБайт. Замена на WriteBlock (пишется все равно 1 сектор) и ReadBlock дала прирост до 280 при чтении и 70 кБайт/с при записи соответственно. Все равно, этого мало. Мне нужны советы по оптимизации модуля sdio_stm32f1 или увеличения блока с 512 Б до 16КБ, например, тогда можно было бы поднять скорость обмена и использовать Write- и ReadMultiBlocks, время выполнения будет примерно те же 12 мс (замерял на блоках 12КБ). Проект прилагаю (основан на примере ST и STM32Primer2_GPS_Tracker-master от Nemui Trinomius. Ссылки на рабочие проекты приветствуются, особенно gcc и iar.
|
|
|
|
|
 |
Ответов
|
Dec 13 2014, 13:24
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(IanPo @ Dec 13 2014, 15:44)  Здравствуйте! Я успешно адаптировал пример с сайта ST USB MassStorage на своей плате (использовал F103VCT6). Однако, измеренная скорость чтения оказалась 200, а записи - 36 кБайт/с. Не может быть такой скорости, у меня с их примером (MCU = STM32F207, PHY = USB3300, плата самодельная) на HS выходило по паре мегабайт в обе стороны без всяких оптимизаций. FS не пробовал, но думаю, что в этом случае без оптимизации должно выйти килобайт по 600. Вы что, на LS запустили Mass-Storage ? Что-то там у вас не так ...
|
|
|
|
|
Dec 13 2014, 14:39
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-10-10
Пользователь №: 60 152

|
Цитата(kovigor @ Dec 13 2014, 16:24)  Что-то там у вас не так ...  Вот я и пытаюсь понять, что не так. Кстати, FS = 12 Мбит/с , т.е. 1.5 МБ/с максимум. Девайс FullSpeed
Сообщение отредактировал IanPo - Dec 13 2014, 14:40
|
|
|
|
|
Dec 13 2014, 20:29
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-10-10
Пользователь №: 60 152

|
Цитата(kovigor @ Dec 13 2014, 21:56)  Флэшки на FS дают в среднем 1.2 мегабайта в секунду. Вы, кстати, случайно не переключили МК в режим LS (если для вашего МК такое возможно) ? А так - не вы первый, кто запускает этот пример. Работать он должен. Пусть не совсем оптимально, но должен ... USB DP подтягивается к "1" на ноге контроллера через резистор. Схему прилагаю. На флешках 4ГБ скорость чтения 500 кБайт/с, а записи - около 100. Это явно не LS. Кстати, в примере от ST функции типа WaitReadOperation виснут. Пришлось делать через опрос флага TransferComplete TC4. Попробую завтра померять время записи сектора, посмотрю, где задержки.
Эскизы прикрепленных изображений
|
|
|
|
|
Dec 13 2014, 21:12
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(IanPo @ Dec 13 2014, 23:29)  На флешках 4ГБ скорость чтения 500 кБайт/с, а записи - около 100. 500 - это, как говорят медики, "вариант нормы". Я делал такой же проект на ARM9, и у меня без оптимизации получалось по 600 килобайт в обе стороны (было это давно, и карточка была древняя, на 256 МБайт). У вас 500. С записью - да, хуже. Совет. Попробуйте подправить проект таким образом, чтобы читать и писать не на карточку, а в ОЗУ микроконтроллера, или даже просто "глотать" (читай: отбрасывать данные от хоста, но сообщать ему, что все в порядке) данные при записи и выдавать хосту произвольные байты при чтении. Проблема решится ? Я почти уверен, что все станет заметно лучше ...
|
|
|
|
Сообщений в этой теме
IanPo STM32F103 + MicroSD + USB = Mass Storage Dec 13 2014, 12:44 IanPo Я уже это делал - убирал из функции WriteMultiBloc... Dec 13 2014, 21:34 kovigor Цитата(IanPo @ Dec 14 2014, 01:34) но на ... Dec 13 2014, 21:38  IanPo Цитата(kovigor @ Dec 14 2014, 00:38) Еще ... Dec 14 2014, 11:45   kovigor Цитата(IanPo @ Dec 14 2014, 15:45) Ничего... Dec 14 2014, 12:29 IanPo Если я правильно понял, то вместо WriteBlock я дел... Dec 14 2014, 12:41 kovigor Цитата(IanPo @ Dec 14 2014, 16:41) Поправ... Dec 14 2014, 19:19 IanPo Красные победили - чтение 667, запись 333 кБайт/с ... Dec 21 2014, 19:13 kovigor Цитата(IanPo @ Dec 21 2014, 23:13) чтение... Dec 21 2014, 20:03
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|