Может быть кому то поможет. Нашлось решение проблемы, пока сам не допонял, чем именно помогло
При отключении хардварного подсчета контрольной суммы, скорость работы интерфейса повысилась (что логично), а генерации пакетов снизилась.
Снять эффект зависания интерфейса можно, например, искусственно замедлив скорость интерфейса (тоже самое происходит при работе хардварного подсчета срс), вставив задержку или лишнее отладочное сообщение в функции приёма eth-фрейма
Так же пофиксить зависание удалось следующим способом: в функции приёма фрейма в месте
Код
/* Set Own bit in Rx descriptors: gives the buffers back to DMA */
for (i=0; i< EthHandle.RxFrameInfos.SegCount; i++)
{
dmarxdesc->Status |= ETH_DMARXDESC_OWN;
dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr);
}
/* Clear Segment_Count */
EthHandle.RxFrameInfos.SegCount =0;
сделать так:
Код
/* Set Own bit in Rx descriptors: gives the buffers back to DMA */
FlagStatus next_owned = RESET; // флаг занятости следующего дескриптора
for (i=0; i< EthHandle.RxFrameInfos.SegCount; i++)
{
dmarxdesc->Status |= ETH_DMARXDESC_OWN;
dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr);
// MY: если после смены дескриптора на следующий он не свободен
if((dmarxdesc->Status & ETH_DMARXDESC_OWN) == (uint32_t)RESET)
next_owned = SET;
}
/* Clear Segment_Count */
if(next_owned == RESET) // если следующий дескриптор не занят DMA
EthHandle.RxFrameInfos.SegCount =0;
Есть у кого то понимание, как это могло помочь?