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

 
 
> Проблема с отправкой п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 30 2010, 08:39
Сообщение #2


Гуру
******

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



Еще раз читаем документацию:
Цитата
WARNING: Due to synchronization between MCK and UDPCK, the software application must wait for the end of the write
operation before executing another write by polling the bits which must be set/cleared.

//! Clear flags of UDP UDP_CSR register and waits for synchronization
#define Udp_ep_clr_flag(pInterface, endpoint, flags) { \
pInterface->UDP_CSR[endpoint] &= ~(flags); \
while ( (pInterface->UDP_CSR[endpoint] & (flags)) == (flags) ); \
}

//! Set flags of UDP UDP_CSR register and waits for synchronization
#define Udp_ep_set_flag(pInterface, endpoint, flags) { \
pInterface->UDP_CSR[endpoint] |= (flags); \
while ( (pInterface->UDP_CSR[endpoint] & (flags)) != (flags) ); \
}

Note: In a preemptive environment, set or clear the flag and wait for a time of 1 UDPCK clock cycle and 1peripheral clock cycle. However,
RX_DATA_BLK0, TXPKTRDY, RX_DATA_BK1 require wait times of 3 UDPCK clock cycles and 3 peripheral clock cycles
before accessin DPR.

От себя добавлю, что на время выполнения Udp_ep_clr_flag и Udp_ep_set_flag нужно запрещать прерывания.
Go to the top of the page
 
+Quote Post



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

 


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


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