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

 
 
 
Reply to this topicStart new topic
> пропажа пакетов на USB
Sagittarius
сообщение Mar 11 2009, 17:18
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659



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

Есть AT91SAM7SE512. Одна из endpoint сконфигурена на прием как bulk, 64 байта. От PC из верхнего софта посылаются пакеты по 2кбайта, которые где то внутри виндов бьются по 64 байта и сваливаются в микроконтроллер. Скорость обмена примерно 200кб/сек на прием и столько же на передачу. Проблема в том, что иногда какой ни будь из этих кусков по 64 байта пропадает.
Собственно вопрос - это нормальная ситуация или чего то в программе надо/можно подправить?

Спасибо.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Mar 11 2009, 17:28
Сообщение #2


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(Sagittarius @ Mar 11 2009, 21:18) *
Здравствуйте.

Есть AT91SAM7SE512. Одна из endpoint сконфигурена на прием как bulk, 64 байта. От PC из верхнего софта посылаются пакеты по 2кбайта, которые где то внутри виндов бьются по 64 байта и сваливаются в микроконтроллер. Скорость обмена примерно 200кб/сек на прием и столько же на передачу. Проблема в том, что иногда какой ни будь из этих кусков по 64 байта пропадает.
Собственно вопрос - это нормальная ситуация или чего то в программе надо/можно подправить?

Спасибо.


Чего-то в программе поправить нужно.
Go to the top of the page
 
+Quote Post
galjoen
сообщение Mar 11 2009, 17:41
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(Sagittarius @ Mar 11 2009, 20:18) *

Программу на базе примера делали? Если так, то ничего удивительного. Примеры они такие...
А вообще, скорее всего у вас ACK в ответ на битый пакет от хоста шлётся. Как в изохронном режиме.
Или приём разрешается до того, как буфер прочитан.
Go to the top of the page
 
+Quote Post
Sagittarius
сообщение Mar 11 2009, 18:17
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659



Цитата(galjoen @ Mar 11 2009, 20:41) *
Программу на базе примера делали? Если так, то ничего удивительного. Примеры они такие...
А вообще, скорее всего у вас ACK в ответ на битый пакет от хоста шлётся. Как в изохронном режиме.
Или приём разрешается до того, как буфер прочитан.

прогу сам писал, просто сделал класс USB который теперь таскаю из проекта в проект правя дескрипторы: стандартная клава, CDC, свой драйвер. Вся работа на прерывании.
А как управлять отсылкой ACK? при вызове прерывания я смотрю что пришли данные и в правильный банк, вычитываю, сбрасываю флаг прихода данных (AT91C_UDP_RX_DATA_BKx) и собственно все. В ручную ACK-ом шевелить даже не знаю как laughing.gif
Так как ожидается приход не одного пакета в 64 байта а кучи данных в 2к то есть таймаут и проверка на целостность, и иногда какой то из пакетов теряется (приблизительно 1 на 2-10 миллиона в тестах с максимальной нагрузкой). Сейчас это решено на уровне софта в МК и PC через повторы, но причину хочу найти и устранить.
Go to the top of the page
 
+Quote Post
galjoen
сообщение Mar 11 2009, 18:43
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(Sagittarius @ Mar 11 2009, 21:17) *
прогу сам писал, просто сделал класс USB который теперь таскаю из проекта в проект правя дескрипторы: стандартная клава, CDC, свой драйвер. Вся работа на прерывании.
А как управлять отсылкой ACK? при вызове прерывания я смотрю что пришли данные и в правильный банк, вычитываю, сбрасываю флаг прихода данных (AT91C_UDP_RX_DATA_BKx) и собственно все. В ручную ACK-ом шевелить даже не знаю как laughing.gif
Так как ожидается приход не одного пакета в 64 байта а кучи данных в 2к то есть таймаут и проверка на целостность, и иногда какой то из пакетов теряется (приблизительно 1 на 2-10 миллиона в тестах с максимальной нагрузкой). Сейчас это решено на уровне софта в МК и PC через повторы, но причину хочу найти и устранить.

Видимо в вашем случае отправкой ACK управлять невозможно - такое железо. Я с ним не работал. Но MassStorage сделал, и ни разу пакеты не терял. Хорошо бы сниффером посмотреть был-ли этот пакет действительно послан, но 2..10 миллионов... Могу предположить, что с чередованием DATA0/1 что-то не то. У вас это проверяется? Я о том, что при приходе 2х пакетом с одинаковым маркером DATA подряд жел-но сравнить данные (и длину конечно) в них между собой. Если разные - пакет был пропущен. В этом случае обычно STALL хосту слать надо в ответ на следующий маркер.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 11 2009, 18:51
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Управлять ACK, разумеется, можно - для этого достаточно просто не читать данные из буфера. По поводу глюка могу только предположить, что у Вас каким-то образом сбрасывается чужой AT91C_UDP_RX_DATA_BKx в редких случаях. Выложите код чтения буфера - посмотрим.
Go to the top of the page
 
+Quote Post
Sagittarius
сообщение Mar 11 2009, 20:21
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659



Цитата(aaarrr @ Mar 11 2009, 21:51) *
Управлять ACK, разумеется, можно - для этого достаточно просто не читать данные из буфера. По поводу глюка могу только предположить, что у Вас каким-то образом сбрасывается чужой AT91C_UDP_RX_DATA_BKx в редких случаях. Выложите код чтения буфера - посмотрим.

э ... про AT91C_UDP_RX_DATA_BKx ... спасибо за мысль, есть один аттавизм от первых экспериментов с USB - чистка регистров после чтения принятых данных.
а с ACK - я так понимаю что если в процессе передачи произошел сбой и чего то там внутри USB device не сошлось то пакет наверх даже не выйдет, а если выйдет так правильный? и тогда его нет смысла не вычитывать.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 11 2009, 20:27
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Я, наверное, не совсем понятно выразил свою мысль: если у Вас в буфере уже есть пакет, то он однозначно правильный, и модуль UDP уже дал ACK хосту. Но до тех пор, пока программа этот буфер не вычитает, хосту будут идти NAK'и на последующие попытки передачи. Таким способом можно только управлять потоком.
Go to the top of the page
 
+Quote Post

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

 


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


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