fix(UML-1780): Добавлена упреждающая перезарядка DMA

This commit is contained in:
algin 2023-09-22 10:59:11 +03:00
parent cc4ee9225c
commit 692be72ffc
5 changed files with 54 additions and 44 deletions

View File

@ -67,6 +67,8 @@ bool free_rtos::Eth::Init(Settings& sett)
for (int i = 0; i < macPortNum_; ++i) {
linkUp_[i] = false;
macPort_[i] = sett.macPort[i];
rxTaskPriority_[i] = sett.rxTaskPriority[i];
rxTaskStackSize_[i] = sett.rxTaskStackSize[i];
}
core_id_ = EnetSoc_getCoreId();
@ -223,7 +225,7 @@ void free_rtos::Eth::link_task()
continue;
}
if (!rx_flow_[i].open(i, ENET_DMA_RX_CH0 + i))
if (!rx_flow_[i].open(i, ENET_DMA_RX_CH0 + i, rxTaskPriority_[i], rxTaskStackSize_[i]))
{
EnetAppUtils_print("link_task: %s: Failed to open rx flow: %u\n", name_.c_str(), i);
continue;

View File

@ -47,6 +47,8 @@ public:
/* Peripheral's MAC ports to use */
Enet_MacPort macPort[e_ethMacTotal];
UBaseType_t rxTaskPriority[e_ethMacTotal];
UBaseType_t rxTaskStackSize[e_ethMacTotal];
/* Number of MAC ports in macPorts array */
uint32_t macPortNum;
@ -106,6 +108,8 @@ private:
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mac <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Enet_MacPort macPort_[e_ethMacTotal];
UBaseType_t rxTaskPriority_[e_ethMacTotal];
UBaseType_t rxTaskStackSize_[e_ethMacTotal];
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MAC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t macPortNum_;

View File

@ -7,7 +7,6 @@
#include "free_rtos/ethernet/eth_rx_flow.hpp"
#include <networking/enet/core/include/core/enet_soc.h>
#include <networking/enet/core/include/core/enet_queue.h>
#include <networking/enet/utils/include/enet_board.h>
#include <networking/enet/utils/include/enet_appmemutils.h>
#include <networking/enet/utils/include/enet_appmemutils_cfg.h>
@ -42,17 +41,22 @@ void free_rtos::rxTaskHandler(void *appData)
}
}
static void eth_initRxReadyPktQ(EnetDma_RxChHandle hRxCh, void * appPriv)
free_rtos::EthRxFlow::EthRxFlow(TEthFrameMacAddr& mac_addr, EthStackIface& eth_stack) :
mac_addr_{mac_addr},
eth_stack_{eth_stack},
passive_mode_{false}
{
EnetQueue_initQ(&rx_free_pktq_);
}
void free_rtos::EthRxFlow::initRxFreePktQ(uint32_t qCount, void * appPriv)
{
EnetDma_PktQ rxReadyQ;
EnetDma_PktQ rxFreeQ;
EnetDma_Pkt *pPktInfo;
uint32_t i;
int32_t status;
EnetQueue_initQ(&rxFreeQ);
for (i = 0U; i < (ENET_SYSCFG_TOTAL_NUM_RX_PKT/2); ++i)
for (i = 0U; i < qCount; ++i)
{
pPktInfo = EnetMem_allocEthPkt(appPriv,
ENET_MEM_LARGE_POOL_PKT_SIZE,
@ -61,40 +65,47 @@ static void eth_initRxReadyPktQ(EnetDma_RxChHandle hRxCh, void * appPriv)
ENET_UTILS_SET_PKT_APP_STATE(&pPktInfo->pktState, ENET_PKTSTATE_APP_WITH_FREEQ);
EnetQueue_enq(&rxFreeQ, &pPktInfo->node);
EnetQueue_enq(&rx_free_pktq_, &pPktInfo->node);
}
/* Retrieve any packets which are ready */
EnetQueue_initQ(&rxReadyQ);
status = EnetDma_retrieveRxPktQ(hRxCh, &rxReadyQ);
status = EnetDma_retrieveRxPktQ(dma_handle_, &rxReadyQ);
EnetAppUtils_assert(status == ENET_SOK);
/* There should not be any packet with DMA during init */
EnetAppUtils_assert(EnetQueue_getQCount(&rxReadyQ) == 0U);
}
EnetAppUtils_validatePacketState(&rxFreeQ,
void free_rtos::EthRxFlow::reloadDmaRxPktQ(uint32_t qCount)
{
EnetDma_PktQ rxSubmitQ;
EnetDma_Pkt* rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rx_free_pktq_);
EnetQueue_initQ(&rxSubmitQ);
while((rxPktInfo != nullptr) && (qCount > 0))
{
EnetQueue_enq(&rxSubmitQ, &rxPktInfo->node);
rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rx_free_pktq_);
qCount--;
}
EnetAppUtils_validatePacketState(&rxSubmitQ,
ENET_PKTSTATE_APP_WITH_FREEQ,
ENET_PKTSTATE_APP_WITH_DRIVER);
EnetDma_submitRxPktQ(hRxCh, &rxFreeQ);
EnetDma_submitRxPktQ(dma_handle_, &rxSubmitQ);
/* Assert here, as during init, the number of DMA descriptors should be equal to
* the number of free Ethernet buffers available with app */
EnetAppUtils_assert(EnetQueue_getQCount(&rxFreeQ) == 0U);
}
free_rtos::EthRxFlow::EthRxFlow(TEthFrameMacAddr& mac_addr, EthStackIface& eth_stack) :
mac_addr_{mac_addr},
eth_stack_{eth_stack},
passive_mode_{false}
{
EnetAppUtils_assert(EnetQueue_getQCount(&rxSubmitQ) == 0U);
}
void free_rtos::EthRxFlow::rxProcessPktTask()
{
EnetDma_PktQ rxReadyQ; /// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
EnetDma_PktQ rxFreeQ; /// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EnetDma_Pkt* rxPktInfo; /// <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int32_t status;
@ -105,13 +116,14 @@ void free_rtos::EthRxFlow::rxProcessPktTask()
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
EnetQueue_initQ(&rxReadyQ);
EnetQueue_initQ(&rxFreeQ);
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> rxReadyQ
status = EnetDma_retrieveRxPktQ(dma_handle_, &rxReadyQ);
EnetAppUtils_assert(status == ENET_SOK);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Reload DMA with a new rx free queue as fast as possible
reloadDmaRxPktQ(EnetQueue_getQCount(&rxReadyQ));
rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rxReadyQ);
while(rxPktInfo != nullptr)
@ -133,7 +145,7 @@ void free_rtos::EthRxFlow::rxProcessPktTask()
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(&rxFreeQ, &rxPktInfo->node);
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>
rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rxReadyQ);
@ -141,22 +153,10 @@ void free_rtos::EthRxFlow::rxProcessPktTask()
/// <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_;
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ENET_PKTSTATE_APP_WITH_FREEQ)
* <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ENET_PKTSTATE_APP_WITH_DRIVER. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EnetDma_checkPktState.
*/
EnetAppUtils_validatePacketState(&rxFreeQ,
ENET_PKTSTATE_APP_WITH_FREEQ,
ENET_PKTSTATE_APP_WITH_DRIVER);
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EnetDma_submitRxPktQ(dma_handle_, &rxFreeQ);
}
}
bool free_rtos::EthRxFlow::open(uint32_t id, int32_t enetDmaRxChId)
bool free_rtos::EthRxFlow::open(uint32_t id, int32_t enetDmaRxChId, UBaseType_t task_priority, UBaseType_t task_stack_size)
{
EnetApp_GetDmaHandleInArgs rxInArgs;
EnetApp_GetRxDmaHandleOutArgs rxChInfo;
@ -170,7 +170,7 @@ bool free_rtos::EthRxFlow::open(uint32_t id, int32_t enetDmaRxChId)
return true;
}
if (!rx_task.Create("rx_task", RX_TASK_PRIORITY, rxTaskHandler, this, RX_TASK_STACK_SIZE))
if (!rx_task.Create("rx_task", task_priority, rxTaskHandler, this, task_stack_size))
{
EnetAppUtils_print("rx_flow %u: failed to create rx task.\r\n", id_);
return false;
@ -212,7 +212,8 @@ bool free_rtos::EthRxFlow::open(uint32_t id, int32_t enetDmaRxChId)
}
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
eth_initRxReadyPktQ(dma_handle_, this);
initRxFreePktQ(ENET_SYSCFG_TOTAL_NUM_RX_PKT/2, this);
reloadDmaRxPktQ(ENET_SYSCFG_TOTAL_NUM_RX_PKT/4);
open_ = true;

View File

@ -10,6 +10,8 @@
#include <cstdint>
#include <networking/enet/core/include/dma/udma/enet_udma.h>
#include <networking/enet/core/include/core/enet_dma.h>
#include <networking/enet/core/include/core/enet_queue.h>
#include "free_rtos/handler_store/handler_store.hpp"
#include "free_rtos/semaphore/semaphore.hpp"
@ -25,7 +27,7 @@ class EthRxFlow {
public:
EthRxFlow(TEthFrameMacAddr& mac_addr, EthStackIface& eth_stack);
bool open(uint32_t id, int32_t enetDmaRxChId);
bool open(uint32_t id, int32_t enetDmaRxChId, UBaseType_t task_priority, UBaseType_t task_stack_size);
bool is_open() {return open_;}
@ -37,6 +39,9 @@ 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>
void initRxFreePktQ(uint32_t qCount, void * appPriv);
void reloadDmaRxPktQ(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>
private:
@ -62,6 +67,7 @@ private:
uint32_t rx_start_flow_idx_;
uint32_t rx_flow_idx_;
EnetDma_RxChHandle dma_handle_;
EnetDma_PktQ rx_free_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

@ -13,10 +13,7 @@
#include "free_rtos/task/task.hpp"
namespace free_rtos {
static constexpr uint32_t RX_TASK_PRIORITY = Task::TaskPriorityHiest - 2;
static constexpr uint32_t RX_TASK_STACK_SIZE = (10U * 1024U);
static constexpr uint32_t LINK_TASK_PRIORITY = 2;
static constexpr uint32_t LINK_TASK_PRIORITY = tskIDLE_PRIORITY + 2;
static constexpr uint32_t LINK_TASK_STACK_SIZE = (10U * 1024U);
}