移植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函数,通过以上修改即可。
当然,以上只是提出了一个简单的步骤,具体的环境还需要一些调试技巧,不可能一下就成功了,因此,接下来就是细心的调试,分析了。。。。。。。
- 移植LwIP到RTOS注意事项
- LWIP 移植 stm32 注意事项
- lwip移植到winow
- 从"RTOS移植"迁移到"实时Linux"
- lwip 移植
- lwip 移植
- lwip移植
- lwip 移植
- 移植lwIP
- lwip【0】lwIP移植工作
- lwip【1】LwIP移植心得
- 移植 LWIP 1.4.1 到 ucosii 的总结
- oracle移植到mysql注意事项
- lgui移植到s3c2440注意事项
- oracle移植到mysql注意事项
- oracle移植到mysql注意事项
- Oracle移植到mysql注意事项
- STM32F103RBT6移植到STM32F103C8T6注意事项
- VC++中采用ADO操作SQL数据库
- 简单的数组递归算法
- Class.forName与ClassLoader.loadClass的区别
- ioctl
- Python一天入门22:Python标准库-os模块
- 移植LwIP到RTOS注意事项
- c语言之图的存储结构
- poj 2541 Binary Witch (KMP+逆序转换+字符数组前端插入)
- Qwt源码解读之缩放操作类
- jquery表单验证插件的使用
- Meteor.js
- Cocos2d-x开关按钮CCMenuItemToggle的使用
- Visual C++ 2012入门经典(第6版)
- hdu 1798