реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Скорость по USB (MassStorage).
Oleg_IT
сообщение Dec 22 2010, 06:40
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



LPC2478. Разобрался с MassStorage с SD картой, но скорость, мягко говоря, низкая, на LPC 33-35 ед., та же карта с кардридером ~5000 ед. Как заставить эту парочку быстрее работать?

Go to the top of the page
 
+Quote Post
kovigor
сообщение Dec 22 2010, 06:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Oleg_IT @ Dec 22 2010, 12:40) *
LPC2478. Разобрался с MassStorage с SD картой, но скорость, мягко говоря, низкая, на LPC 33-35 ед., та же карта с кардридером ~5000 ед. Как заставить эту парочку быстрее работать?


А что такое "единица" ? Давайте уж без загадок. У меня очень похожий проект, но на AT91SAM9XE512 (Full Speed). Тоже SD-карточка, тактовая частота для карточки - 22.5 МГц. По чтению и по записи достигнуты скорости примерно 606-616 КБайт в секунду. Фабричная флэшка на Full Speed дает такой же результат. А у вас какая скорость достигается ?
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Dec 22 2010, 06:59
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Да какие загадки, просто лень было Кбит/сек писатьsm.gif Сейчас ещё раз проверил кардридер 1100 kbytes/s, LPC 33,6 kbytes/s.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Dec 22 2010, 07:21
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Oleg_IT @ Dec 22 2010, 13:59) *
Да какие загадки, просто лень было Кбит/сек писатьsm.gif Сейчас ещё раз проверил кардридер 1100 kbytes/s, LPC 33,6 kbytes/s.


Явная аномалия. Причем если картридер работает на High Speed, то тоже анамалия, но уже не ваша. А чем мерили ? Я мерил HD_Speed:
http://www.steelbytes.com/?mid=20

Карточка на какой частоте работает ? 1 МГц ? По SPI или по параллельному четырехразрядному ?

Сообщение отредактировал kovigor - Dec 22 2010, 07:22
Go to the top of the page
 
+Quote Post
sonycman
сообщение Dec 22 2010, 14:23
Сообщение #5


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(kovigor @ Dec 22 2010, 14:45) *
Тоже SD-карточка, тактовая частота для карточки - 22.5 МГц. По чтению и по записи достигнуты скорости примерно 606-616 КБайт в секунду. Фабричная флэшка на Full Speed дает такой же результат. А у вас какая скорость достигается ?

Хм, что-то у вас медленная флешка.
У меня mass storage на STM32 по SPI 18 МГц чтение/запись 850-900 KB/sec.

Кард ридер, если его ограничить Full speed портом, думаю, выдаст даже больше благодаря параллельному интерфейсу.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Dec 22 2010, 15:56
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Скорость мерил обычным копированием в Total Commander. Если он врёт, то врёт одинаково.
Исходник для работы с картами взял отсюда c:\Keil\ARM\Boards\Keil\MCB2470\RL\FlashFS\ (устанавливается по умолчанию, mdk412.exe, rlarm412.exe). Макетка у меня SK-MLPC2478 (12 МГц)
Go to the top of the page
 
+Quote Post
sonycman
сообщение Dec 22 2010, 16:12
Сообщение #7


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Oleg_IT @ Dec 22 2010, 22:56) *
Скорость мерил обычным копированием в Total Commander.

Аналогично, тоже пользовался Тотал Коммандером.
Go to the top of the page
 
+Quote Post
=AK=
сообщение Dec 23 2010, 02:12
Сообщение #8


pontificator
******

Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483



Цитата(Oleg_IT @ Dec 22 2010, 20:10) *
LPC2478. Разобрался с MassStorage с SD картой, но скорость, мягко говоря, низкая, на LPC 33-35 ед., та же карта с кардридером ~5000 ед. Как заставить эту парочку быстрее работать?


Для этого надо быстро закидывать в трубу чанки, а не щелкать клювом.

Если упрощенно, то когда хост забирает у вас первый чанк 64 байта, он тут же требует следующий чанк. Если вы его не предоставите в течении 43 мкс (для FS), то планировщик хоста решит, что ваш девайс тормозит безмерно и в следующий раз запросит у него чанк только в следующем фрейме, т.е. через 1 мс, или даже через фрейм. Так что для тормозных девайсов предел скорости обмена - 64 кбайт/сек, а в действительности еще меньше. А если будете подсовывать чанки оперативно, без жевания соплей, то хост может забрать у вас до 19 чанков за один фрейм, это дает в пределе 1216 кбайт/сек для FS.

На практике используется два буфера. Пока хост выкачивает чанк из одного буфера, вы заполняете второй, а потом ваша USB железяка мгновенно и автоматически меняет их местам, как только хост выкачал чанк и потребовал следующий. При скорости 12 Мбит/сек хост выкачивает чанк в 64 байта примерно за 43 мкс . Вот за это время вам надо успеть заполнить второй буфер. Не успели - кирдык, будете загорать как минимум до следующего фрейма.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Dec 23 2010, 03:37
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Примерно понятно, не знаю только, что есть чанк. Часть cектора? Как определить какой сектор хост потребует в следующий раз? Работу программы понимаю так (разбирая исходник, может и ошибаюсь), хост запрашивает данные из куска заданного сектора, эти данные вычитываются с карточки и пересылаются в хост. Пока данные пересылаются, могу вычитать следующий сектор, но какой? Ходя по программе дебагером видно, что сектора не всегда вычитываются последовательно.
Go to the top of the page
 
+Quote Post
=AK=
сообщение Dec 23 2010, 06:26
Сообщение #10


pontificator
******

Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483



Цитата(Oleg_IT @ Dec 23 2010, 17:07) *
что есть чанк.

"Чанками" (от английского chunk - "кусок") я называю USB-пакеты. В USB длинное сообщение не передается целиком, а разбивается на куски и передается пакетами.

Для балк-трубы (а масс-сторадж качает данные через балк) размер пакета может быть 8, 16, 32 или 64 байта, он декларируется в дескрипторе устройства. Как правило для балка все используют пакеты в 64 байта.

К секторам это не имеет отношения. Когда вы перекачиваете файл или массив через USB, низкоуровневый софт и железо (или даже вообще одно только железо, надо смотреть, кто это делает в вашем случае) разбивает его на чанки и закидывает в USB. Если размер очередного чанка равен 64 байта, значит, файл еще не закончился, хост будет требовать еще. Если чанк меньше 64 байт (вплоть до нуля), то хост знает, что это последний чанк файла.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Dec 23 2010, 10:39
Сообщение #11


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(=AK= @ Dec 23 2010, 13:26) *
Если размер очередного чанка равен 64 байта, значит, файл еще не закончился, хост будет требовать еще. Если чанк меньше 64 байт (вплоть до нуля), то хост знает, что это последний чанк файла.

Хм, вообще-то, в случае mass storage, хост всегда знает, каков размер запрашиваемого пакета, так как сам выставляет девайсу эту информацию в виде: логический номер первого нужного сектора + количество байт.

Поэтому никакого смысла в лишней транзакции с нулевой длиной нет.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Dec 23 2010, 10:50
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(sonycman @ Dec 23 2010, 16:39) *
Хм, вообще-то, в случае mass storage, хост всегда знает, каков размер запрашиваемого пакета, так как сам выставляет девайсу эту информацию в виде: логический номер первого нужного сектора + количество байт.

Да, номер сектора и количество байт, больше ни какой информации в запросе я не вижу. И, как я уже говорил, номера секторов не всегда последовательные, так что читать на опережение не понятно что.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Dec 23 2010, 11:29
Сообщение #13


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Oleg_IT @ Dec 23 2010, 17:50) *
И, как я уже говорил, номера секторов не всегда последовательные, так что читать на опережение не понятно что.

Читать на опережение нужно те сектора, которые запросил хост.
А он может запросить пакет размером от одного сектора до 128 (65 килобайт).
Сектора в пакете всегда идут последовательно, то есть параллельно с передачей/приёмом данных хосту/от него необходимо считывать/записывать их на носитель.
Go to the top of the page
 
+Quote Post
=AK=
сообщение Dec 26 2010, 21:12
Сообщение #14


pontificator
******

Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483



Цитата(sonycman @ Dec 24 2010, 00:09) *
Поэтому никакого смысла в лишней транзакции с нулевой длиной нет.


Речь шла не о транзакциях. Смысл "лишнего" чанка нулевой длины объясняется в спецификации USB, параграф 5.8.3 "Bulk Transfer Packet Size Constraints".
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01487 секунд с 7
ELECTRONIX ©2004-2016