面对lwIP协议栈庞大的代码量和错综复杂的数据结构,除了对作者Adam的顶礼膜拜外,你是否有无从下手的感觉!但反过来想想,Adam大虾辛苦十来年的成果,若是让我等小菜民几周给摸个滚瓜烂熟,这也太伤Adam的面子了。好在今天我们不看lwIp庞大的代码与复杂的数据结构,我们只看如何移植,这么一来,只需重写两个文件即可。
lwIp的作者做了大量的工作以方便像我这种懒人移植该协议栈,基本上只需修改一个配置头文件和改写3个函数即可完成lwIP的移植。要改写的3个函数都位于网络的最底层,它取决于你使用的是何种网络接口芯片,比如非常常见的RTL8201Bl,最近很火的TI的lm3s6000/8000/9000系列片上集成的网络接口模块等等。之所以要改写,是因为勤劳的lwIP作者已经写出来这三个函数的基本雏形,再次感谢Adam。要改写的函数位于lwIP-1.3.0/src/netif/ethernetif.c中,你也可以用自己更合适的网络接口名来代替“ethernetif”。另外还有一个配置头文件,叫做lwipopts.h文件,它要放在工程目录下。这个文件来源于lwIP-1.3.0/src/include/lwip/opt.h头文件,是对整个协议栈的一个配置,比如是否使用TCP/UDP/DHCP协议等等。
先来看看移植要注意的三个函数,第一个函数为ethernerif_init()函数,这个函数先是设置与协议栈有关的底层操作,指定底层接收回调函数等,接着对实际网络接口芯片进行初始化,设置硬件的工作方式,开放中断等。第二个函数为low_level_output函数,主要目的是将要发送的数据包分解成
网络接口芯片能识别的数据结构并将数据发送到链路上。第三个函数为low_level_input()函数,主要接收以太网数据并将数据打包成lwIP能识别的数据结构。 配置头文件lwipopts.h内容较多,按照具体应用进行配置。
最后要说的是lwip协议栈的cc.h文件,该文件中定义了与处理器相关的数据类型,要稍微注意一下。
TI Cortex M3串口转以太网例程上层应用的基础是lwIP,版本是V1.3.2 。对于lwIP,陌生的同学可以到网上查查,它是是瑞士的Adam编写的一个开源TCP/IP协议。既然串口转以太网例程的基础是lwIP,那么还是看看lwIp是如何移植到TI的Cortex M3硬件中的吧。此为分割线-------
移植概述可以参看博客的这篇文章,以下基本按照这个格式来看看具体的移植代码。blog.csdn.net/zhzht19861011/article/details/6615965 1.cc.h文件
这个文件主要设置lwIP内部使用的数据类型,比如u8_t、u32_t等。lwIP可以移植到32位、16位甚至是8位构架的微控制器,由于移植的硬件平台以及编译器的不同,这些数据类型是要移植者根据自己的硬件和编译器特性来自行设置的。比如int类型变量,在8位和16位控制器中多表示2字节,但在32位微处理器中却表示4个字节,若是连这些基本数据类型都没有设置正确的话,就谈不上移植了。下面看cc.h的源代码:
view plaincopy to clipboardprint?
1. #ifndef __CC_H__ 2. #define __CC_H__ 3.
4. typedefunsignedcharu8_t;//基本数据类型设置 5. typedefsignedchars8_t; 6. typedefunsignedshortu16_t; 7. typedefsignedshorts16_t; 8. typedefunsignedlongu32_t; 9. typedefsignedlongs32_t; 10.typedefu32_t mem_ptr_t; 11.
12.#ifndef BYTE_ORDER
13.#define BYTE_ORDER LITTLE_ENDIAN 14.#endif 15.
16.#if defined(__arm__) &;&; defined(__ARMCC_VERSION) //以下主要设置不同编译器的结构体数据的对齐,lwIP需要 17.//
18.// Setup PACKing macros for KEIL/RVMDK Tools 19.//
20.#define PACK_STRUCT_BEGIN __packed 21.#define PACK_STRUCT_STRUCT 22.#define PACK_STRUCT_END
23.#define PACK_STRUCT_FIELD(x) x
24.#elif defined (__IAR_SYSTEMS_ICC__) 25.//
26.// Setu