fix(UML-1780): Перенес остальной код в обработчик прерывания
This commit is contained in:
parent
8f643cd992
commit
66ae172d07
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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>
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user