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)
|
void free_rtos::rxIsrHandler(void *appData)
|
||||||
{
|
{
|
||||||
EthRxFlow * rx_flow = (EthRxFlow *)appData;
|
EthRxFlow * rx_flow = (EthRxFlow *)appData;
|
||||||
EnetDma_Pkt* rxPktInfo;
|
|
||||||
EnetDma_PktQ rxReadyQ;
|
|
||||||
uint32_t readyQCount;
|
|
||||||
int32_t status;
|
|
||||||
|
|
||||||
if(rx_flow == nullptr) {
|
if(rx_flow == nullptr) {
|
||||||
return;
|
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();
|
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)
|
void free_rtos::rxTaskHandler(void *appData)
|
||||||
@ -105,7 +51,6 @@ free_rtos::EthRxFlow::EthRxFlow(TEthFrameMacAddr& mac_addr, EthStackIface& eth_s
|
|||||||
passive_mode_{false}
|
passive_mode_{false}
|
||||||
{
|
{
|
||||||
EnetQueue_initQ(&rx_free_pktq_);
|
EnetQueue_initQ(&rx_free_pktq_);
|
||||||
EnetQueue_initQ(&rx_ready_pktq_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_rtos::EthRxFlow::initRxFreePktQ(uint32_t qCount, void * appPriv)
|
void free_rtos::EthRxFlow::initRxFreePktQ(uint32_t qCount, void * appPriv)
|
||||||
@ -188,58 +133,44 @@ void free_rtos::EthRxFlow::rxProcessPktTask()
|
|||||||
status = sem_[e_signalRxPkt].pend();
|
status = sem_[e_signalRxPkt].pend();
|
||||||
|
|
||||||
if(status != SystemP_SUCCESS) {
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reload DMA with a new rx free queue as fast as possible
|
do {
|
||||||
submitFreeRxPkts(readyQCount);
|
status = EnetDma_retrieveRxPktQ(dma_handle_, &rxReadyQ);
|
||||||
|
EnetAppUtils_assert(status == ENET_SOK);
|
||||||
|
|
||||||
EnetQueue_append(&rx_ready_pktq_, &rxReadyQ);
|
readyQCount = EnetQueue_getQCount(&rxReadyQ);
|
||||||
*/
|
|
||||||
rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rx_ready_pktq_);
|
|
||||||
|
|
||||||
while(rxPktInfo != nullptr)
|
if(readyQCount == 0) {
|
||||||
{
|
break;
|
||||||
/// <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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <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>.
|
// Reload DMA with a new rx free queue as fast as possible
|
||||||
EnetDma_checkPktState(&rxPktInfo->pktState,
|
submitFreeRxPkts(readyQCount);
|
||||||
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>
|
rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rxReadyQ);
|
||||||
EnetQueue_enq(&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>
|
while(rxPktInfo != nullptr) {
|
||||||
rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rx_ready_pktq_);
|
//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>
|
EnetDma_checkPktState(&rxPktInfo->pktState,
|
||||||
++rx_pkt_counter_;
|
ENET_PKTSTATE_MODULE_APP,
|
||||||
}
|
ENET_PKTSTATE_APP_WITH_DRIVER,
|
||||||
|
ENET_PKTSTATE_APP_WITH_FREEQ);
|
||||||
|
|
||||||
if(id_ == 1) {
|
EnetQueue_enq(&rx_free_pktq_, &rxPktInfo->node);
|
||||||
//TRY_DUMP_PROFILER(Test_static);
|
|
||||||
}
|
rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rxReadyQ);
|
||||||
|
|
||||||
|
++rx_pkt_counter_;
|
||||||
|
}
|
||||||
|
} while(readyQCount > 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -69,7 +69,6 @@ private:
|
|||||||
uint32_t rx_flow_idx_;
|
uint32_t rx_flow_idx_;
|
||||||
EnetDma_RxChHandle dma_handle_;
|
EnetDma_RxChHandle dma_handle_;
|
||||||
EnetDma_PktQ rx_free_pktq_;
|
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>
|
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());
|
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", );
|
//DebugP_log((char*)"rx_sem_ fake timeout detected !\r\n", );
|
||||||
|
|
||||||
continue;
|
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>
|
/// <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()) {
|
if (item == connections_.end()) {
|
||||||
|
EnetAppUtils_print("EthUdpServer::Process(): Port not found %d\r\n", port);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,11 +8,14 @@
|
|||||||
#ifndef FREE_RTOS_ETHERNET_IP_ETH_UDP_SERVER_HPP_
|
#ifndef FREE_RTOS_ETHERNET_IP_ETH_UDP_SERVER_HPP_
|
||||||
#define 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/handler_store/handler_store.hpp"
|
||||||
#include "free_rtos/ethernet_ip/eth_udp_server_iface.hpp"
|
#include "free_rtos/ethernet_ip/eth_udp_server_iface.hpp"
|
||||||
#include "free_rtos/ethernet_ip/eth_ip_iface.hpp"
|
#include "free_rtos/ethernet_ip/eth_ip_iface.hpp"
|
||||||
#include "free_rtos/ethernet/eth_types.h"
|
#include "free_rtos/ethernet/eth_types.h"
|
||||||
#include <map>
|
|
||||||
|
|
||||||
namespace free_rtos {
|
namespace free_rtos {
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user