移植過程比較容易,網上一堆教程,本文主要將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埠的相關配置,即把該埠設定為輸出狀態,該部分 可以出現在任何硬...