RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于DWC_ether_qos的以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-無(wú)OS環(huán)境移植LWIP

嵌入式USB開(kāi)發(fā) ? 來(lái)源:嵌入式Lee ? 作者:嵌入式Lee ? 2023-09-06 08:40 ? 次閱讀

本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注

基于DWC_ether_qos的以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-無(wú)OS環(huán)境移植LWIP (qq.com)

https://mp.weixin.qq.com/s/u1Bv6s_oh7jZ3sjS3nxbEA

一.前言

前面我們實(shí)現(xiàn)了數(shù)據(jù)的收發(fā),現(xiàn)在我們就可以移植協(xié)議棧了。LWIP是一個(gè)適合嵌入式平臺(tái)的著名的輕量級(jí)協(xié)議棧,我們這一篇就來(lái)無(wú)OS環(huán)境移植LWIP,下一篇再基于RTOS移植LWIP。

二.源碼

LWIP官網(wǎng)如下

https://savannah.nongnu.org/projects/lwip/

下載源碼git clone https://git.savannah.nongnu.org/git/lwip.git

LWIP的代碼可移植性非常好src下的源碼完全可移植不需要任何修改,移植參考contribports下的模板即可,已經(jīng)有了unix,freertos,win32的移植可參考。

三.NONEOS移植

3.1添加文件

將src復(fù)制到自己的工程路徑

然后添加一個(gè)port文件夾和src并列,無(wú)OS移植就添加一個(gè)noneos子目錄。

.

其中port如下,相關(guān)的文件可以從其他port下復(fù)制過(guò)來(lái)修改。

ports/

添加源文件

將src文件夾復(fù)制到自己的工程,添加源碼

src/api下所有c

src/core下所有c

src/core/ipv4下所有c

src/core/ipv6下所有c

src/netif/ethernet.c,netif下還有其他很多接口實(shí)現(xiàn),用到可以使用對(duì)應(yīng)的,我們這里只需要使用ethernet.c

頭文件路徑

將目錄src/include,ports/noneos/include添加到頭文件包含路徑。

3.2 移植文件

修改修改的文件

Ports下文件是需要修改的

ports/

lwipopts.h

配置文件,使用宏對(duì)LWIP進(jìn)行配置。

Cc.h

必須位于arch目錄下

Perf.h/perf.c

portethif.h/portethif.c

sys_arch.c

錯(cuò)誤碼

lwipopts.h中定義#define LWIP_PROVIDE_ERRNO 1則

src/include/lwip/errno.h中定義錯(cuò)誤編碼和變量errno。

(我們這里使用該方式)

否則cc.h中需要include 或者自己實(shí)現(xiàn)錯(cuò)誤碼宏定義和errno變量。

src/include/lwip/errno.h中可知,如果已經(jīng)有了對(duì)應(yīng)的頭文件則

可以定義LWIP_ERRNO_STDINCLUDE則自動(dòng)#include

否則錯(cuò)誤頭文件由LWIP_ERRNO_INCLUDE定義。

隨機(jī)數(shù)產(chǎn)生接口

如果有stdint.h則直接使用庫(kù)函數(shù),否則自行實(shí)現(xiàn)

Cc.h中

#include

extern unsigned int lwip_port_rand(void);

#define LWIP_RAND() (lwip_port_rand())

portethif.c中實(shí)現(xiàn)

#include

uint32_t lwip_port_rand(void)

{

return (uint32_t)rand();

}

斷言

不使用斷言,Cc.h中定義

#define LWIP_NOASSERT 1

如果定義了LWIP_NOASSERT則LWIP_ASSERT為空

如果使用斷言,沒(méi)有定義LWIP_NOASSERT

則src/lib/lwip/lwip/src/include/lwip/debug.h中

#define LWIP_ASSERT(message, assertion) do { if (!(assertion)) {

LWIP_PLATFORM_ASSERT(message); }} while(0)

此時(shí)需要實(shí)現(xiàn)LWIP_PLATFORM_ASSERT宏,

如果沒(méi)有定義LWIP_PLATFORM_ASSERT宏則默認(rèn)使用printf

則src/lib/lwip/lwip/src/include/lwip/arch.h中

#define LWIP_PLATFORM_ASSERT(x) do {printf("Assertion "%s" failed at line %d in %sn",

x, __LINE__, __FILE__); fflush(NULL); abort();} while(0)

atoi

Stdlib.h中有實(shí)現(xiàn),如果沒(méi)有該庫(kù)可以如下源碼實(shí)現(xiàn)

/*----------------------------------------------*/

時(shí)鐘

lwip/ports/noneos/sys_arch.c下實(shí)現(xiàn)

u32_t sys_now(void)返回mS的全局時(shí)間。

存儲(chǔ)管理

lwip/ports/noneos/include/lwipopts.h中配置

堆管理

LWIP_RAM_HEAP_POINTER定義堆地址,必須要空間足夠大。

未定義則mem.c中定義大數(shù)組ram_heap

MEM_ALIGNMENT設(shè)置堆對(duì)齊

MEM_SIZE設(shè)置堆字節(jié)大小

lwip_init->mem_init時(shí)初始化,代碼位于mem.c

內(nèi)存池

pbuf.c調(diào)用memp.的接口

lwip_init->memp_init時(shí)初始化,代碼位于memp.c

lwip/priv/memp_priv.h中定義各個(gè)組件需要的內(nèi)存池

lwip/ports/noneos/include/lwipopts.h中MEMP_NUM_xxx定義大小。

性能測(cè)試接口

lwipopts.h中如果配置LWIP_PERF宏則

arch/perf.h需要實(shí)現(xiàn)兩個(gè)宏

PERF_START

PERF_STOP

在perf.c/perf.h中具體實(shí)現(xiàn)

否則這兩個(gè)宏自動(dòng)置空。

一個(gè)參考實(shí)現(xiàn)如下

Perf.h

#ifndef LWIP_ARCH_PERF_H

perf.c

#include 

可以看到指定接口執(zhí)行時(shí)間打印如下

wKgaomT31GyAV2MOAAAICZ45IBE418.png

系統(tǒng)層接口

無(wú)OS時(shí)不需要實(shí)現(xiàn)相關(guān)接口

src/lib/lwip/ports/noneos/include/lwipopts.h中

#define NO_SYS 1

NO_SYS=1時(shí)不能使用socket相關(guān)接口

#define LWIP_NETCONN 0

#define LWIP_SOCKET 0

以太網(wǎng)收發(fā)接口相關(guān)

實(shí)現(xiàn)以下幾個(gè)函數(shù)即可

實(shí)現(xiàn)初始化函數(shù)lwip_port_eth_init

在netif_add(&netif, (const ip_addr_t *)&ipaddr, (const ip_addr_t *)&netmask, (const ip_addr_t *)&gw, NULL, &lwip_port_eth_init, eernet_input);時(shí)調(diào)用執(zhí)行l(wèi)wip_port_eth_init

實(shí)現(xiàn)low_level_output,在執(zhí)行l(wèi)wip_port_eth_init時(shí)綁定到回調(diào)函數(shù)

netif->linkoutput = low_level_output;

收到一包數(shù)據(jù)時(shí)調(diào)用

lwip_port_eth_input

Portethif.h

#ifndef LWIP_TAPIF_H

Portethif.c

#include 

四.測(cè)試

以下忽略了平臺(tái)相關(guān)的操作,比如以太網(wǎng)驅(qū)動(dòng)初始化等,僅保留lwip相關(guān)內(nèi)容。

#include "lwip/netif.h"

收到包時(shí)調(diào)用

lwip_port_eth_input(&netif, p_data, len);

初始化與主循環(huán)

 /* 在PHY初始化后,尤其是RXC輸出之后才調(diào)用,因?yàn)镚MAC復(fù)位需要RXC */ 

使用網(wǎng)口調(diào)試工具,發(fā)送數(shù)據(jù)收到后原樣返回。

wKgZomT31GyAO6PAAAEaypu-RkI193.png

五.總結(jié)

LWIP代碼移植性非常好,無(wú)OS支持也非常好,移植只需要實(shí)現(xiàn)平臺(tái)相關(guān)的配置和宏,實(shí)現(xiàn)網(wǎng)口收發(fā)接口即可。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 以太網(wǎng)
    +關(guān)注

    關(guān)注

    40

    文章

    5419

    瀏覽量

    171590
  • LwIP
    +關(guān)注

    關(guān)注

    2

    文章

    86

    瀏覽量

    27146
  • 驅(qū)動(dòng)開(kāi)發(fā)

    關(guān)注

    0

    文章

    130

    瀏覽量

    12072
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-MAC幀格式介紹

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-MAC幀格式介紹 (qq.com) 一.前言 ? 在以太網(wǎng)
    的頭像 發(fā)表于 08-30 09:23 ?2357次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-MAC幀格式介紹

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-MDIO驅(qū)動(dòng)編寫(xiě)與測(cè)試

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-MDIO驅(qū)動(dòng)編寫(xiě)與測(cè)試 一.前言
    的頭像 發(fā)表于 08-30 09:37 ?3734次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-MDIO<b class='flag-5'>驅(qū)動(dòng)</b>編寫(xiě)與測(cè)試

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-描述符鏈表介紹

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 一.描述符概述 1.0 前言 對(duì)于DWC Ethernet QoS驅(qū)動(dòng)的編寫(xiě)來(lái)說(shuō),初始化完成之后,核心操作就是DMA的描述符鏈表配置(linked list
    的頭像 發(fā)表于 08-30 09:39 ?4494次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-描述符鏈表介紹

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-數(shù)據(jù)流驗(yàn)證過(guò)程

    轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 https://mp.weixin.qq.com/s/klrHhaLMM_0W3FGVwHXFkA 基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-數(shù)據(jù)流驗(yàn)證過(guò)程
    的頭像 發(fā)表于 08-31 08:41 ?2007次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-數(shù)據(jù)流驗(yàn)證過(guò)程

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-收發(fā)驅(qū)動(dòng)編寫(xiě)與調(diào)試

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-收發(fā)驅(qū)動(dòng)編寫(xiě)與調(diào)試 (qq.com) https://mp.wei
    的頭像 發(fā)表于 09-05 08:47 ?2316次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-收發(fā)<b class='flag-5'>驅(qū)動(dòng)</b>編寫(xiě)與調(diào)試

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-LWIP的內(nèi)存池介紹

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 https://mp.weixin.qq.com/s/mBoGSf_u9edFF01U_OZT9g 一.前言 lwIP為基礎(chǔ)結(jié)構(gòu)提供了專(zhuān)用的內(nèi)存池管理,比如netconn
    的頭像 發(fā)表于 09-07 08:45 ?1716次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-<b class='flag-5'>LWIP</b>的內(nèi)存池介紹

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-LWIP的堆管理介紹

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-LWIP的堆管理介紹 (qq.com) https://mp.wei
    的頭像 發(fā)表于 09-08 08:40 ?1293次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-<b class='flag-5'>LWIP</b>的堆管理介紹

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-LWIP的堆(內(nèi)存池)未對(duì)齊導(dǎo)致問(wèn)題的案例分享

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 https://mp.weixin.qq.com/s/ErIa2ss2YZLGYbSwoJEzog 一.?前言 內(nèi)存未對(duì)齊訪(fǎng)問(wèn)問(wèn)題這個(gè)已經(jīng)是老生常談的問(wèn)題了, 由于LWIP
    的頭像 發(fā)表于 09-09 08:44 ?1716次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-<b class='flag-5'>LWIP</b>的堆(內(nèi)存池)未對(duì)齊導(dǎo)致問(wèn)題的案例分享

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-RTOS環(huán)境移植LWIP與性能測(cè)試

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-RTOS環(huán)境移植
    的頭像 發(fā)表于 09-11 11:20 ?2083次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-RTOS<b class='flag-5'>環(huán)境</b><b class='flag-5'>移植</b><b class='flag-5'>LWIP</b>與性能測(cè)試

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-LWIP在PC上進(jìn)行開(kāi)發(fā)調(diào)試

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-LWIP在PC上進(jìn)行開(kāi)發(fā)
    的頭像 發(fā)表于 09-11 08:40 ?1996次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-<b class='flag-5'>LWIP</b>在PC上進(jìn)行<b class='flag-5'>開(kāi)發(fā)</b>調(diào)試

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-LWIP的定時(shí)器模塊詳解

    一. 前言 LWIP的定時(shí)器模塊,實(shí)現(xiàn)了通用的軟件定時(shí)器,用于內(nèi)部的周期事件處理,比如arp,tcp的超時(shí)等,用戶(hù)也可以使用。這一篇來(lái)分析該模塊的實(shí)現(xiàn)。 二.代碼分析 2.1源碼 源碼
    的頭像 發(fā)表于 09-18 09:33 ?1658次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-<b class='flag-5'>LWIP</b>的定時(shí)器模塊詳解

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-LWIP的ARP模塊介紹

    TCP/IP通訊第一步需要先調(diào)通ARP,否則TCP/IP包都不知道MAC地址要發(fā)給誰(shuí)。這一篇來(lái)基于LWIP的ARP實(shí)現(xiàn)進(jìn)行相關(guān)的分析。
    的頭像 發(fā)表于 09-18 09:34 ?1885次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-<b class='flag-5'>LWIP</b>的ARP模塊介紹

    為什么要做無(wú)OSLWIP

    首先,為什么要做無(wú)OSLWIP呢?原因很簡(jiǎn)單,因?yàn)閟tm32f103c8t6只有20K的RAM,很難支持OS+LWIP。無(wú)
    發(fā)表于 08-05 07:38

    設(shè)計(jì)軟件核心以太網(wǎng)服務(wù)質(zhì)量數(shù)據(jù)手冊(cè)免費(fèi)下載

    本文描述Synopsys設(shè)計(jì)軟件核心以太網(wǎng)服務(wù)質(zhì)量DWC以太網(wǎng)QoS核心5.10A。DWC以太網(wǎng)
    發(fā)表于 10-23 08:00 ?16次下載
    設(shè)計(jì)軟件核心<b class='flag-5'>以太網(wǎng)</b>服務(wù)質(zhì)量數(shù)據(jù)手冊(cè)免費(fèi)下載

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-包過(guò)濾

    以太網(wǎng)上數(shù)據(jù)非常多,如果所有數(shù)據(jù)都接收交給軟件去處理軟件負(fù)載會(huì)非常重,所以一般只需要接收發(fā)給自己的數(shù)據(jù)即可
    的頭像 發(fā)表于 09-02 09:19 ?1745次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-包過(guò)濾
    RM新时代网站-首页