基於Enc28j60的LwIP(1 4 1)移植

2021-08-18 05:00:14 字數 1860 閱讀 6607

移植過程比較容易,網上一堆教程,本文主要將low_level_output和low_level_input針對enc28j60做一些優化,減少資料拷貝。

網上比較多的應該是如下**:

static err_t

low_level_output(struct netif *netif, struct pbuf *p)

}if(packet_len == p->tot_len)

lwip_platform_diag(("packettx error! packet_len=%"u32_f",tot_len=%"u32_f"\n\t", packet_len, p->tot_len));

return err_buf;

}

static struct pbuf *

low_level_input(struct netif *netif)

/* we allocate a pbuf chain of pbufs from the pool. */

p = pbuf_alloc(pbuf_raw, packet_len, pbuf_pool);

if(p != null) 

} else 

return p; 

}

從中可以看到有使用memcpy拷貝資料,大量資料通訊時,會花費大量時間在拷貝上,為此做如下修改:

static err_t

low_level_output(struct netif *netif, struct pbuf *p)

static struct pbuf *

low_level_input(struct netif *netif)

err_t pkt_send(struct pbuf *pkt_buf)

return err_ok;

}

static void packet_in(struct pbuf *pkt_buf)

}enc28j60_csh();

}

struct pbuf *pkt_recv(void)

packet_len = get_pkt_length();

if(packet_len == 0)

/* we allocate a pbuf chain of pbufs from the pool. */

pkt_buf = pbuf_alloc(pbuf_raw, packet_len, pbuf_pool);

if(pkt_buf != null) 

enc28j60_write(erxrdptl, (nextpacketptr));

enc28j60_write(erxrdpth, (nextpacketptr)>>8);

enc28j60_write_op(enc28j60_bit_field_set, econ2, econ2_pktdec);

return pkt_buf; 

}

static uint16_t get_pkt_length(void)

if((rx_status & 0x80)==0)

return pkt_len;

}

static void packet_out(struct pbuf *pkt_buf)

}enc28j60_csh();

}

以上操作可以避免memcpy的使用,除了做如上優化,還可以將spi讀寫buff改為dma讀寫。

ENC28J60學習筆記 第4部分

0.相關資料 相關資料中包括其他精彩博文和 倉庫 嵌入式 tcp ip 資料彙總 enc28j60學習筆記 索引 第1部分 第2部分 第3部分 第4部分 stm32net學習筆記 索引 uip學習筆記 lwip學習筆記 stm32 enc28j60移植與入門 6 enc28j60初始化操作 enc2...

ENC28J60學習筆記 第3部分

相關資料中包括其他精彩博文和 倉庫 嵌入式 tcp ip 資料彙總 enc28j60學習筆記 索引 第1部分 第2部分 第3部分 第4部分 stm32net學習筆記 索引 uip學習筆記 通過enc28j60傳送乙太網資料報,操作enc28j60硬體緩衝區的傳送部分即可。每次傳送時總是從傳送緩衝區的...

ENC28J60學習筆記 第4部分

相關資料中包括其他精彩博文和 倉庫 嵌入式 tcp ip 資料彙總 enc28j60學習筆記 索引 第1部分 第2部分 第3部分 第4部分 stm32net學習筆記 索引 uip學習筆記 enc28j60初始化操作內容較多。第一,進行cs埠的相關配置,即把該埠設定為輸出狀態,該部分 可以出現在任何硬...