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

 
 
> Как повысить скорость прокачки данных через virtual COM (USB), CDC из пакета FreeRTOS для AT91SAM7X256
OlegHmt
сообщение Feb 18 2007, 23:47
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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, получал ожидаемые большие скорости обмена данными и знает где нужно изменить код.

Помогите, пожалуйста.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlexandrY
сообщение Feb 19 2007, 13:43
Сообщение #2


Ally
******

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



А чем вы смотрите обмен по USB?
Смотреть надо аппаратным анализатором. Он показавает наличе запросов от хоста. Программные логеры этого не видят.

Так вот когда я смотрел работу конечной точки виртуального COM, то наблюдал передачу запросов каждые 5 мкс. Но после того как в кадре проходил один ответ больше запросов от хоста на данную конечную точку до конца кадра не поступало. Следовательно потолок для виртуального COM порта это 64 байта в 1 мс на USB 2.0 FS т.е. 512 КБит/сек


Цитата(OlegHmt @ Feb 19 2007, 01:17) *
Но почему-то все пакеты приходят не в одном кадре (или в двух соседних кадрах), а через один-два кадра (номера кадров разнятся на две-три единицы). Может я ещё не до конца разобрался со стандартом USB, но вроде-бы, все пакеты могут передаться в одном кадре несколькими транзакциями.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Feb 19 2007, 14:18
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 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 кб/с.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Feb 21 2007, 12:57
Сообщение #4


Ally
******

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



Да, вы оказались правы
Что-то тогда было не то.
Сейчас протестировал работу стандартного драйвера виртуальномого COM-а с другого чипа.
Перекачка в окно терминала проходит со скоростью 200 кбайт/сек. Не так все и плохо.
Анализатором еще не смотрел ситуацию на шине, как погляжу может сообщу.

Цитата(Alechek @ Feb 19 2007, 15:48) *
Неправильный у Вас наверное USB был. Я тоже думал что ограничение 64 кбит. Но когда получил максимальную реальную скрорость > 300 кб/с я изменил свое мнение.
При тупой непрерывной посылке байтов контроллером и тупым приемом потока компом (Сел1.7) скорость была что-то около 340-380 кб/с.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Feb 22 2007, 13:20
Сообщение #5


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 кб/с.

Go to the top of the page
 
+Quote Post
Alechek
сообщение Feb 22 2007, 16:09
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(AlexandrY @ Feb 22 2007, 15:20) *
Т.е. пока вывод, что на передачу в устройство достичь скорости более 100 Кбайт в секунду на виртуальном COM порте не удалось.
Да, как оказалось, usbser.sys заточен лишь под модем, как и usbprint.sys - чисто под принтер. sad.gif
Налицо ситуация, когда мелкософтовцы отлаживали лишь приемную часть драйвера...
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Feb 24 2007, 15:23
Сообщение #7


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 - чисто под принтер. sad.gif
Налицо ситуация, когда мелкософтовцы отлаживали лишь приемную часть драйвера...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 24 2007, 21:47
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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. Они его сейчас вылизали. Работает как часы.

Ни кто не думал над этим?
Go to the top of the page
 
+Quote Post
ivstech
сообщение Feb 25 2007, 07:30
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 204
Регистрация: 5-01-06
Пользователь №: 12 860



[quote name='SasaVitebsk' date='Feb 25 2007, 00:47' post='215539']
[quote name='AlexandrY' post='215435' date='Feb 24 2007, 16:23']

Хотелось бы со стороны своего девайса с эмулировать наличие там FT232RL. Так, чтобы благополучно подходил драйвер от FTDI. Они его сейчас вылизали. Работает как часы.

Ни кто не думал над этим?
[/quote]

Вы прямо читаете мои мысли. На настоящий момент мое достижение ~80КБайт/сек. в WinXP с usbser.sys, данные в основном идут в устройство, обратно - подтверждения. Пока эта скорость устраивает.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 25 2007, 14:23
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(ivstech @ Feb 25 2007, 08:30) *
Цитата(SasaVitebsk @ Feb 25 2007, 00:47) *

Хотелось бы со стороны своего девайса с эмулировать наличие там FT232RL. Так, чтобы благополучно подходил драйвер от FTDI. Они его сейчас вылизали. Работает как часы.

Ни кто не думал над этим?


Вы прямо читаете мои мысли. На настоящий момент мое достижение ~80КБайт/сек. в WinXP с usbser.sys, данные в основном идут в устройство, обратно - подтверждения. Пока эта скорость устраивает.


Меня вообще за глаза.

А на каком проце вы делали? Чем "подсматривали"? Сложно ли реализовать оказалось?
Go to the top of the page
 
+Quote Post
ivstech
сообщение Feb 25 2007, 18:41
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 204
Регистрация: 5-01-06
Пользователь №: 12 860



Цитата(SasaVitebsk @ Feb 25 2007, 17:23) *
Меня вообще за глаза.

А на каком проце вы делали? Чем "подсматривали"? Сложно ли реализовать оказалось?


Я наверное, неправильно выразился. Была у меня мысль использовать драйвер от FTDI. Был у меня фирменный диск с FTDI, и там была таблица с описанием, какая информация берется из EEPROM, подключаемой к FT*** и по-моему, была там и таблица с дескрипторами, копию диска себе не делал.
Но пока я остановился на стандартном usbser.sys и получается 80КБайт/сек.
Процессор AT91SAM7S256. Переделываю BasicUSB по-маленьку. Сделал обработку по прерываниям (не уверен, правда, что это добавляет скорости). Ошибку исправил, я уже где-то об этом писал, может в этом топике, что не учитывают, когда длина блока передаваемых данных равна размеру конечной точки, надо передать еще пакет нулевой длины (информацию эту подчерпнул из книги Агурова). А вообще этот модуль с USB еще переделывать долго буду
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - 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


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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 14:58
Рейтинг@Mail.ru


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