Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по работе с UDP at91sam7s.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Bulat
Я отправляю на хост небольшими пакетами, не больше 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;
}

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

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

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

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

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

Используйте два банка.
Bulat
Цитата(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;  
}
vmp
Вообще-то при таких условиях задачи я бы посмотрел на изохронный режим передачи. Там более или менее гарантируется полоса пропускания.
aaarrr
Рискуете надолго зависнуть здесь:
Код
while(!(pUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP))            // Wait for first bank sented
Bulat
Цитата(aaarrr @ Nov 27 2009, 16:01) *
Рискуете надолго зависнуть здесь:
Код
while(!(pUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP))            // Wait for first bank sented

я же без прерываний работаю. как мне тогда узнать, что первый банк отправлен и можно второй отправлять?
aaarrr
Цитата(Bulat @ Nov 27 2009, 14:06) *
я же без прерываний работаю. как мне тогда узнать, что первый банк отправлен и можно второй отправлять?

И хорошо, что без прерываний - для передачи они не нужны по большому счету.
Узнать поллингом, только программу нужно идеологически переработать, чтобы иметь возможность переодически осуществлять эту проверку.
Bulat
Цитата(vmp @ Nov 27 2009, 15:59) *
Вообще-то при таких условиях задачи я бы посмотрел на изохронный режим передачи. Там более или менее гарантируется полоса пропускания.

просто я делаю устройство под готовый драйвер, а в драйвре ЕР настроены под режим bulk


Цитата(aaarrr @ Nov 27 2009, 16:11) *
И хорошо, что без прерываний - для передачи они не нужны по большому счету.
Узнать поллингом, только программу нужно идеологически переработать, чтобы иметь возможность переодически осуществлять эту проверку.

а что за поллинг? можно поподробнее узнать об этом или пример небольшой?
aaarrr
Цитата(Bulat @ Nov 27 2009, 14:15) *
а что за поллинг? можно поподробнее узнать об этом или пример небольшой?

Обычный переодический опрос TXCOMP. Если установлен - устанавливаем TXPKTRDY, сбрасываем TXCOMP и можем загружать следующую порцию данных.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.