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

 
 
 
Reply to this topicStart new topic
> Как надежно принимать пакеты из устройства?, В смысле, чтобы не было пауз.
jur
сообщение Nov 3 2005, 05:17
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Здравствуйте!

Мое устройство выдает 512-байтные пакеты данных в шину USB в строгой последовательности. Шина нагружена совсем не много: пакет передается порядка 42 микросекунд, пауза между передачами - 80 микросекунд и более. Работы произвожу на PC с пентиумом 4, система WinXP.

Воспользовавшись примерами из USB Developer's uStudio, я набросал тестовое приложение, которое просто принимает пакеты из шины. Прием производится порциями (блоками) по 8 (пробовал 16) пакетов, т.е. 4-8 кбайт. Все прекрасно принимается до тех пор, пока Windows не залепит паузу. В результате получается, что время от времени один-два пакета выпадает.

Попробовал принимать по одному пакету - вообще кошмар, пропадает порядка половины пакетов (чуть меньше). Пропадание сильно уменьшается начиная с величины буфера приема порядка 2 кбайт.

Подскажите, пожалуйста, как лучше написать программу приема пакетов из шины USB, чтобы не было их пропадания? Мне никак нельзя терять пакеты. Все они гарантированно должны быть приняты.

Особенность моего железа такова, что я не могу буферировать пакеты на передающей стороне, они выдаются автоматом, беспрерывно. Поэтому приемная сторона должна гарантированно принимать переданные устройством пакеты.

Спасибо!


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
Виктория
сообщение Nov 3 2005, 11:01
Сообщение #2


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



Цитата(jur @ Nov 3 2005, 09:17)
...
Подскажите, пожалуйста, как лучше написать программу приема пакетов из шины USB, чтобы не было их пропадания? Мне никак нельзя терять пакеты. Все они гарантированно должны быть приняты.
...
*


Что же Вы здесь спрашиваете, когда Вам могут быстрее и профессиональней помочь в разделе форума "Операционные системы" (замечено, что некоторые участники из этого раздела в другие разделы никогда и не заходят).

Цитата
Особенность моего железа такова, что я не могу буферировать пакеты на передающей стороне, они выдаются автоматом, беспрерывно. Поэтому приемная сторона должна гарантированно принимать переданные устройством пакеты.


А на приемной стороне буферизировать тоже невозможно? (типа - непрерывный прием с использованием низкоуровневых системных функций)
Go to the top of the page
 
+Quote Post
jur
сообщение Nov 4 2005, 05:12
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(Vic1 @ Nov 3 2005, 14:01)
Что же Вы здесь спрашиваете, когда Вам могут быстрее и профессиональней помочь в разделе форума "Операционные системы" (замечено, что некоторые участники из этого раздела в другие разделы никогда и не заходят).
По двум причинам. Во-первых, мне нужно, чтобы мое устройство работало не с кем-либо, а именно с Windows XP. Поэтому общие рассуждения подобных форумов на тему: "Да поставь ты ОС РВ и не мучайся!", мне не подходят. А во-вторых, давно замечено, что профессионалы-практики дадут фору любому теоретику-системщику при решении конкретной задачи :-) Например, задачи освоения шины USB. Посему именно к профессионалам-практикам я и обратился :-)

Цитата(Vic1 @ Nov 3 2005, 14:01)
А на приемной стороне буферизировать тоже невозможно? (типа - непрерывный прием с использованием низкоуровневых системных функций)
На приемной стороне я как раз и буферирую. И очень даже с большим запасом (8, 16 пакетов и более). Тем не менее имею изредка пропуск единичных пакетов.

Однако, я немножко продвинулся в данном вопросе. Для этого я тщательно причесал пример "Streamer" из USB Developer's uStudio. Этот пример использует технику OVERLAPPED I/O, про все функции которого фирма Cypress не ленится десяток раз в разных местах мануала написать:

Цитата
You will usually want to use the synchronous XferData method rather than the asynchronous BeginDataXfer/WaitForXfer/FinishDataXfer approach.
Тем не менее я не послушался их мудрого совета и применил этот подход. Прием данных стал уверенным! Да еще я присвоил считывающему треду приоритет THREAD_PRIORITY_TIME_CRITICAL. Еще немножко погоняю приложение, посмотрю, на самом-ли деле проблема исчезла.


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
jur
сообщение Nov 7 2005, 17:53
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата
Еще немножко погоняю приложение, посмотрю, на самом-ли деле проблема исчезла.
Погонял. Причем в ужасных условиях. Забил процессор так, что даже Таск Менеджер по Ctrl-Alt-Del выскакивает только через 15-20 секунд :-) И ничего, ни одного сбоя. Хороший метод BeginDataXfer/WaitForXfer/FinishDataXfer! :-)


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post

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

 


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


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