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

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Вопрос про CY7C68013 EZ-USB FX2, Есть готовое устройство, нужно подключиться, не поломав.
Serg_Sm
сообщение Sep 8 2010, 10:21
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167



Цитата(niktagor @ Sep 8 2010, 13:48) *
Устройство сделано так, что я отправляю туда один запрос размером 1 байт. Оно в ответ выплевывает 8 транзакций по 512 байт и одну с sync packet'ом. Потом все повторяется заново. Так вот, эта операция должна занимать не больше 1 миллисекунды. А получается какая-то ерунда. Используя USB monitor, получаю удивительные результаты. Все работает сверхбыстро, пока куда-то не пропадают 15мс(смотри скриншот). Где искать причину?


Значит получение 4К данных по запросу - это хреново. Чтобы достичь приличной скорости по хорошему нужно выносить всю обработку в драйвер. А так попробуй поднять приоритет процесса до реал-тайм и кидать сразу несколько запросов (точное число проверяется экспериментально) в 1 байт асинхронно приему.

PS: Про 15мс тебе уже ответили.
PS2: Какой скорости приема нужно достичь?
Go to the top of the page
 
+Quote Post
niktagor
сообщение Sep 8 2010, 10:31
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601



Хорошо. Почему тогда этот другой процесс ВСЕГДА занимает 15мс? Приоритет процесса - реального времени. Запускается на втором ядре. Я могу как-то запустить его не в user mode, а в режиме ядра?

Цитата(Serg_Sm @ Sep 8 2010, 14:21) *
PS2: Какой скорости приема нужно достичь?


1000 таких запросов должно обрабатываться за секунду. Точнее, примерно 4МБ в секунду. Вроде, цифра детская

Ситуация странная. На каждую 1мс моих взаимодействий с прибором приходится 15мс потерянного времени. При том, что все остальные программы отключены и загрузка ЦП под 0%. Даже теоретическая максимальная скорость в этом случае всего 30Мбит в секунду.

P.S. Это если верить USB Monitor.

Сообщение отредактировал niktagor - Sep 8 2010, 11:05
Go to the top of the page
 
+Quote Post
Serg_Sm
сообщение Sep 8 2010, 11:19
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167



Цитата(niktagor @ Sep 8 2010, 14:31) *
Хорошо. Почему тогда этот другой процесс ВСЕГДА занимает 15мс? Приоритет процесса - реального времени. Запускается на втором ядре. Я могу как-то запустить его не в user mode, а в режиме ядра?
1000 таких запросов должно обрабатываться за секунду. Точнее, примерно 4МБ в секунду. Вроде, цифра детская


15 мс - так организован системный таймер виндов. Все претензии к одному богатому пенсионеру. В режиме ядра запустить виндовое приложение - хм... А вот написать службу, которая будет рулить потоком данных - это нормальный выход.
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Sep 8 2010, 11:29
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(Serg_Sm @ Sep 8 2010, 13:21) *
... и кидать сразу несколько запросов (точное число проверяется экспериментально) в 1 байт асинхронно приему.

Это поможет если firmware FX2LP умеет накапливать число запросов. Если нет, то есть, на каждый запрос выдается ответ в 4К, то это не поможет. А если firmware работает неправильно, то есть, по каждому запросу пытается выдать новые 512 байт не разбираясь, выданы ли предыдущие 4К, то это только усугубит ситуацию.
Go to the top of the page
 
+Quote Post
niktagor
сообщение Sep 8 2010, 12:03
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601



Про 15 миллисекунд разобрался. Это точность системного таймера в большинстве современных компьютеров. Например Sleep(1) и Sleep(8) обе вызывают задержку на 15 миллисекунд. Так что USB Monitor с большим разрешением время посчитать не сможет. И реальные тайминги я через нее не узнаю. Вопрос: можно ли их вообще узнать, не заглядывая в USB провод приборами?
Go to the top of the page
 
+Quote Post
Serg_Sm
сообщение Sep 8 2010, 12:48
Сообщение #21


Частый гость
**

Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167



В FX2LP есть аппаратная буферизация - как минимум 2 запроса должны пройти. Как отреагирует фирмварь это другой вопрос.
Определение временных интервалов с помощью high-resolution performance counter:
Код
#define GETFIRSTTICK()    LARGE_INTEGER qwTickCountA[2];    \
                        QueryPerformanceCounter(&(qwTickCountA[0]));

#define GETSECONDTICKMESSAGE()    { QueryPerformanceCounter(&(qwTickCountA[1]));    \
                                LARGE_INTEGER qwFrequencyA;    \
                                QueryPerformanceFrequency(&qwFrequencyA);    \
                                double dbTMPA = (double)(qwTickCountA[1].QuadPart - qwTickCountA[0].QuadPart)/(double)qwFrequencyA.QuadPart; \
                                char szMessageA[80];    \
                                sprintf(szMessageA,"Операция завершена за %.9f секунд", dbTMPA);    \
                                ::MessageBox(0, szMessageA, ("Время работы"), MB_OK | MB_ICONINFORMATION);}
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Sep 8 2010, 14:38
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(niktagor @ Sep 8 2010, 13:31) *
Ситуация странная. На каждую 1мс моих взаимодействий с прибором приходится 15мс потерянного времени.


Цитата(niktagor @ Sep 8 2010, 15:03) *
Про 15 миллисекунд разобрался. Это точность системного таймера в большинстве современных компьютеров. Например Sleep(1) и Sleep(8) обе вызывают задержку на 15 миллисекунд. Так что USB Monitor с большим разрешением время посчитать не сможет. И реальные тайминги я через нее не узнаю. Вопрос: можно ли их вообще узнать, не заглядывая в USB провод приборами?

Если USB Monitor серьезная программа, то для измерения промежутков времени будет использовать High-Resolution Timer (класс Stopwatch в .NET Framework). Скорее всего, в программе, которую Вы используете в цикле обмена по USB вызывается Sleep(1), что приводит к засыпанию потока Вашей программы, в котором выполняется обмен по USB на 15 миллисекунд.

Сообщение отредактировал Konst_777 - Sep 8 2010, 15:30
Go to the top of the page
 
+Quote Post
VladimirB
сообщение Sep 8 2010, 20:18
Сообщение #23


Знающий
****

Группа: Свой
Сообщений: 614
Регистрация: 12-06-09
Из: рядом с Москвой
Пользователь №: 50 219



Цитата(niktagor @ Sep 8 2010, 16:03) *
Про 15 миллисекунд разобрался. Это точность системного таймера в большинстве современных компьютеров. Например Sleep(1) и Sleep(8) обе вызывают задержку на 15 миллисекунд. Так что USB Monitor с большим разрешением время посчитать не сможет. И реальные тайминги я через нее не узнаю. Вопрос: можно ли их вообще узнать, не заглядывая в USB провод приборами?

Попробуйте параллельно запустить Windows Media Player в режиме воспроизведения видео или музыки -
- он повышает точность системного таймера до 1мс.

и все измерители времени и Sleep'ы будут работать точнее в 15 раз.
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Sep 9 2010, 11:54
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(niktagor @ Sep 8 2010, 12:48) *
... А получается какая-то ерунда. Используя USB monitor, получаю удивительные результаты. Все работает сверхбыстро, пока куда-то не пропадают 15мс(смотри скриншот). Где искать причину?

Цитата(niktagor @ Sep 8 2010, 15:03) *
Про 15 миллисекунд разобрался. ... Так что USB Monitor с большим разрешением время посчитать не сможет. И реальные тайминги я через нее не узнаю...

Эх, не посмотрел я скриншот и начал фантазировать. Да, Вы правы. USB Monitor не использует High-Resolution Timer. И реальные тайминги Вы с помощью этой программы не узнаете.
Go to the top of the page
 
+Quote Post
niktagor
сообщение Sep 9 2010, 17:24
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601



Прикрутил high-resolution timer. Выясняется, что между получаемыми пакетами задержка всегда ровно 250мкс. Это при том, что это все часть одной большой информации, и она выдается по одному запросу на 9 пакетов. Косяк явно не в приборе. Так как даже с родной программой и он выдает это быстрее. Использую метод XferData(). Посылка наперед нескольких запросов ситуацию не меняет. Завтра попробую использовать Begin\Wait\Finish DataXfer(). Есть смысл? В чем их принципиальное различие?
Go to the top of the page
 
+Quote Post
VladimirB
сообщение Sep 9 2010, 20:02
Сообщение #26


Знающий
****

Группа: Свой
Сообщений: 614
Регистрация: 12-06-09
Из: рядом с Москвой
Пользователь №: 50 219



Цитата(niktagor @ Sep 9 2010, 21:24) *
Прикрутил high-resolution timer. Выясняется, что между получаемыми пакетами задержка всегда ровно 250мкс. Это при том, что это все часть одной большой информации, и она выдается по одному запросу на 9 пакетов. Косяк явно не в приборе. Так как даже с родной программой и он выдает это быстрее. Использую метод XferData(). Посылка наперед нескольких запросов ситуацию не меняет. Завтра попробую использовать Begin\Wait\Finish DataXfer(). Есть смысл? В чем их принципиальное различие?

первый метод синхронный, второй асинхронный.
Асинхронный метод позволяет посылать следующий запрос на чтение данных драйверу не дожидаясь исполнения предыдущего и таким образом можно организовать очередь запросов на чтение и получить скорость до 40-50МБайт/c.

Но проблема в том, то у вас нужно посылать ещё и запрос устройству для того чтобы оно выдало данные -
вот тут главные тормоза, так как Маздай от билла гейтса не является ОС реального времени и быстро переключать потоки и задачи не умеет.



Go to the top of the page
 
+Quote Post
-Al-
сообщение Sep 10 2010, 04:57
Сообщение #27


Местный
***

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



Цитата(niktagor @ Sep 8 2010, 13:48) *
Устройство сделано так, что я отправляю туда один запрос размером 1 байт. Оно в ответ выплевывает 8 транзакций по 512 байт и одну с sync packet'ом. Потом все повторяется заново. Так вот, эта операция должна занимать не больше 1 миллисекунды. А получается какая-то ерунда. Используя USB monitor, получаю удивительные результаты. Все работает сверхбыстро, пока куда-то не пропадают 15мс(смотри скриншот). Где искать причину?
Вы НИКОГДА не получите 1мс на USB при запросе туда-обратно. Время на переключение направления Вы не уменьшите. Пробуйте посылать запросы не по одному байту, а пачками, маскимум - размер входного буфера на данном EndPoint. А потом вычитывать данные. Если устройство сделано нормально, то должно работать.
Go to the top of the page
 
+Quote Post
Седой
сообщение Sep 10 2010, 06:15
Сообщение #28


Местный
***

Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806



Цитата(-Al- @ Sep 10 2010, 10:57) *
....Вы НИКОГДА не получите 1мс на USB при запросе туда-обратно ...


НИКОГДА не говорите НИКОГДА

PS. Обсуждалось здесь http://electronix.ru/forum/index.php?showt...=37919&st=0
Go to the top of the page
 
+Quote Post
niktagor
сообщение Sep 10 2010, 08:30
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601



По поводу моих 250мкс по Вашей ссылке нашел интересное сообщеньице
Цитата
У шины время кадра на полной скорости 1 мС, а на высокой микрокадр - 0.125 мс. В течении этого времени в самом худшем случае ( это тот случай, если имеется простейший планировщик пакетов - один запрос в кадре) мы буим иметь задержки 2 мСек и 0.25 мСек соответственно.

В связи с этим, вопрос. Планировщик пакетов - это в cyusb.sys, или на более низком уровне?

Еще появилась идея перейти под linux и написать код для библиотеки libusb. На сайте написано, что вышла ее версия под Windows. Кто-нибудь пробовал? Есть ли смысл в моей ситуации?
Go to the top of the page
 
+Quote Post
-Al-
сообщение Sep 10 2010, 18:59
Сообщение #30


Местный
***

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



Цитата(Седой @ Sep 10 2010, 10:15) *
НИКОГДА не говорите НИКОГДА

PS. Обсуждалось здесь http://electronix.ru/forum/index.php?showt...=37919&st=0

Что Вы эти хотели сказать? Что время сколь угодно близко к 1мс, но все равно больше? И кто тут прав?? smile.gif Вот Ваше мнение.
И насколько мне известно, в USB2.0 микрофреймы не могут быть туда-обратно. Только фреймы так умеют. Потому мы в реалии и видим всегда, что в лучшем случае пара мс.
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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