移植的步骤参照《Day_Day_Up笔记之uCOS-II_LwIP_在_STM32F107_上移植》,《uCOS平台下的LwIP移植笔记》,《嵌入式网络那些事》。
首先说说自己的准备的工程,在lpc1788开发板能够运行的ucos-ii工程,以及lwip协议工程(无操作系统)。ucos-II 版本是v2.8.6,lwip版本是v1.4.0。
按照网上搜罗的材料,开始进行移植。
总体思路:
1、文件拷贝,将lwip工程下的相关协议栈代码拷贝到ucos-ii工程目录下。
2、编写操作系统模拟层相关文件。
3、编写供应用层调用的api函数。
1、文件拷贝(略)
2、模拟层需要编辑的文件有,cc.h(其实可以省略,将其内容放到sys_arch.h中),sys_arch.h,sys_arch.c 。
将以上文件放在新建的arch文件夹下,此文件夹放在原工程common文件夹下。
遇到以下问题,
a、如果工程中指包含了common文件路径,则需要这样声明
#ifndef __ARCH_CC_H__
#define __ARCH_CC_H__
//code
#endif
同理,对于sys_arch.h,声明如下:
#ifndef __ARCH_SYS_ARCH_H__
#define __ARCH_SYS_ARCH_H__
//code
#endif
否则会报错。
b、在编写sys_arch.c时,需要用到sys_timeout,资料上说在sys.h中已经定义了,找半天都没有找到哪里有定义,经过无数个分分秒秒终于找到了它的踪迹,sys_timeo结构体在timers.h中定义,copy如下:
/** Function prototype for a timeout callback function. Register such a function
* using sys_timeout().
*
* @param arg Additional argument to pass to the function - set up by sys_timeout()
*/
typedef void (* sys_timeout_handler)(void *arg);
struct sys_timeo {
struct sys_timeo *next;
u32_t time;
sys_timeout_handler h;
void *arg;
#if LWIP_DEBUG_TIMERNAMES
const char* handler_name;
#endif /* LWIP_DEBUG_TIMERNAMES */
};
看前面的注释,吐血的心都有了,改来改去有意思吗,还改成 sys_timeo,让人不明白意思。不过在后面却犯了个严重的错误。最终原因是没有包含头文件timers.h。不过keil的报错信息却让我摸不着头脑:
..Commonarchsys_arch.c(47): error: #393: pointer to incomplete class type is not allowed
迷迷糊糊以为是内存申请的时候出错了,跟踪...什么内存池啊,动态内存管理啊,都扫了一遍,还是没找到原因。笨办法,在sys_arch.h中自定义了个类似sys_timeo的类,一样的操作都没有出什么问题,看来原因找到了。
c、新版本的lwip协议有小改动,在编写模拟层的时候随即变动下就好了。今天就写到这里。