移植LwIP到RTOS注意事项

搞了接近两个月的网卡驱动、LwIP协议栈,从最初的啥都不知道到现在的基本了解,这个过程是漫长的,以下就介绍下如何将LwIP移植到不同的RTOS上。首先、在移植LwIP之前需要确定网卡驱动的正确性,如果网卡驱动都不正确,那么上协议栈就是浪费时间,到时候又得查网卡驱动,确定步骤如下所示:

1、确定网卡发送函数正确性

封装一个ARP包,将该ARP包往电脑上发送,PC端通过wireshark抓包工具,查看能否抓到该arp包,注意,本步骤需要测试只发送一个arp包情况,以及发送多个arp包情况,如果PC能够收到该arp包,并且进行了回复,那么表示发送基本正确。

2、确定网卡接收函数正确性

完成第一个步骤以后,在中断里面接收数据,并将数据打印出,查看数据是否存在arp回复包,如果存在那么表示,接收函数正确,否则需要调试网卡驱动。


完成了以上两个确认步骤以后,我们就可以进行LwIP的移植了,LwIP移植主要涉及以下三个方面,其实基本上任何的协议栈都是以下三个内容。

1、对于编译器的移植

2、对于操作系统的移植

3、对于驱动的移植


对于编译器的移植,主要是数据类型,涉及的文件是cc.h,其内容如下所示

#ifndef __ARCH_CC_H__
#define __ARCH_CC_H__

#include 

typedef RAW_U8	u8_t;
typedef RAW_S8	s8_t;
typedef RAW_U16	u16_t;
typedef RAW_S16	s16_t;
typedef RAW_U32	u32_t;
typedef RAW_S32	s32_t;
typedef RAW_U32	mem_ptr_t;

#define U16_F "hu"
#define S16_F "hd"
#define X16_F "hx"
#define U32_F "lu"
#define S32_F "ld"
#define X32_F "lx"

#define BYTE_ORDER  LITTLE_ENDIAN


#define PACK_STRUCT_STRUCT __attribute__ ((__packed__))

#define  LWIP_PROVIDE_ERRNO  1


#if 0
#if defined(__CC_ARM)   /* ARMCC compiler */
#define PACK_STRUCT_FIELD(x) x
#define PACK_STRUCT_STRUCT __attribute__ ((__packed__))
#define PACK_STRUCT_BEGIN
#define PACK_STRUCT_END
#elif defined(__IAR_SYSTEMS_ICC__)   /* IAR Compiler */
#define PACK_STRUCT_BEGIN
#define PACK_STRUCT_STRUCT
#define PACK_STRUCT_END
#define PACK_STRUCT_FIELD(x) x
#define PACK_STRUCT_USE_INCLUDES
#elif defined(__GNUC__)     /* GNU GCC Compiler */
#define PACK_STRUCT_FIELD(x) x
#define PACK_STRUCT_STRUCT __attribute__((packed))
#define PACK_STRUCT_BEGIN
#define PACK_STRUCT_END
#endif
#endif



#define LWIP_PLATFORM_DIAG(x)	do {Uart_Printf x;} while(0)
#define LWIP_PLATFORM_ASSERT(x) do {RAW_SR_ALLOC(); Uart_Printf(x); RAW_CRITICAL_ENTER(); RAW_ASSERT(0);RAW_CRITICAL_EXIT();}while(0)


#include "string.h"

#endif /* __ARCH_CC_H__ */

对于操作系统的移植,就涉及到sys_arch.h sys_arch.c两个文件,该两个文件主要是参考了sys_arch.txt进行编写的,因为LwIP如果采用了实时系统以后,它内部有一套通信同步机制,即Mbox和semaphore机制,Mbox可以用Queue实现,只需要按照sys_arch.txt将自己使用的RTOS的Queue和semaphore进行封装即可。

对于驱动的移植主要是涉及到了ethernetif.c文件,在low_level_init函数里面设置MAC地址以及调用网卡初始化函数,在low_level_output函数里面调用网卡发送函数,将网卡接收的数据发给ethernetif_input函数,通过以上修改即可。

当然,以上只是提出了一个简单的步骤,具体的环境还需要一些调试技巧,不可能一下就成功了,因此,接下来就是细心的调试,分析了。。。。。。。



你可能感兴趣的:(LwIP)