图3:LwIP运行机制
4.1 LwIP在uC/OS-II上的移植
针对uC/OS-II和AVR的ICC编译器,LwIP的移植只需要编写arch文件夹下的3个文件——cc.h、sys_arch.h和sys_arch.c。其中cc.h中有与CPU和编译器有关的定义,包括数据结构和大小端存储方式等。其中关键代码区的保护用uC/OS-II中的相应函数替换一下即可。剩下的两个与操作系统有关的文件是移植工作的重点。
为了增强移植性,LwIP专门把和操作系统有关的数据结构和函数放在一起组成操作系统封装层,为诸如定时、进程同步和消息传递等操作系统服务提供统一的接口,移植时仅需针对不同的操作系统来实现特定的操作系统封装层,这些是由sys_arch.h和sys_arch.c实现的。其中sys_arch.h主要定义与操作系统相关的数据结构——信号量、邮箱和进程号,这些在uC/OS-II中都有对应的实体,要注意的是LwIP中的邮箱对应于uC/OS-II中的消息队列。
sys_arch.c中要实现和操作系统有关函数的定义,包括系统的初始化以及信号和邮箱的操作——创建、删除、投递和等待,这些功能只需要用uC/OS-II中相应的函数进行重新封装即可。另外,TCP/IP协议栈中需要许多定时器的功能,这在LwIP中是用sys_timeout结构体队列和相应的函数实现的 。每个sys_timeout结构体包括本线程的timeout时间长度,以及超时后的回调处理函数