fix(SF-60): Исправлен баг приема драйвера ethernet. Добавлены логи

This commit is contained in:
algin 2023-10-18 15:29:31 +03:00
parent 12f93c8ddc
commit c3ca4b1e32
5 changed files with 34 additions and 99 deletions

View File

@ -29,66 +29,12 @@ using namespace free_rtos;
void free_rtos::rxIsrHandler(void *appData)
{
EthRxFlow * rx_flow = (EthRxFlow *)appData;
EnetDma_Pkt* rxPktInfo;
EnetDma_PktQ rxReadyQ;
uint32_t readyQCount;
int32_t status;
if(rx_flow == nullptr) {
return;
}
if(rx_flow->id_ == 1) {
//STOP_PROFILER_STATIC_ITEM(Test_static, 128, 0);
}
//status = EnetDma_retrieveRxPktQ(rx_flow->dma_handle_, &rxReadyQ);
//EnetAppUtils_assert(status == ENET_SOK);
// Shortcut. Requires access to private header enet_udma_priv.h
EnetQueue_initQ(&rxReadyQ);
EnetQueue_append(&rxReadyQ, &rx_flow->dma_handle_->cqIsrQ);
EnetQueue_initQ(&rx_flow->dma_handle_->cqIsrQ);
readyQCount = EnetQueue_getQCount(&rxReadyQ);
// Reload DMA with a new rx free queue as fast as possible
rx_flow->submitFreeRxPkts(readyQCount);
EnetQueue_append(&rx_flow->rx_ready_pktq_, &rxReadyQ);
rx_flow->sem_[EthRxFlow::e_signalRxPkt].post();
/*
rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rxReadyQ);
while(rxPktInfo != nullptr)
{
/// <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (!rx_flow->passive_mode_)
{
/// <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int j = 0 ; j < rxPktInfo->sgList.numScatterSegments; ++j)
{
rx_flow->eth_stack_.rx_handler(rxPktInfo->sgList.list[j].bufPtr, rxPktInfo->sgList.list[j].segmentFilledLen);
}
}
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
EnetDma_checkPktState(&rxPktInfo->pktState,
ENET_PKTSTATE_MODULE_APP,
ENET_PKTSTATE_APP_WITH_DRIVER,
ENET_PKTSTATE_APP_WITH_FREEQ);
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EnetQueue_enq(&rx_flow->rx_free_pktq_, &rxPktInfo->node);
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rxReadyQ);
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
++rx_flow->rx_pkt_counter_;
}
*/
}
void free_rtos::rxTaskHandler(void *appData)
@ -105,7 +51,6 @@ free_rtos::EthRxFlow::EthRxFlow(TEthFrameMacAddr& mac_addr, EthStackIface& eth_s
passive_mode_{false}
{
EnetQueue_initQ(&rx_free_pktq_);
EnetQueue_initQ(&rx_ready_pktq_);
}
void free_rtos::EthRxFlow::initRxFreePktQ(uint32_t qCount, void * appPriv)
@ -188,58 +133,44 @@ void free_rtos::EthRxFlow::rxProcessPktTask()
status = sem_[e_signalRxPkt].pend();
if(status != SystemP_SUCCESS) {
//EnetAppUtils_print("rx_flow %u: Warning ! No rx packets timeout.\r\n", id_);
continue;
}
/*
status = EnetDma_retrieveRxPktQ(dma_handle_, &rxReadyQ);
EnetAppUtils_assert(status == ENET_SOK);
readyQCount = EnetQueue_getQCount(&rxReadyQ);
if(readyQCount == 0) {
continue;
}
// Reload DMA with a new rx free queue as fast as possible
submitFreeRxPkts(readyQCount);
do {
status = EnetDma_retrieveRxPktQ(dma_handle_, &rxReadyQ);
EnetAppUtils_assert(status == ENET_SOK);
EnetQueue_append(&rx_ready_pktq_, &rxReadyQ);
*/
rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rx_ready_pktq_);
readyQCount = EnetQueue_getQCount(&rxReadyQ);
while(rxPktInfo != nullptr)
{
/// <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (!passive_mode_)
{
/// <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int j = 0 ; j < rxPktInfo->sgList.numScatterSegments; ++j)
{
eth_stack_.rx_handler(rxPktInfo->sgList.list[j].bufPtr, rxPktInfo->sgList.list[j].segmentFilledLen);
}
if(readyQCount == 0) {
break;
}
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
EnetDma_checkPktState(&rxPktInfo->pktState,
ENET_PKTSTATE_MODULE_APP,
ENET_PKTSTATE_APP_WITH_DRIVER,
ENET_PKTSTATE_APP_WITH_FREEQ);
// Reload DMA with a new rx free queue as fast as possible
submitFreeRxPkts(readyQCount);
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EnetQueue_enq(&rx_free_pktq_, &rxPktInfo->node);
rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rxReadyQ);
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rx_ready_pktq_);
while(rxPktInfo != nullptr) {
//if (!passive_mode_) {
for (int j = 0 ; j < rxPktInfo->sgList.numScatterSegments; ++j)
{
eth_stack_.rx_handler(rxPktInfo->sgList.list[j].bufPtr, rxPktInfo->sgList.list[j].segmentFilledLen);
}
//}
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
++rx_pkt_counter_;
}
EnetDma_checkPktState(&rxPktInfo->pktState,
ENET_PKTSTATE_MODULE_APP,
ENET_PKTSTATE_APP_WITH_DRIVER,
ENET_PKTSTATE_APP_WITH_FREEQ);
if(id_ == 1) {
//TRY_DUMP_PROFILER(Test_static);
}
EnetQueue_enq(&rx_free_pktq_, &rxPktInfo->node);
rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rxReadyQ);
++rx_pkt_counter_;
}
} while(readyQCount > 0);
}
}

View File

@ -69,7 +69,6 @@ private:
uint32_t rx_flow_idx_;
EnetDma_RxChHandle dma_handle_;
EnetDma_PktQ rx_free_pktq_;
EnetDma_PktQ rx_ready_pktq_;
bool passive_mode_; /// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};

View File

@ -155,7 +155,7 @@ bool EcatTelegram::transfer() {
tick_counter_diff = diff(tick_counter_start, ecat_timer_.GetTickCounter());
if((sts != SystemP_SUCCESS) && (tick_counter_diff < counter_timeout_ticks_ - 1)) {
if((sts != SystemP_SUCCESS) && ( tick_counter_diff < (counter_timeout_ticks_ - 1) )) {
//DebugP_log((char*)"rx_sem_ fake timeout detected !\r\n", );
continue;

View File

@ -54,6 +54,8 @@ int32_t free_rtos::EthUdpServer::Process(uint8_t * p_data, uint32_t len)
/// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (item == connections_.end()) {
EnetAppUtils_print("EthUdpServer::Process(): Port not found %d\r\n", port);
return 0;
}

View File

@ -8,11 +8,14 @@
#ifndef FREE_RTOS_ETHERNET_IP_ETH_UDP_SERVER_HPP_
#define FREE_RTOS_ETHERNET_IP_ETH_UDP_SERVER_HPP_
#include <map>
#include <networking/enet/utils/include/enet_apputils.h>
#include "free_rtos/handler_store/handler_store.hpp"
#include "free_rtos/ethernet_ip/eth_udp_server_iface.hpp"
#include "free_rtos/ethernet_ip/eth_ip_iface.hpp"
#include "free_rtos/ethernet/eth_types.h"
#include <map>
namespace free_rtos {