資源描述:
《ucos+lwip應(yīng)用心得[社區(qū)]》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、ucos+lwip應(yīng)用心得[社區(qū)]經(jīng)過(guò)幾天調(diào)試除掉幾個(gè)bug以后,ucos+lodel)先貼上來(lái),如果大家有興趣我再接著往下寫.另外我的移植參看了skyeye揚(yáng)曄大俠的代碼,大家可以去看看揚(yáng)曄大俠的lDunkels等開發(fā)的一套用于嵌入式系統(tǒng)的開放源代碼TCP/IP協(xié)議棧。Lent的支持.(9)支持DHCP協(xié)議,動(dòng)態(tài)分配ip地址.現(xiàn)在網(wǎng)上最新的版本是V0.6.41.lodel)tcp/ip協(xié)議棧的processmodel一般有幾種方式.1.tcp/ip協(xié)議的每一層是一個(gè)單獨(dú)進(jìn)程.鏈路層是一個(gè)進(jìn)程,ip層是一個(gè)進(jìn)程,tcp層是一個(gè)進(jìn)程.這樣的好處是網(wǎng)絡(luò)協(xié)議的每一層都非常清晰,代碼的
2、調(diào)試和理解都非常容易.但是最大的壞處數(shù)據(jù)跨層傳遞時(shí)會(huì)引起上下文切換(contextsent要引起3次contextscall)和協(xié)議棧來(lái)進(jìn)行通訊.這樣TCP/IP的協(xié)議棧就限定于特定的操作系統(tǒng)內(nèi)核了.如odel:所有tcp/ip協(xié)議棧都在一個(gè)進(jìn)程當(dāng)中,這樣tcp/ip協(xié)議棧就和操作系統(tǒng)內(nèi)核分開了.而應(yīng)用層程序既可以是單獨(dú)的進(jìn)程也可以駐留在tcp/ip進(jìn)程中.如果應(yīng)用程序是單獨(dú)的進(jìn)程可以通過(guò)操作系統(tǒng)的郵箱,消息隊(duì)列等和tcp/ip進(jìn)程進(jìn)行通訊.>voidsys_sem_signal(sys_sem_tsem)//發(fā)送一個(gè)信號(hào)量voidsys_sem__tsem)//等待一個(gè)信號(hào)量
3、voidsys_timeout(u32_tmsecs,sys_timeout_handlerh,void*arg)//設(shè)置一個(gè)超時(shí)事件voidsys_untimeout(sys_timeout_handlerh,void*arg)//刪除一個(gè)超時(shí)事件…關(guān)于操作系統(tǒng)封裝層的信息可以閱讀lbox_t;//可見lbox其實(shí)是ucos的消息隊(duì)列staticcharpcQueueMemoryPool[MAX_QUEUES*sizeof(TQ_DESCR)];voidsys_init(void){u8_ti;s8_tucErr;pQueueMem=OSMemCreate((void*)pc
4、QueueMemoryPool,MAX_QUEUES,sizeof(TQ_DESCR),ucErr);//為消息隊(duì)列創(chuàng)建內(nèi)存分區(qū)//initleoutsforeveryleouts[i].next=NULL;}}2.2.2創(chuàng)建一個(gè)和tcp/ip相關(guān)新進(jìn)程:l,所以設(shè)大//一點(diǎn)也沒(méi)有關(guān)系:)//maxnumberoflp;LAX];Leouts的對(duì)應(yīng)表項(xiàng)中.imeouts(void){u8_tcurr_prio;s16_terr,offset;OS_TCBcurr_task_pcb;null_timeouts.next=NULL;//獲取當(dāng)前任務(wù)的優(yōu)先級(jí)err=OSTaskQue
5、ry(OS_PRIO_SELF,curr_task_pcb);curr_prio=curr_task_pcb.OSTCBPrio;offset=curr_prio-LAX){returnnull_timeouts;}returnleouts[offset];}ext!=NULL)t->next->time+=t->time;memp_free(MEMP_SYS_TIMEOUT,t);return;}}return;}2.2.3“mbox”的實(shí)現(xiàn):}}}}u32_tsys_arch_mbox_fetch(sys_mbox_tmbox,void**data,u32
6、_ttimeout){u32_tucErr;u16_tucos_timeout;//在leout的單位是ms//在ucosII,timeout的單位是timertickucos_timeout=0;if(timeout!=0){ucos_timeout=(timeout)*(OS_TICKS_PER_SEC/1000);if(ucos_timeout<1)ucos_timeout=1;elseif(ucos_timeout>65535)ucos_timeout=65535;}//如果data!=NULL就返回消息指針,if(data!=NULL){*data=OSQ
7、Pend(mbox->pQ,(u16_t)ucos_timeout,ucErr);}else{OSQPend(mbox->pQ,(u16_t)ucos_timeout,ucErr);}//這里修改了ucos中的OSQPend系統(tǒng)調(diào)用,//原來(lái)的void*OSQPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)//err的返回值只有兩種:收到消息就返回OS_NO_ERR,超時(shí)則返回OS_TIMEOUT//這里先將err從8位數(shù)據(jù)改變成了16位