fix(SF-60): Исправлен баг приема драйвера ethernet. Добавлены логи
This commit is contained in:
parent
12f93c8ddc
commit
c3ca4b1e32
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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>
|
||||
};
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user