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

 
 
> Вопрос по работе с UDP at91sam7s., Может ли захлебываться хост из-за большого потока от котроллера?
Bulat
сообщение Nov 27 2009, 06:45
Сообщение #1


Местный
***

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



Я отправляю на хост небольшими пакетами, не больше 55 байт, поэтому использую только один банк UDP. Основная задача, максимально уменьшить время работы с UDP, то есть мне необходимо записать в FIFO пакет данных, запустить UDP и больше не задерживаться с UDP. Прерывания UDP включены только для ЕР0. То есть, если при подготовки следующего пакета для передачи, UDP не готов, то передача этого пакета хосту пропускается (протокол допускает потерю данных) исходя из этих условий я составил следующую функцию записи в UDP:
Код
__ramfunc static uint AT91F_UDP_Write(AT91PS_CDC pCdc, u8 *pData, uint txlength)// Send through endpoint 2
{  
AT91PS_UDP pUDP = pCdc->pUdp;
uint cpt = 0;

//Если FIFO свободна, то производим запись, нет
if(!(pUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY))
{
  pUDP->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
  cpt = txlength;
  while (cpt--) pUDP->UDP_FDR[AT91C_EP_IN] = *pData++;
  pUDP->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
}

return txlength;
}

действительно ли такая функйия будет пропускать пакеты, в случае занятого буфера? или есть варианты более скоростной передачи по усб?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Nov 27 2009, 09:13
Сообщение #2


Гуру
******

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



Цитата(Bulat @ Nov 27 2009, 09:45) *
Я отправляю на хост небольшими пакетами, не больше 55 байт, поэтому использую только один банк UDP.

И как размер пакета может определить решение использовать или не использовать dual bank? Это совсем не связанные друг с другом вещи.

Цитата(Bulat @ Nov 27 2009, 09:45) *
действительно ли такая функйия будет пропускать пакеты, в случае занятого буфера?

Будет пропускать.

Цитата(Bulat @ Nov 27 2009, 09:45) *
или есть варианты более скоростной передачи по усб?

Используйте два банка.
Go to the top of the page
 
+Quote Post
Bulat
сообщение Nov 27 2009, 10:43
Сообщение #3


Местный
***

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



Цитата(aaarrr @ Nov 27 2009, 14:13) *
И как размер пакета может определить решение использовать или не использовать dual bank? Это совсем не связанные друг с другом вещи.


Будет пропускать.


Используйте два банка.


Вот таким образом правильно использовать 2 банка?:
Код
__ramfunc static uint AT91F_UDP_Write(AT91PS_CDC pCdc, u8 *pData, uint txlength)
{  
AT91PS_UDP pUDP = pCdc->pUdp;
uint cpt = 0;

if((pUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY)==0)
{
  Udp_ep_clr_flag(pUDP, AT91C_EP_IN, AT91C_UDP_TXCOMP);
  cpt = MIN(txlength, AT91C_EP_IN_SIZE);                        // Send the first packet
  cpt = txlength;
  txlength -= cpt;
  while (cpt--) pUDP->UDP_FDR[AT91C_EP_IN] = *pData++;
  Udp_ep_set_flag(pUDP, AT91C_EP_IN, AT91C_UDP_TXPKTRDY);
  //Udp_ep_clr_flag(pUDP, AT91C_EP_IN, AT91C_UDP_TXCOMP);                
  
  while(txlength)
    {
    cpt = MIN(txlength, AT91C_EP_IN_SIZE);                    // Fill the second bank
    txlength -= cpt;
    while(cpt--)pUDP->UDP_FDR[AT91C_EP_IN] = *pData++;
    while(!(pUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP))            // Wait for first bank sented
        {
        if(!AT91F_UDP_IsConfigured(pCdc))return txlength;
                }
    Udp_ep_set_flag(pUDP, AT91C_EP_IN, AT91C_UDP_TXPKTRDY);
    Udp_ep_clr_flag(pUDP, AT91C_EP_IN, AT91C_UDP_TXCOMP);
    }
}
return txlength;  
}
Go to the top of the page
 
+Quote Post



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

 


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


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