lwIP是瑞士計算機科學院(Swedish Institute of Computer Science)的Adam Dunkels等開發的一套用于嵌入式系統的開放源代碼TCP/IP協議棧。Lwip既可以移植到操作系統上,又可以在無操作系統的情況下獨立運行。
1、LwIP的特性
?。?) 支持ICMP協議
(3) 包括實驗性擴展的的UDP(用戶數據報協議)
(4) 包括阻塞控制,RTT估算和快速恢復和快速轉發的TCP(傳輸控制協議)
?。?) 提供專門的內部回調接口(Raw API)用于提高應用程序性能
?。?) 可選擇的Berkeley接口API(多線程情況下)
?。?) 在最新的版本中支持ppp
(8) 新版本中增加了的IP fragment的支持。
?。?) 支持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相關任務的堆棧大小??梢愿鶕闆r自
//一點也沒有關系:)
//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應該是最先創建的。
評論