移植LwIP到RTOS注意事项

来源:互联网 发布:淘宝卖家手机打印快递 编辑:程序博客网 时间:2024/05/18 03:42

搞了接近两个月的网卡驱动、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 <raw_api.h>typedef RAW_U8u8_t;typedef RAW_S8s8_t;typedef RAW_U16u16_t;typedef RAW_S16s16_t;typedef RAW_U32u32_t;typedef RAW_S32s32_t;typedef RAW_U32mem_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函数,通过以上修改即可。

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