Forger 22 3 мая, 2017 Опубликовано 3 мая, 2017 · Жалоба Ниже пункта 1 описал, что изменение кода приводит к снятию эффекта Причем даже отключение несвязанных между собой программных блоков приводит к снятию эффекта Вероятно, код спроектирован не совсем неудачно. Лечится создание пустого проекта и отладкой каждого модуля по-отдельности, независимо от других. Собираем все вместе только после этого. И то собираем все по-одному модуля, проверяя и тестируя каждый шаг. Если оставить один Eth, подозреваю висяка не будетВсе подозрения и предположения нужно заменять фактами ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 226 3 мая, 2017 Опубликовано 3 мая, 2017 · Жалоба Вероятно, код спроектирован не совсем неудачно. Удалённая отладка по сообщениям на форуме - вещь неблагодарная! PS: Имхо - вначале нужно сделать хотя-бы обработку исключений. С этого я начинаю любой проект. Тогда, возможно, некоторые исключения уже сами покажут на места багов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k000858 0 23 мая, 2017 Опубликовано 23 мая, 2017 · Жалоба Может быть кому то поможет. Нашлось решение проблемы, пока сам не допонял, чем именно помогло При отключении хардварного подсчета контрольной суммы, скорость работы интерфейса повысилась (что логично), а генерации пакетов снизилась. Снять эффект зависания интерфейса можно, например, искусственно замедлив скорость интерфейса (тоже самое происходит при работе хардварного подсчета срс), вставив задержку или лишнее отладочное сообщение в функции приёма 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; Есть у кого то понимание, как это могло помочь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться