lwip移植说明及心得
扫描二维码
随时随地手机看文章
lwIP是瑞士计算机科学院(Swedish InsTItute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。Lwip既可以移植到操作系统上,又可以在无操作系统的情况下独立运行。
1、LwIP的特性(1) 支持多网络接口下的IP转发
(2) 支持ICMP协议
(3) 包括实验性扩展的的UDP(用户数据报协议)
(4) 包括阻塞控制,RTT估算和快速恢复和快速转发的TCP(传输控制协议)
(5) 提供专门的内部回调接口(Raw API)用于提高应用程序性能
(6) 可选择的Berkeley接口API(多线程情况下)
(7) 在最新的版本中支持ppp
(8) 新版本中增加了的IP fragment的支持。
(9) 支持DHCP协议,动态分配ip地址。
2 Lwip在ucos上的移植。 2.1 系统初始化sys_int必须在tcpip协议栈任务tcpip_thread创建前被调用。
#define MAX_QUEUES 20
#define MAX_QUEUE_ENTRIES 20
typedef struct {
OS_EVENT* pQ;//ucos中指向事件控制块的指针
void* pvQEntries[MAX_QUEUE_ENTRIES];//消息队列
//MAX_QUEUE_ENTRIES消息队列中最多消息数
} TQ_DESCR, *PQ_DESCR;
typedef PQ_DESCR sys_mbox_t;//可见lwip中的mbox其实是ucos的消息队列
staTIc char pcQueueMemoryPool[MAX_QUEUES * sizeof(TQ_DESCR) ];
void sys_init(void)
{
u8_t i;
s8_t ucErr;
pQueueMem = OSMemCreate( (void*)pcQueueMemoryPool, MAX_QUEUES, sizeof(TQ_DESCR), &ucErr );//为消息队列创建内存分区
//init lwip task prio offset
curr_prio_offset = 0;
//init lwip_TImeouts for every lwip task
//初始化lwip定时事件表,具体实现参考下面章节
for(i=0;i《LWIP_TASK_MAX;i++){
lwip_TImeouts[i].next = NULL;
}
}
2.2 创建一个和tcp/ip相关新进程lwip中的进程就是ucos中的任务,创建一个新进程的代码如下:
#define LWIP_STK_SIZE 10*1024//和tcp/ip相关任务的堆栈大小。可以根据情况自
//己设置,44b0开发板上有8M的sdram,所以设大
//一点也没有关系:)
//max number of lwip tasks
#define LWIP_TASK_MAX 5 //和tcp/ip相关的任务最多数目
//first prio of lwip tasks
#define LWIP_START_PRIO 5 //和tcp/ip相关任务的起始优先级,在本例中优先级可
//以从(5-9)。注意tcpip_thread在所有tcp/ip相关进程中//应该是优先级最高的。在本例中就是优先级5
//如果用户需要创建和tcp/ip无关任务,如uart任务等,
//不要使用5-9的优先级
OS_STK LWIP_TASK_STK[LWIP_TASK_MAX][LWIP_STK_SIZE];//和tcp/ip相关进程
//的堆栈区
u8_t curr_prio_offset ;
sys_thread_t sys_thread_new(void (* function)(void *arg), void *arg,int prio)
{
if(curr_prio_offset 《 LWIP_TASK_MAX){
OSTaskCreate(function,(void*)0x1111, &LWIP_TASK_STK[curr_prio_offset][LWIP_STK_SIZE-1],
LWIP_START_PRIO+curr_prio_offset );
curr_prio_offset++;
return 1;
} else {
// PRINT(“ lwip task prio out of range ! error! ”);
}
}
从代码中可以看出tcpip_thread应该是最先创建的。