标签归档:lwip

Lwip在UCOS-II上的移植(三)

移植网络驱动程序。在netif文件夹下有ethernetif.c,就是网络芯片的驱动程序,需要对照实际使用的网络芯片修改。下面是DM9000A的在lwip下的驱动的程序。

/* Define those to better describe your network interface. */

#define IFNAME0 ‘d’

#define IFNAME1 ‘m’

#define NIC_BASE 0x82000000

#define NIC_REG_ADDR (*(volatile u8_t *) 0x82000000)

/* if cmd link to system bus A2 */

#define NIC_REG_DATA_byte (*(volatile u8_t *) 0x82000004)

#define NIC_REG_DATA_word (*(volatile u16_t *) 0x82000004)

/* for dm9000a function setting */

#define Fix_Note_Address

#define DM9000A_FLOW_CONTROL

#define Rx_Int_enable

static void low_level_init(struct netif * netif);

static err_t low_level_output(struct netif * netif,struct pbuf *p);

static void ethernetif_input(struct netif *netif);

struct pbuf * low_level_input(struct netif *netif);

u16_t DM9000A_Phy_Read (u8_t offset);

void udelay(u32_t time)

{

//wait_1us(time);

while (–time > 0);

}

u8_t ior(u8_t reg_addr)

{

NIC_REG_ADDR = reg_addr;

return (NIC_REG_DATA_byte);

}

继续阅读

Lwip在UCOS-II上的移植(二)

把下载的Lwip文件夹放到项目文件中,项目文件夹入下图:

clip_image002

Lwip包含的功能:

1、 ARP协议,以太网地址解析协议

2、 IP协议,包括IPv4和IPv6,支持IP分片与重装,支持多网络接口下数据包转发

3、 IGMP协议,用于网络组管理,可以实现多播数据的接收

4、 UDP协议,用户数据报协议

5、 TCP协议,支持TCP拥塞控制,RTT估计,快速恢复与重传等

6、 提供三种用户编程接口方式:raw/callback API,sequential API,BSD-style socket API

7、 DNS,域名解析

8、 SNMP,简单网络管理协议

9、 DHCP,动态主机配置协议

10、 AUTOIP,IP地址自动配置

11、 PPP,点对点协议,支持PPPoE

下载的LWIP源代码包括3个文件夹,doc,src和test。doc 文件夹包含了几个与协议栈使用相关的文档。Test文件夹下是lwip提供的一些协议栈内核测试程序,移植不会用到。Src文件夹里就是lwip的所有源代码,需要放到项目文件中,上图中的lwip文件夹下就是src文件夹里的内容。

Api文件包含了lwip的sequential API和socket API两类接口函数及实现相关的源代码,要使用这两种类型的API,需要底层操作系统的支持。Core文件夹是lwip的内核源代码,内核源代码可以单独运行,且不需要操作系统的支持。Include主要包含整个协议栈使用的头文件。Netif主要包含了与底层网络接口相关的文件。

Lwip在UCOS-II上的移植(一)

LwIP是Light Weight (轻型)IP协议,有无操作系统的支持都可以运行。LwIP实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用,它只需十几KB的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。

Lwip的官方下载地址:http://savannah.nongnu.org/projects/lwip/

ARM和网络芯片(例如DM9000A)通讯,DM9000A接收到网络传送的数据包后,产生中断,ARM 检测到中断后从DM9000A接收缓冲区读取数据包,利用Lwip的内部数据包管理函数,把接收的数据包放在一个pbuf结构中。Lwip判断当前的数据包是ARP包还是IP包,调用相应的函数进行处理。

Lwip实现有几种方式:1、raw\callback API 2、sequential API 3、socket API

采用第1种方式时,Lwip做为UCOS中的一个单独的任务。用户程序和协议栈之间的通讯通过回调函数实现。所有网络相关的处理都在同一个任务里完成,避免了任务的切换。在嵌入式操作系统中使用Lwip时,最好将Lwip任务设为系统的最高优先级,以提高协议栈的实时性。

另外两种方式没有使用过,这两种方式需要使用操作系统的信号量和邮箱机制。对一些小的嵌入式系统和工作频率不高的ARM芯片来说,频繁的切换任务时没有必要的。使用第一种回调方式实现,我觉得是比较合适的。