Цитата(timofey_99 @ Dec 26 2007, 16:57)

Использую этот драйвер вместе с осью. Всё было красиво и радостно, пока не сунулся в реальную сетку с тяжёлым трафиком. Зависает, точнее попадает в вечный луп на переборе дискрипторов, не может найти конец фрейма, соответственно замирают задачи, что имеют приоритет пониже. Очень удручает такое поведение. Кто сталкивался, удалось вылечить?
У меня аппарат живет в реальной сети и пропускает 8kpps трафика.
emac драйвер написал сам, подводный камень приводящий к затыканию emac'a был только один -
для коротких пакетов (те что помещаются в одном дескрипторе) DMA может установить флаг окончания приема, до того как запишет его длину...
поэтому для вычитки фрейма одного только условия
RSR & AT91C_EMAC_REC
недостаточно.
надо также проверять длину принятого фрейма, и вытаскивать его только если не 0.
(Rx_Desc[idx].stat & RD_LENGTH_MASK )
Ну и по мелочи - проверять переполнение RX дескрипторов и делать Flush:
Код
if (RSR & (AT91C_EMAC_OVR | AT91C_EMAC_BNA))
{ // RX overrun or RX buffer not available
if (emacContext.RxOverrunAlert < U8_MAX)
emacContext.RxOverrunAlert += 1;
if (RSR & AT91C_EMAC_BNA)
{ // buffer not available
pEMAC->EMAC_NCR &= ~AT91C_EMAC_RE; // Stop Rx
rx_descr_init (); // All packet data is invalid, re-init RxDesc
pEMAC->EMAC_RSR = AT91C_EMAC_OVR | AT91C_EMAC_REC | AT91C_EMAC_BNA;
pEMAC->EMAC_NCR |= AT91C_EMAC_RE; // Restart Rx
}
}