Сегодня выявил следующий баг.
Цитата
DWORD EmacTxData(DWORD *Buf, DWORD Len)
{
pEMACDATA pEthData = &Data;
DWORD idx;
DWORD produce, consume;
if(Len>0)
{
do
{
produce = LPC_EMAC->TxProduceIndex;
consume = LPC_EMAC->TxConsumeIndex;
}
while(produce != consume); //////-------------- индексы равны даже, когда пакет еще отправляется!!!!!!!!
// опеределяем номер текущего дескриптора
idx = LPC_EMAC->TxProduceIndex;
pEthData->DmaTx[idx].addr = Buf;
pEthData->DmaTx[idx].ctrl = (Len-1) | 0xF4000000; //(1<<30) | (1<<31) | (1<<29) | (1<<28) | (1<<26); // прерывание включено (бит 31)
if (++idx == ENET_DMA_TXDESC_NUMB)
idx = 0;
if(idx > LPC_EMAC->TxDescriptorNumber) return (FALSE);
LPC_EMAC->TxProduceIndex = idx;
}
return(TRUE);
}
{
pEMACDATA pEthData = &Data;
DWORD idx;
DWORD produce, consume;
if(Len>0)
{
do
{
produce = LPC_EMAC->TxProduceIndex;
consume = LPC_EMAC->TxConsumeIndex;
}
while(produce != consume); //////-------------- индексы равны даже, когда пакет еще отправляется!!!!!!!!
// опеределяем номер текущего дескриптора
idx = LPC_EMAC->TxProduceIndex;
pEthData->DmaTx[idx].addr = Buf;
pEthData->DmaTx[idx].ctrl = (Len-1) | 0xF4000000; //(1<<30) | (1<<31) | (1<<29) | (1<<28) | (1<<26); // прерывание включено (бит 31)
if (++idx == ENET_DMA_TXDESC_NUMB)
idx = 0;
if(idx > LPC_EMAC->TxDescriptorNumber) return (FALSE);
LPC_EMAC->TxProduceIndex = idx;
}
return(TRUE);
}
Когда запускаю эту функцию в цикле, например из 15 пакетов, то половина пакетов не отправляется, это хорошо видно при помощи WireShark. Стоит между отправкой поставить задержку в 100 мкс, то после этого все пакеты отправляются исправно. Т.е. похоже происходит "нахлест" между пакетами. Подскажите, в чем может быть дело? Ошибка процессора или PHY?