lwip开源协议栈移植之旅开始了,哈哈 很有挑战哦!!
lwip有无操作系统支持都可以使用,不依赖于操作系统。
带操作系统移植需要实现操作系统模拟层实现文件,操作系统模拟层功能在于为协议栈提供邮箱、信号量等重要机制。LwIP 的作者为操作系统模拟层提供了较为详细描述在doc夹下文件名为 sys_arch.txt。我们的编写工作根据这个说明进行。
上层应用api与协议栈内核之间数据交互都是通过邮箱实现。其次是信号量为上层与内核执行提供了同步与互斥支持。
1、支持的操作系统需要添加的头文件说明:
文件 | 描述 |
---|---|
cc.h | 与硬件平台及编译器相关的环境变量及数据类型声明文件 |
perf.h | centered 定义了性能测量使用的宏,由 LwIP 调用,可以将其定义为一个空的宏。 |
sys_arch.h | sys_arch.c 的头文件,定义 Arch(即整个移植所依赖的操作系统平台,译注)需要的数据类型:sys_sem_t,sys_mbox_t,sys_thread_t,以及可选类型:sys_prot_t。 |
2、操作系统模拟层实现文件sys_arch.c:
sys_arch.c 必须实现sys_arch.txt列出的几个函数:
比如void sys_init(void);以及关于信号和邮箱、临界保护的几个重要函数,协议栈和操作系统数据交互和同步分别使用邮箱和信号量,这些函数在sys.h声明了未实现,sys.h声明了我们需要实现所有的模拟层函数如下图所示。
完善sys_thread_new(),支持操作系统多线程
3、配置文件:
文件 | 描述 |
---|---|
lwipopts.h | lwip配置头文件 |
4、在作者设计好的框架内完成与底层硬件相关的部分,需完善填充几个函数,lwip已给函数框架,实现定义即可:
函数 | 描述 |
---|---|
err_t ethernetif_init(struct netif *netif) | 以太网初始化函数 |
low_level_output() | 链路层发送函数 |
low_level_init() | 网卡初始化函数,网卡硬件初始化、初始化 EMAC |
ethernetif_input() | 数据接收,最好开个接收线程 |
low_level_input() | 得到一整帧数据 |
5、测试
ping测试、建立了一个简单的 WEB 服务器访问
6、参考文章:
uC/OS-II 平台下的 LwIP 移植笔记 作者: 焦海波 这个笔记作者很用心值得一看
Lwip嵌入式网络那些事.PDF 理论和实践都讲解比较清楚
lwIP TCP/IP 协议栈笔记 讲解 NETCONN 接口编程非常通俗易懂难道的好文章