原文地址:https://blog.csdn.net/zhzht19861011/article/details/6615965
面对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文件,该文件中定义了与处理器相关的数据类型,要稍微注意一下。
|