|
Как повысить скорость прокачки данных через virtual COM (USB), CDC из пакета FreeRTOS для AT91SAM7X256 |
|
|
|
Feb 18 2007, 23:47
|
Участник

Группа: Участник
Сообщений: 70
Регистрация: 5-12-06
Пользователь №: 23 146

|
Нужно организовать обмен данными между ПК и камнем. В основном данные записываются в камень, но небольшие пакеты подтверждения состояния процеса в камне передаются в ПК. В качестве базового кода использовал пример lwIP_Demo_Rowley_ARM7 из пакета FreeRTOS выбросив оттуда работу с сетью и добавив ещё одну задачу обработки данных от USB. В результате, у меня в системе крутятся две задачи: первая (с высшим приоритетом) производит обмен данными между контролером USB и двумя очередями (одна на приём, другая на передачу), вторая - обрабатывает данные используя их для выполнения своих задач. В качестве драйвера устройства используется стандартный виндосовский usbser.sys (работаю под WinXPPro). В камне зарезервированы очереди на приём (размером 300 байт) и на передачу (размером 100 байт), а также очередь обмена сообщениями между обработчиком прерываний и первой задачей. Насколько я разобрался с протоколом работы USB, в даном примере код написан достаточно грамотно с использованием двойной буферизации (ping-pong процесора) и там не должно бы быть задержек (возможно я не прав). В нескольких словах как это всё работает. По приходе пакета от ПК вызывается прерывание которое записывает информацию о пакете в очередь обмена с задачей и вызывает переключение задач. Первая задача ожидает этого переключения, вытягивает данные из буфера FIFO, запихивает их в очередь приёма, данные из очереди передачи передаёт в FIFO и выставляет нужные флаги. Когда есть время вторая задача обрабатывает данные в очередях. Запустив всю эту систему я смог получить скорость обмена даными приблизительно 125 кБит/с, а нужно где-то 5Мбит/с. Чтобы проверить где может быть узкое место я изменил код следующим образом: в первой задаче, дополнительно при передаче данных из буфера FIFO в очередь приёма я дописывал размер полученого пакета и номер кадра в котором пришёл пакет. Вторая задача все данные из очереди приёма после некоторой задержки отправляла обратно на ПК. На ПК я отправлял данные из масива размером 249 байт. Програма написана на Delphi. Порт открываю командой hCom:=Createfile(port, GENERIC_READ+GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);. Скорость обмена устанавливается на камне 115200, но как мне раньше ответили эта скорость, только для совместимости и реально она не ограничивает потока данных (я это проверял - скорость обмена не изменялась при установке других чисел). Данные из программы на ПК я отправлял командой WriteFile(hCom, test[0], 249, bytes, OvLapp);. Как и предполагается в протоколе USB у меня пришло четыре пакета: 64+64+64+57=249. Но почему-то все пакеты приходят не в одном кадре (или в двух соседних кадрах), а через один-два кадра (номера кадров разнятся на две-три единицы). Может я ещё не до конца разобрался со стандартом USB, но вроде-бы, все пакеты могут передаться в одном кадре несколькими транзакциями. Такое ощущение, что передачу данных тормозит драйвер CDC usbser.sys. Если да, то какая может быть альтернатива? Желательно бы обойтись без написания собственного драйвера.
Возможно кто-то подскажет как можно ещё попробовать поискать где узкое место. Может кто-то работал с этой реализацией CDC, получал ожидаемые большие скорости обмена данными и знает где нужно изменить код.
Помогите, пожалуйста.
|
|
|
|
|
 |
Ответов
|
Feb 19 2007, 14:18
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(OlegHmt @ Feb 19 2007, 01:17)  Но почему-то все пакеты приходят не в одном кадре (или в двух соседних кадрах), а через один-два кадра (номера кадров разнятся на две-три единицы). Может я ещё не до конца разобрался со стандартом USB, но вроде-бы, все пакеты могут передаться в одном кадре несколькими транзакциями. Все верно. Явно в стандарте не нашел, но по жизни так и есть. Цитата(AlexandrY @ Feb 19 2007, 15:43)  Так вот когда я смотрел работу конечной точки виртуального COM, то наблюдал передачу запросов каждые 5 мкс. Но после того как в кадре проходил один ответ больше запросов от хоста на данную конечную точку до конца кадра не поступало. Следовательно потолок для виртуального COM порта это 64 байта в 1 мс на USB 2.0 FS т.е. 512 КБит/сек Неправильный у Вас наверное USB был. Я тоже думал что ограничение 64 кбит. Но когда получил максимальную реальную скрорость > 300 кб/с я изменил свое мнение. При тупой непрерывной посылке байтов контроллером и тупым приемом потока компом (Сел1.7) скорость была что-то около 340-380 кб/с.
|
|
|
|
|
Feb 21 2007, 12:57
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Да, вы оказались правы Что-то тогда было не то. Сейчас протестировал работу стандартного драйвера виртуальномого COM-а с другого чипа. Перекачка в окно терминала проходит со скоростью 200 кбайт/сек. Не так все и плохо. Анализатором еще не смотрел ситуацию на шине, как погляжу может сообщу. Цитата(Alechek @ Feb 19 2007, 15:48)  Неправильный у Вас наверное USB был. Я тоже думал что ограничение 64 кбит. Но когда получил максимальную реальную скрорость > 300 кб/с я изменил свое мнение. При тупой непрерывной посылке байтов контроллером и тупым приемом потока компом (Сел1.7) скорость была что-то около 340-380 кб/с.
|
|
|
|
|
Feb 22 2007, 13:20
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Так, новые данные о работе виртуального COM порта. Скорость считывания из устройства в комп реально ничем не ограничена кроме пропускной способности USB шины и собственно устройства. Я реально достиг передачи 11-и 64-х битных пакетов за один кадр, т.е. 704 Кбайта в секунду. И эта граница целиком определялась быстродействием моего устройства (платформа на базе STR91x). Больше устройство просто не успевало обрабатывать транзакции типа IN. А вот с передачей данных из компа в устройство сложнее. Комп никак не захотел отдавать более 2-х пакетов за кадр. Причем они шли так: 64 байта, а потом 36 байт. Если комп получал после первого пакета ответ NAK, то он долбил в течении кадра пока не пересылал оба пакета, а потом замолкал до следующего кадра, т.е. переставал отправлять запросы OUT Перетыкание на другие разъемы USB в компе ситуацию не меняет. Использовал для посылки данных терминальную программу TeraTerm. Посылал двоичный файл в 1 Мег. Т.е. пока вывод, что на передачу в устройство достичь скорости более 100 Кбайт в секунду на виртуальном COM порте не удалось. Цитата(AlexandrY @ Feb 21 2007, 14:27)  Да, вы оказались правы Что-то тогда было не то. Сейчас протестировал работу стандартного драйвера виртуальномого COM-а с другого чипа. Перекачка в окно терминала проходит со скоростью 200 кбайт/сек. Не так все и плохо. Анализатором еще не смотрел ситуацию на шине, как погляжу может сообщу. Цитата(Alechek @ Feb 19 2007, 15:48)  Неправильный у Вас наверное USB был. Я тоже думал что ограничение 64 кбит. Но когда получил максимальную реальную скрорость > 300 кб/с я изменил свое мнение. При тупой непрерывной посылке байтов контроллером и тупым приемом потока компом (Сел1.7) скорость была что-то около 340-380 кб/с.
|
|
|
|
|
Feb 24 2007, 15:23
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Ситуация, прояснилась окончательно. Выводы о кривизне usbser.sys были явно преждевременны. Похоже тормоза исходят от более верхних прикладных уровней. На этот раз я для тестирования написал в Delphi свою прогу на базе компонента AsyncPro для работы с виртуальным COM портом. И сразу скорость закачки в устройство подскочила до максимальной с какой способен принимать мой дивайс, где-то более 200 Кбайт в секунду. Вообщем HyperTerminal под Windows вообще посылает пакеты чуть не по одному байту. TeraTerm ограничивае трафик в 100 КБ/сек, а вот собственное приложение ничем трафик не ограничивает, но видимо тщательнее надо подходить к инициализации буферов и настройке DCB структуры COM порта. Компонент AsyncPro скрывает от юзера работу с Win API поэтому конкретнее о настройках ничего сказать не могу. Цитата(Alechek @ Feb 22 2007, 17:39)  Цитата(AlexandrY @ Feb 22 2007, 15:20)  Т.е. пока вывод, что на передачу в устройство достичь скорости более 100 Кбайт в секунду на виртуальном COM порте не удалось. Да, как оказалось, usbser.sys заточен лишь под модем, как и usbprint.sys - чисто под принтер.  Налицо ситуация, когда мелкософтовцы отлаживали лишь приемную часть драйвера...
|
|
|
|
|
Feb 24 2007, 21:47
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(AlexandrY @ Feb 24 2007, 16:23)  Ситуация, прояснилась окончательно. Выводы о кривизне usbser.sys были явно преждевременны. Похоже тормоза исходят от более верхних прикладных уровней. На этот раз я для тестирования написал в Delphi свою прогу на базе компонента AsyncPro для работы с виртуальным COM портом. И сразу скорость закачки в устройство подскочила до максимальной с какой способен принимать мой дивайс, где-то более 200 Кбайт в секунду.
Вообщем HyperTerminal под Windows вообще посылает пакеты чуть не по одному байту. TeraTerm ограничивае трафик в 100 КБ/сек, а вот собственное приложение ничем трафик не ограничивает, но видимо тщательнее надо подходить к инициализации буферов и настройке DCB структуры COM порта. Компонент AsyncPro скрывает от юзера работу с Win API поэтому конкретнее о настройках ничего сказать не могу. Я делал модем в своё время и тестировал HyperTerminal. Могу сообщить следующее. 1) Из под XP он действительно дробит пакеты и вставляет задержки даже м/у символами. Работает крайне медленно. Это наблюдается на FTDI. На Win98 такого не замечалось. 2) Терминал имеет ошибки при передаче данных. В том числе в режиме X-modem да и других тоже. Более того одну из ошибок мы задиагностировали в 1999 году ещё в Win98. В том году мы её успешно проверили из под WinXP. Всё нормально! В наличии! Очень интересны Ваши эксперименты, но вот в каком ключе. Мне самому жутко не хочется писать драйвер. Его же потом поддерживать! Хотелось бы со стороны своего девайса с эмулировать наличие там FT232RL. Так, чтобы благополучно подходил драйвер от FTDI. Они его сейчас вылизали. Работает как часы. Ни кто не думал над этим?
|
|
|
|
Сообщений в этой теме
OlegHmt Как повысить скорость прокачки данных через virtual COM (USB) Feb 18 2007, 23:47 Kail Альтернатив нету. По книжке Агурова - втроенный др... Feb 19 2007, 10:06 OlegHmt Цитата(Kail @ Feb 19 2007, 09:06) Альтерн... Feb 19 2007, 11:25  ivstech Какой драйвер используете? Я - стандартный из Wind... Feb 19 2007, 11:53   OlegHmt Цитата(ivstech @ Feb 19 2007, 10:53) Како... Feb 19 2007, 12:42 gormih Это мне тоже очень инетерсно.
Поговорил с челове... Feb 19 2007, 13:11  gormih Цитата(Alechek @ Feb 19 2007, 14:18) Непр... Feb 19 2007, 14:28   Alechek Цитата(gormih @ Feb 19 2007, 16:28) Други... Feb 19 2007, 15:04       ivstech [quote name='SasaVitebsk' date='Feb 25... Feb 25 2007, 07:30        SasaVitebsk Цитата(ivstech @ Feb 25 2007, 08:30) Цита... Feb 25 2007, 14:23         ivstech Цитата(SasaVitebsk @ Feb 25 2007, 17:23) ... Feb 25 2007, 18:41          Alechek Цитата(ivstech @ Feb 25 2007, 20:41) Но п... Feb 26 2007, 15:21 Dron_Gus Я думаю, SAM7S и SAM7X в плане USB идентичны. Мне,... Feb 19 2007, 19:46 OlegHmt Вчера немного разбирался с проблемой и вот что смо... Feb 20 2007, 11:30 gormih а мне посоветовали "забить" на виртуальн... Feb 20 2007, 12:10 OlegHmt Цитата(gormih @ Feb 20 2007, 11:10) а мне... Feb 20 2007, 12:27  gormih Цитата(OlegHmt @ Feb 20 2007, 12:27) Если... Feb 20 2007, 12:57 AlexanderX Я тестировал скорость передачи данных от компа на ... Feb 23 2007, 18:08 AlexandrY В вашем случае вероятнее виновата выбранная схема ... Feb 24 2007, 15:58 SasaVitebsk Скажите специалисты. А если требуется реализация п... Feb 26 2007, 23:18 wladimiru Цитата(SasaVitebsk @ Feb 26 2007, 23:18) ... Mar 6 2007, 17:04 OlegHmt Наконец дошли у меня руки до исследований USB и во... Mar 10 2007, 15:45 gormih Интересно было бы узнать, чем всё закончилось? Как... May 8 2007, 05:53 klen Я достиг скорости 1,2 кб/с!!!
Пока ... May 9 2007, 08:09 OlegHmt Да похвалиться, вообще-то, нечем. Как я писал рань... May 10 2007, 06:30 klen Мдя.
Используя lpc2148 c открытым USB стеком и к... May 18 2007, 20:34 goodwin http://www.tnkernel.com/usb_bulk.html May 18 2007, 20:42 klen Цитата(goodwin @ May 19 2007, 00:42) http... May 18 2007, 20:51
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|