[Ethernet]

- optimize packet transfer to EMAC

[Test_GPIO]
- only create packet once too speed up burst TX

git-svn-id: http://moon:8086/svn/mips@64 a8ebac50-d88d-4704-bea3-6648445a41b3
This commit is contained in:
2015-12-13 18:07:51 +00:00
parent 55d383181b
commit 5c62994932
2 changed files with 19 additions and 5 deletions
+15 -1
View File
@@ -75,6 +75,7 @@ uint32_t Eth_pkt_send(packet_t *pPacket)
volatile uint32_t *pEmac_ctrl = (uint32_t*)SYS_EMAC_TX_CTRL; volatile uint32_t *pEmac_ctrl = (uint32_t*)SYS_EMAC_TX_CTRL;
volatile uint32_t *pEmac_size = (uint32_t*)SYS_EMAC_TX_SIZE; volatile uint32_t *pEmac_size = (uint32_t*)SYS_EMAC_TX_SIZE;
volatile uint32_t *pEmac_data = (uint32_t*)SYS_EMAC_DATA; volatile uint32_t *pEmac_data = (uint32_t*)SYS_EMAC_DATA;
uint32_t *pData = (uint32_t*)pPacket->pkt_buf;
uint32_t i, num_words, num_bytes; uint32_t i, num_words, num_bytes;
@@ -90,9 +91,22 @@ uint32_t Eth_pkt_send(packet_t *pPacket)
if (num_bytes & 3) if (num_bytes & 3)
num_words++; num_words++;
while(num_words >= 8)
{
*pEmac_data = pData[i+0];
*pEmac_data = pData[i+1];
*pEmac_data = pData[i+2];
*pEmac_data = pData[i+3];
*pEmac_data = pData[i+4];
*pEmac_data = pData[i+5];
*pEmac_data = pData[i+6];
*pEmac_data = pData[i+7];
i += 8;
num_words -= 8;
}
for (i=0; i < num_words; i++) for (i=0; i < num_words; i++)
{ {
*pEmac_data = ((uint32_t*)pPacket->pkt_buf)[i]; *pEmac_data = pData[i];
} }
EMAC_TX_commit(); EMAC_TX_commit();
+3 -3
View File
@@ -200,7 +200,7 @@ int main()
volatile uint32_t *pEmac_data = (uint32_t*)SYS_EMAC_DATA_CACHED; volatile uint32_t *pEmac_data = (uint32_t*)SYS_EMAC_DATA_CACHED;
volatile uint32_t *pEmac_maddr = (uint32_t*)SYS_EMAC_MADDR; volatile uint32_t *pEmac_maddr = (uint32_t*)SYS_EMAC_MADDR;
volatile uint8_t *pEmac_maddr8 = (uint8_t*)SYS_EMAC_MADDR; volatile uint8_t *pEmac_maddr8 = (uint8_t*)SYS_EMAC_MADDR;
uint8_t buffer[2048], data[1024]; uint8_t buffer[2048], data[1460];
packet_t packet; packet_t packet;
ARP *pARP; ARP *pARP;
IPV4 *pIPV4; IPV4 *pIPV4;
@@ -385,10 +385,10 @@ int main()
*/ */
start = clock(); start = clock();
Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, eth_bcst);
UDP_create(&packet, myIP, 10001, arpIpDst, 10002, data, sizeof(data));
for (j=0; j < 10000; j++) for (j=0; j < 10000; j++)
{ {
Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, eth_bcst);
UDP_create(&packet, myIP, 10001, arpIpDst, 10002, data, sizeof(data));
size = Eth_pkt_send(&packet); size = Eth_pkt_send(&packet);
tx_byte_cnt += size; tx_byte_cnt += size;
tx_pkt_cnt++; tx_pkt_cnt++;