lwIP是瑞士計算機科學(xué)院(Swedish InsTItute of Computer Science)的Adam Dunkels等開發(fā)的一套用于嵌入式系統(tǒng)的開放源代碼TCP/IP協(xié)議棧。Lwip既可以移植到操作系統(tǒng)上,又可以在無操作系統(tǒng)的情況下獨立運行。
1、LwIP的特性?。?) 支持多網(wǎng)絡(luò)接口下的IP轉(zhuǎn)發(fā)
(2) 支持ICMP協(xié)議
?。?) 包括實驗性擴展的的UDP(用戶數(shù)據(jù)報協(xié)議)
?。?) 包括阻塞控制,RTT估算和快速恢復(fù)和快速轉(zhuǎn)發(fā)的TCP(傳輸控制協(xié)議)
?。?) 提供專門的內(nèi)部回調(diào)接口(Raw API)用于提高應(yīng)用程序性能
?。?) 可選擇的Berkeley接口API(多線程情況下)
(7) 在最新的版本中支持ppp
?。?) 新版本中增加了的IP fragment的支持。
(9) 支持DHCP協(xié)議,動態(tài)分配ip地址。
2 Lwip在ucos上的移植。 2.1 系統(tǒng)初始化sys_int必須在tcpip協(xié)議棧任務(wù)tcpip_thread創(chuàng)建前被調(diào)用。
#define MAX_QUEUES 20
#define MAX_QUEUE_ENTRIES 20
typedef struct {
OS_EVENT* pQ;//ucos中指向事件控制塊的指針
void* pvQEntries[MAX_QUEUE_ENTRIES];//消息隊列
//MAX_QUEUE_ENTRIES消息隊列中最多消息數(shù)
} 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 );//為消息隊列創(chuàng)建內(nèi)存分區(qū)
//init lwip task prio offset
curr_prio_offset = 0;
//init lwip_TImeouts for every lwip task
//初始化lwip定時事件表,具體實現(xiàn)參考下面章節(jié)
for(i=0;i《LWIP_TASK_MAX;i++){
lwip_TImeouts[i].next = NULL;
}
}
2.2 創(chuàng)建一個和tcp/ip相關(guān)新進程lwip中的進程就是ucos中的任務(wù),創(chuàng)建一個新進程的代碼如下:
#define LWIP_STK_SIZE 10*1024//和tcp/ip相關(guān)任務(wù)的堆棧大小??梢愿鶕?jù)情況自
//己設(shè)置,44b0開發(fā)板上有8M的sdram,所以設(shè)大
//一點也沒有關(guān)系:)
//max number of lwip tasks
#define LWIP_TASK_MAX 5 //和tcp/ip相關(guān)的任務(wù)最多數(shù)目
//first prio of lwip tasks
#define LWIP_START_PRIO 5 //和tcp/ip相關(guān)任務(wù)的起始優(yōu)先級,在本例中優(yōu)先級可
//以從(5-9)。注意tcpip_thread在所有tcp/ip相關(guān)進程中//應(yīng)該是優(yōu)先級最高的。在本例中就是優(yōu)先級5
//如果用戶需要創(chuàng)建和tcp/ip無關(guān)任務(wù),如uart任務(wù)等,
//不要使用5-9的優(yōu)先級
OS_STK LWIP_TASK_STK[LWIP_TASK_MAX][LWIP_STK_SIZE];//和tcp/ip相關(guān)進程
//的堆棧區(qū)
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應(yīng)該是最先創(chuàng)建的。