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

 
 
> Проблема с отправкой пaкетов по UDP (AT91SAM7S), наблюдаются пропуски пакетов при приеме
Bulat
сообщение Mar 25 2010, 09:56
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Ниже приведен кусок основного цикла программы, отвечающий за формирование и отправку данных через UDP. При приеме данных на хост периодически теряются пакеты (60 байт), а то и по несколько пакетов за раз. Количество потерь возрастает, если подключать девайс к более слабой машине.
Код
while(1)
{
      if(recA_1)         //если 32-битное слово готово к отправке на хост                                                    
          {  
            if(!(regUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY))  //если свободен буфер UDP
            {
              unsigned int crc = 0;
              unsigned int by = recA_1;
              for(unsigned int ib=0;ib<32;ib++)  //Подсчет бита четности
              {
                crc = crc^(by&0x1);  
                by >>=1;
              }
              if(crc)
              {
              unsigned int rec = recA_1;
              regUDP->UDP_FDR[AT91C_EP_IN] = 11;        //командное слово
              regUDP->UDP_FDR[AT91C_EP_IN] = rec&0xff;    //Разбивка 32-битного передаваемого слова на байты                
              unsigned int m_stat = rec>>8;        
              regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
              m_stat = rec>>16;
              regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
              m_stat = rec>>24;
              regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
              kA--;  // счетчик записанных слов в FIFO UDP
              }// if(rcrc1)
            }
            recA_1 = 0;
            
            if(kA==0)  //Если FIFO заполнен (12 слов по 5 байт, 60 байт)
            {
              regUDP->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
              regUDP->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);            
              kA=12;
            }  
          }

}//while(1)


Почему потеря при приеме хостом идет пакетами? Как пользоваться 2-мя банками при передачи на хост?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Mar 25 2010, 12:26
Сообщение #2


Гуру
******

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



Нет.
Go to the top of the page
 
+Quote Post
Bulat
сообщение Mar 25 2010, 12:44
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Цитата(aaarrr @ Mar 25 2010, 17:26) *
Нет.

надо ожидать TXCOMP, только потом повторную запись производить?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 25 2010, 13:36
Сообщение #4


Гуру
******

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



Цитата(Bulat @ Mar 25 2010, 15:44) *
надо ожидать TXCOMP, только потом повторную запись производить?

Да. И TXCOMP можно снимать только после установки TXPKTRDY.
Go to the top of the page
 
+Quote Post
Bulat
сообщение Mar 25 2010, 15:05
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Цитата(aaarrr @ Mar 25 2010, 18:36) *
Да. И TXCOMP можно снимать только после установки TXPKTRDY.

Я не могу зависать программу на ожидании TXCOMP, поэтому я сделал следующим образом
Код
while(1)                                    // MAIN infinite LOOP
{        
        
       if(f_wr_b0 == 1) //первая запись в банк
       {
            if(!(regUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY))
            {
              ...
              //заполнение буфера
              ...
              kA--;              
            }
            
            if(kA==0)
            {
              regUDP->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
              kA=12;
              f_wr_b0 = 0;
            }
        }//if(f_wr_b0 == 1)

        else //последующие записи в банк
        {
            if(regUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP)
            {
              regUDP->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
              
              ...
              //заполнение буфера
              ...
              kA--;    
            }
            
            if(kA==0)
            {
              regUDP->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
              kA=12;
            }
        }  
      
}//while(1)

но так вообще перестала работать...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 25 2010, 15:44
Сообщение #6


Гуру
******

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



Цитата(Bulat @ Mar 25 2010, 18:05) *
Я не могу зависать программу на ожидании TXCOMP...

Придется смочь.
Go to the top of the page
 
+Quote Post
Bulat
сообщение Mar 25 2010, 18:03
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Цитата(aaarrr @ Mar 25 2010, 20:44) *
Придется смочь.

Я попытался через 2 банка передавать данные на хост
CODE

while(1) // MAIN infinite LOOP
{
if(bank == 0)
{
if(!(regUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY))
{
//заполняем первый банк
...
}

if(kA==0)
{
bank = 1;
regUDP->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
kA=12;
}

}

else //if(bank = 1)
{
if(chTXC == 0) //второй банк не заполнен
{
//заполняем второй банк
...
if(kA==0) chTXC = 1;

}

else //второй банк заполнен
{
if(regUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP)
{
chTXC = 0;
regUDP->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
regUDP->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
kA = 12;
}
}//else chTXC == 1

}//else if(bank = 1)
}

То есть тут я не задерживаю выполнение основного цикла программы на ожидании TXCOMP, а просто периодически опрашиваю его в основном цикле. Но так нестабильно работает. Бывает нормально, стабильно передает данные по USB, а бывает почти сразу захлебывается и перестает передавать. И всеравно пропусков много.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 07:25
Рейтинг@Mail.ru


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