[an error occurred while processing this directive]
Как побороть большие паузы между запросами к USB драйверу
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено msn 02 февраля 2006 г. 16:20

Суть проблемы такая:
Есть МК (Cygnal C8051F32x) используется одна EP (64+64) с двойной буферизацией передачи типа Bulk на Full Speed в сторону Хоста. К МК должен быть подключен внешний АЦП и Cygnal непрерывно передает данные в сторону хоста. АЦП тактируется примерно 600 КГц и имеет разрядность 12 бит, т.е. Cygnal должен передавать поток 600*1,5 = 900 Кбайт / сек. Если запрос DeviceIoContro(,,,,,0x10000,,) к драйверу (пробовал на WinDriver, USBIO и дровах от Cypress) идет с размером буфера 64К то средняя скорость чтения из EP примерно 1020-1040 Кбайт / сек, т.е. хватает. Но есть ложка дегтя. Если вместо данных АЦП передавать значение внутреннего таймера МК, для проверки задержек, то получается следующая неприятная картина:

[ Пакет №1 – 64 Байта]
6 us – начала записи данных в EP (условно начало передачи пакета)
48 us – окончание записи данных в EP (условно окончание передачи пакета)
Время записи = 42 us

[Пауза №1]
48 us … 50 us, dT = 2 us

[ Пакет №2 – 64 Байта]
50 us … 93 us, dT = 43 us

[Пауза №2]
93 us … 3015 us, dT = 2922 us
Длина определяется тем, что сначала было записаны первые два пакета в EP (двойная буферизация) после получения команды (по Pipe 00), а дальше пошли IN транзакции от DeviceIoContro(,,,,,0x10000,,).

[ Пакет №3 – 64 Байта]
3015 us … 3057 us, dT = 42 us

[Пауза №3]
3057 us … 3070 us, dT = 13 us

[ Пакет №4 – 64 Байта]
3070 us … 3113 us, dT = 43 us

[Пауза №4]
3113 us … 3128 us, dT = 15 us

Дальше пауз больше нескольких десятков us нет.

[ Пакет №1025 – 64 Байта, т.е. это уже начался новый DeviceIoContro(,,,,,0x10000,,)]
dT = 43 us

[Пауза №1025]
dT = 10 us

[ Пакет №1026 – 64 Байта]
dT = 42 us

[Пауза №1026]
>>>>>>>>>>> dT = ~3000 us <<<<<<<<<<<<<

!!! А вот тут не понятно, почему такая огромная пауза? DeviceIoContro(,,,,,0x10000,,) идут просто в цикле кроме этого МК ни чего не получает, неужто драйверу нужно аж 3 ms что бы сформировать DeviceIoContro(,,,,,0x10000,,), причем такая же ситуация на разных драйверах, на разных компах (с 98, 2k и XP c USB1.1. и USB2.0 на борту). Такие большие задержки приводят к тому, что 3000 us / (1/600КГц) = 1800 отсчетов АЦП пролетают, т.е. средняя скорость хорошая, но передачи идут рывками. Если снижать размер буфера, например 8К, задержки в среднем уменьшаются (есть много ~1 ms, но 5% наоборот растут аж до 3-5 ms) и средняя скорость падает почти в 2 раза до ~600 Кбайт / сек

Кто-то сталкивался с такими проблемами? Может кто-то подскажет из-за чего происходят таки большие задержки и как их можно уменьшить?

Пока вижу только один вариант – использовать FIFO.

Спасибо.

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru