未验证 提交 5c6e7d81 编写于 作者: S sheltonyu 提交者: GitHub

optimize code to improve network throughput performance (#6157)

上级 1fec9dc5
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
* Change Logs: * Change Logs:
* Date Author Notes * Date Author Notes
* 2022-05-16 shelton first version * 2022-05-16 shelton first version
* 2022-07-11 shelton optimize code to improve network throughput
* performance
*/ */
#include "drv_emac.h" #include "drv_emac.h"
...@@ -22,8 +24,8 @@ ...@@ -22,8 +24,8 @@
#define CRYSTAL_ON_PHY 0 #define CRYSTAL_ON_PHY 0
/* emac memory buffer configuration */ /* emac memory buffer configuration */
#define EMAC_NUM_RX_BUF 4 /* 0x1800 for rx (4 * 1536 = 6k) */ #define EMAC_NUM_RX_BUF 5 /* rx (5 * 1500) */
#define EMAC_NUM_TX_BUF 2 /* 0x0600 for tx (2 * 1536 = 3k) */ #define EMAC_NUM_TX_BUF 5 /* tx (5 * 1500) */
#define MAX_ADDR_LEN 6 #define MAX_ADDR_LEN 6
...@@ -49,8 +51,6 @@ extern emac_dma_desc_type *dma_rx_desc_to_get, *dma_tx_desc_to_set; ...@@ -49,8 +51,6 @@ extern emac_dma_desc_type *dma_rx_desc_to_get, *dma_tx_desc_to_set;
static rt_uint8_t *rx_buff, *tx_buff; static rt_uint8_t *rx_buff, *tx_buff;
static struct rt_at32_emac at32_emac_device; static struct rt_at32_emac at32_emac_device;
static uint8_t phy_addr = 0xFF; static uint8_t phy_addr = 0xFF;
static struct rt_semaphore tx_wait;
static rt_bool_t tx_is_waiting = RT_FALSE;
#if defined(EMAC_RX_DUMP) || defined(EMAC_TX_DUMP) #if defined(EMAC_RX_DUMP) || defined(EMAC_TX_DUMP)
#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ') #define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
...@@ -123,7 +123,6 @@ static void phy_reset(void) ...@@ -123,7 +123,6 @@ static void phy_reset(void)
rt_thread_mdelay(2000); rt_thread_mdelay(2000);
} }
/** /**
* @brief phy clock config * @brief phy clock config
*/ */
...@@ -143,7 +142,6 @@ static void phy_clock_config(void) ...@@ -143,7 +142,6 @@ static void phy_clock_config(void)
gpio_init_struct.gpio_pins = GPIO_PINS_8; gpio_init_struct.gpio_pins = GPIO_PINS_8;
gpio_init(GPIOA, &gpio_init_struct); gpio_init(GPIOA, &gpio_init_struct);
/* 9162 clkout output 25 mhz */ /* 9162 clkout output 25 mhz */
/* 83848 clkout output 50 mhz */ /* 83848 clkout output 50 mhz */
#if defined (SOC_SERIES_AT32F407) #if defined (SOC_SERIES_AT32F407)
...@@ -444,22 +442,15 @@ static rt_err_t rt_at32_emac_control(rt_device_t dev, int cmd, void *args) ...@@ -444,22 +442,15 @@ static rt_err_t rt_at32_emac_control(rt_device_t dev, int cmd, void *args)
*/ */
rt_err_t rt_at32_emac_tx(rt_device_t dev, struct pbuf *p) rt_err_t rt_at32_emac_tx(rt_device_t dev, struct pbuf *p)
{ {
rt_err_t ret = RT_ERROR;
struct pbuf *q; struct pbuf *q;
rt_uint32_t offset; rt_uint32_t offset;
while ((dma_tx_desc_to_set->status & EMAC_DMATXDESC_OWN) != RESET) if ((dma_tx_desc_to_set->status & EMAC_DMATXDESC_OWN) != RESET)
{ {
rt_err_t result; LOG_D("buffer not valid");
rt_uint32_t level; ret = ERR_USE;
goto __error;
level = rt_hw_interrupt_disable();
tx_is_waiting = RT_TRUE;
rt_hw_interrupt_enable(level);
/* it's own bit set, wait it */
result = rt_sem_take(&tx_wait, RT_WAITING_FOREVER);
if (result == RT_EOK) break;
if (result == -RT_ERROR) return -RT_ERROR;
} }
offset = 0; offset = 0;
...@@ -499,6 +490,18 @@ rt_err_t rt_at32_emac_tx(rt_device_t dev, struct pbuf *p) ...@@ -499,6 +490,18 @@ rt_err_t rt_at32_emac_tx(rt_device_t dev, struct pbuf *p)
dma_tx_desc_to_set = (emac_dma_desc_type*) (dma_tx_desc_to_set->buf2nextdescaddr); dma_tx_desc_to_set = (emac_dma_desc_type*) (dma_tx_desc_to_set->buf2nextdescaddr);
return ERR_OK; return ERR_OK;
__error:
if (emac_dma_flag_get(EMAC_DMA_UNF_FLAG) != (uint32_t)RESET)
{
/* clear underflow ethernet dma flag */
emac_dma_flag_clear(EMAC_DMA_UNF_FLAG);
/* resume dma transmission*/
EMAC_DMA->tpd = 0;
}
return ret;
} }
/** /**
...@@ -581,24 +584,6 @@ void EMAC_IRQHandler(void) ...@@ -581,24 +584,6 @@ void EMAC_IRQHandler(void)
/* enter interrupt */ /* enter interrupt */
rt_interrupt_enter(); rt_interrupt_enter();
/* clear received it */
if(emac_dma_flag_get(EMAC_DMA_NIS_FLAG) != RESET)
{
emac_dma_flag_clear(EMAC_DMA_NIS_FLAG);
}
if(emac_dma_flag_get(EMAC_DMA_AIS_FLAG) != RESET)
{
emac_dma_flag_clear(EMAC_DMA_AIS_FLAG);
}
if(emac_dma_flag_get(EMAC_DMA_OVF_FLAG) != RESET)
{
emac_dma_flag_clear(EMAC_DMA_OVF_FLAG);
}
if(emac_dma_flag_get(EMAC_DMA_RBU_FLAG) != RESET)
{
emac_dma_flag_clear(EMAC_DMA_RBU_FLAG);
}
/* packet receiption */ /* packet receiption */
if (emac_dma_flag_get(EMAC_DMA_RI_FLAG) == SET) if (emac_dma_flag_get(EMAC_DMA_RI_FLAG) == SET)
{ {
...@@ -610,13 +595,25 @@ void EMAC_IRQHandler(void) ...@@ -610,13 +595,25 @@ void EMAC_IRQHandler(void)
/* packet transmission */ /* packet transmission */
if (emac_dma_flag_get(EMAC_DMA_TI_FLAG) == SET) if (emac_dma_flag_get(EMAC_DMA_TI_FLAG) == SET)
{ {
if (tx_is_waiting == RT_TRUE) emac_dma_flag_clear(EMAC_DMA_TI_FLAG);
}
/* clear normal interrupt */
emac_dma_flag_clear(EMAC_DMA_NIS_FLAG);
/* clear dma error */
if(emac_dma_flag_get(EMAC_DMA_AIS_FLAG) != RESET)
{
if(emac_dma_flag_get(EMAC_DMA_RBU_FLAG) != RESET)
{ {
tx_is_waiting = RT_FALSE; emac_dma_flag_clear(EMAC_DMA_RBU_FLAG);
rt_sem_release(&tx_wait); }
if(emac_dma_flag_get(EMAC_DMA_OVF_FLAG) != RESET)
{
emac_dma_flag_clear(EMAC_DMA_OVF_FLAG);
} }
emac_dma_flag_clear(EMAC_DMA_TI_FLAG); emac_dma_flag_clear(EMAC_DMA_AIS_FLAG);
} }
/* leave interrupt */ /* leave interrupt */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册