fix(UML-1780): Перенес остальной код в обработчик прерывания

This commit is contained in:
algin 2023-09-26 16:29:18 +03:00
parent 8f643cd992
commit 66ae172d07
3 changed files with 63 additions and 19 deletions

View File

@ -170,12 +170,6 @@ void free_rtos::Eth::link_task()
{ {
for (int i = 0; i < macPortNum_; ++i) for (int i = 0; i < macPortNum_; ++i)
{ {
if(linkUp_[i] == true) {
ClockP_usleep(100000);
continue;
}
macPort = macPort_[i]; macPort = macPort_[i];
linkUp = false; linkUp = false;

View File

@ -28,27 +28,61 @@ 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; EnetDma_PktQ rxReadyQ;
uint32_t readyQCount; uint32_t readyQCount;
int32_t status; int32_t status;
if (rx_flow != nullptr) { if(rx_flow == nullptr) {
status = EnetDma_retrieveRxPktQ(rx_flow->dma_handle_, &rxReadyQ); return;
EnetAppUtils_assert(status == ENET_SOK); }
readyQCount = EnetQueue_getQCount(&rxReadyQ); status = EnetDma_retrieveRxPktQ(rx_flow->dma_handle_, &rxReadyQ);
EnetAppUtils_assert(status == ENET_SOK);
if(readyQCount == 0) { readyQCount = EnetQueue_getQCount(&rxReadyQ);
return;
if(readyQCount == 0) {
return;
}
// 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);
}
} }
// Reload DMA with a new rx free queue as fast as possible /// <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>.
rx_flow->reloadDmaRxPktQ(readyQCount); EnetDma_checkPktState(&rxPktInfo->pktState,
ENET_PKTSTATE_MODULE_APP,
ENET_PKTSTATE_APP_WITH_DRIVER,
ENET_PKTSTATE_APP_WITH_FREEQ);
EnetQueue_append(&rx_flow->rx_ready_pktq_, &rxReadyQ); /// <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);
rx_flow->sem_[EthRxFlow::e_signalRxPkt].post(); /// <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)
@ -96,7 +130,7 @@ void free_rtos::EthRxFlow::initRxFreePktQ(uint32_t qCount, void * appPriv)
EnetAppUtils_assert(EnetQueue_getQCount(&rxReadyQ) == 0U); EnetAppUtils_assert(EnetQueue_getQCount(&rxReadyQ) == 0U);
} }
void free_rtos::EthRxFlow::reloadDmaRxPktQ(uint32_t qCount) void free_rtos::EthRxFlow::submitFreeRxPkts(uint32_t qCount)
{ {
EnetDma_PktQ rxSubmitQ; EnetDma_PktQ rxSubmitQ;
EnetDma_Pkt* rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rx_free_pktq_); EnetDma_Pkt* rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rx_free_pktq_);
@ -138,6 +172,8 @@ void free_rtos::EthRxFlow::reloadDmaRxPktQ(uint32_t qCount)
void free_rtos::EthRxFlow::rxProcessPktTask() void free_rtos::EthRxFlow::rxProcessPktTask()
{ {
EnetDma_Pkt* rxPktInfo; /// <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EnetDma_Pkt* rxPktInfo; /// <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EnetDma_PktQ rxReadyQ;
uint32_t readyQCount;
int32_t status; int32_t status;
while(1) while(1)
@ -150,7 +186,21 @@ void free_rtos::EthRxFlow::rxProcessPktTask()
continue; 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);
EnetQueue_append(&rx_ready_pktq_, &rxReadyQ);
*/
rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rx_ready_pktq_); rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rx_ready_pktq_);
while(rxPktInfo != nullptr) while(rxPktInfo != nullptr)
@ -240,7 +290,7 @@ bool free_rtos::EthRxFlow::open(uint32_t id, int32_t enetDmaRxChId, UBaseType_t
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
initRxFreePktQ(ENET_SYSCFG_TOTAL_NUM_RX_PKT/2, this); initRxFreePktQ(ENET_SYSCFG_TOTAL_NUM_RX_PKT/2, this);
reloadDmaRxPktQ(ENET_SYSCFG_TOTAL_NUM_RX_PKT/4); submitFreeRxPkts(ENET_SYSCFG_TOTAL_NUM_RX_PKT/4);
open_ = true; open_ = true;

View File

@ -40,7 +40,7 @@ private:
friend void rxTaskHandler(void *appData); ///<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> friend void rxTaskHandler(void *appData); ///<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void initRxFreePktQ(uint32_t qCount, void * appPriv); void initRxFreePktQ(uint32_t qCount, void * appPriv);
void reloadDmaRxPktQ(uint32_t qCount); void submitFreeRxPkts(uint32_t qCount);
void rxProcessPktTask(); ///<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> void rxProcessPktTask(); ///<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>