丨從內(nèi)核到應(yīng)用網(wǎng)絡(luò)數(shù)據(jù)在中如何流轉(zhuǎn)_第1頁(yè)
丨從內(nèi)核到應(yīng)用網(wǎng)絡(luò)數(shù)據(jù)在中如何流轉(zhuǎn)_第2頁(yè)
丨從內(nèi)核到應(yīng)用網(wǎng)絡(luò)數(shù)據(jù)在中如何流轉(zhuǎn)_第3頁(yè)
丨從內(nèi)核到應(yīng)用網(wǎng)絡(luò)數(shù)據(jù)在中如何流轉(zhuǎn)_第4頁(yè)
丨從內(nèi)核到應(yīng)用網(wǎng)絡(luò)數(shù)據(jù)在中如何流轉(zhuǎn)_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

APIDMACRC了解了發(fā)送數(shù)據(jù)的過(guò)程以后,掌握接收數(shù)據(jù)的過(guò)程就更容易了,因?yàn)樗褪沁^(guò)程。首先,網(wǎng)卡接受到數(shù)據(jù),通過(guò)DMA到指定的內(nèi)存,接著發(fā)送中斷,以便通知網(wǎng)卡驅(qū)前面只是幫你梳理一下數(shù)據(jù)的發(fā)送與接收的流程,其實(shí)我們真正要關(guān)注的是網(wǎng)絡(luò)協(xié)議??墒俏覀?nèi)羰謩?dòng)實(shí)現(xiàn)一個(gè)完整的網(wǎng)絡(luò)協(xié)議,不太現(xiàn)實(shí),網(wǎng)絡(luò)協(xié)議的復(fù)雜度大到也許要重新開(kāi)一門課程,才可以完全解決,所以下面我們借用一下P認(rèn)識(shí)一下lwIP現(xiàn)在我們清楚了一次具體網(wǎng)絡(luò)發(fā)收過(guò)程是怎么回事,那怎么讓Cosmos實(shí)現(xiàn)網(wǎng)絡(luò)通信呢?這里我們選擇lwIP這個(gè)TCP/IP協(xié)議的輕量級(jí)開(kāi)源項(xiàng)目,讓它成為Cosmos的網(wǎng)絡(luò)部的戰(zhàn)lwIP是由瑞典計(jì)算機(jī)科學(xué)(SICS)的AdamDunkels開(kāi)發(fā)的小型開(kāi)源TCP/IP協(xié)議棧。它是一個(gè)用C語(yǔ)言實(shí)現(xiàn)的軟件組件,一共有兩套接口層,向下是操作系統(tǒng)要提供的,向上是提供給應(yīng)用程序的。這樣lwIP就能嵌入到任何操作系統(tǒng)之中工作,并為這個(gè)操作系統(tǒng)lwIPLinuxlwIP計(jì)目標(biāo)就是盡量用少量資源消耗,實(shí)現(xiàn)一個(gè)相對(duì)完整的TCP/IP協(xié)議棧。這里的“完整性”主要是指TCP協(xié)議的完整性,實(shí)現(xiàn)的關(guān)鍵點(diǎn)就是在保持TCP協(xié)議主要功能的基礎(chǔ)上減少對(duì)RAM的占用。同時(shí),lwIP還支持IPv6的標(biāo)準(zhǔn)實(shí)現(xiàn),這也讓我們與這里額外提供你一份擴(kuò)展閱讀資料,lwIP的項(xiàng)目主頁(yè),這里包含了大量相關(guān)資料,感的同學(xué)可以課后深入了解。另外,lwIP既可以移植到操作系統(tǒng)上運(yùn)行,也可以在沒(méi)lwIP在結(jié)構(gòu)上可分為四層:OS層、API層、層、硬件驅(qū)動(dòng)層,如下圖所示MCUlwIPlwIP是從這里入手,通過(guò)netconn或lwip_api使用lwIP的各種功能函數(shù)。在典型的TCP通信的客戶端應(yīng)用程序中,一般先要通過(guò)netconn_new創(chuàng)建一個(gè)structnetconn對(duì)象,然后調(diào)用netconn_connect連接到服務(wù)器,并返回成功或失敗。成功后,可以調(diào)用netconn_write向服務(wù)器發(fā)送數(shù)據(jù),也可以調(diào)用netconn_recv接收數(shù)據(jù)。最后,關(guān)閉連接并通過(guò)netconn_close釋放資源。lwIPapinetconnnetconnapi。習(xí)慣使用socket的同學(xué)也可以使用lwip_socket等函數(shù),以標(biāo)準(zhǔn)的socket方式調(diào)用lwIP。新版本增加了http、mqtt等應(yīng)用的代碼,這些額外的應(yīng)用對(duì)目前的物聯(lián)網(wǎng)通信來(lái)lwIP的層存放了TCP/IP協(xié)議棧的代碼,它不僅實(shí)現(xiàn)了大部分的TCP和UDP功能,還實(shí)現(xiàn)了DNS、ICMP、IGMP等協(xié)議,同時(shí)也實(shí)現(xiàn)了內(nèi)存管理和網(wǎng)絡(luò)接口功能。sys_archlwIP量、消息隊(duì)列等功能。和操作系統(tǒng)相關(guān)的真正定義寫在了lwip/include/sys.h文件中。硬件驅(qū)動(dòng)層提供PHY驅(qū)動(dòng),用來(lái)匹配lwIP的使用。lwIP會(huì)調(diào)用該層的代碼將組裝好lwIPlwIP原始API:原始的lwIPAPI。它通過(guò)回調(diào)機(jī)制開(kāi)發(fā)應(yīng)用程序。該應(yīng)用編程接口提供了NetconnAPI:API、需要實(shí)時(shí)操作系統(tǒng)(RTOS)的支持(提供進(jìn)程間通信的方法)。NetconnAPI支持多線程。BSDAPIAPI(NetconnAPINETCONNAPISequentialAPI)對(duì)于以上三種接口,前者只需要機(jī)調(diào)用,后兩種需要操作系統(tǒng)調(diào)用。因此,移植lwIP有兩種方法,一種是只移植內(nèi)核,不過(guò)這樣之后只能基于RAW/CallbackAPI編寫應(yīng)用程序。第二種是移植內(nèi)核和上層API。這時(shí)應(yīng)用程序編程可以使用三種API,即RAW/CallbackAPI、順序API和SocketAPI。lwIP接下來(lái),讓我們順著之前的思路來(lái)對(duì)應(yīng)到lwIP在收發(fā)過(guò)程中的函數(shù),具體過(guò)程我同樣梳理了流程圖。你可以結(jié)合圖里關(guān)鍵的函數(shù)名以及步驟順序,按這個(gè)順序在IwIP代碼中檢由于我們把lwIP作為Cosmos的一個(gè)內(nèi)核組件來(lái)工作,自然要由lwIP接受來(lái)自內(nèi)核上層發(fā)來(lái)的數(shù)據(jù)。內(nèi)核上層首先會(huì)調(diào)用lwIP的netconn層的接口函數(shù)netconn_write,通過(guò)這個(gè)函數(shù),數(shù)據(jù)正式流進(jìn)lwIP組件層。接著,netconn層調(diào)用lwIP組件的TCP層的接口函數(shù)tcp_write,在TCP層對(duì)數(shù)據(jù)首次進(jìn)行打包。然后,TCP層將打包好的數(shù)據(jù)通過(guò)調(diào)用io_output函數(shù),向下傳遞給lwIP組件的IP層,進(jìn)行打包。最后,IPnetif,這里調(diào)用了實(shí)際的網(wǎng)卡驅(qū)動(dòng)程lwIPnetconnnetconn_recvethernet_inputethernetip4_input在lwIP組件的IP層對(duì)數(shù)據(jù)解包,進(jìn)行相應(yīng)處理之后,還會(huì)調(diào)用tcp_input函數(shù),進(jìn)入lwIP組件的TCP層對(duì)數(shù)據(jù)解包。sys_mbox_trypostmbox,也就是消息盒子里,這樣lwIPlwIP非常優(yōu)秀,這讓移植工作變得很容易。我們這里只要了解lwIP組件的sys_arch層的接口下面我們一起了解lwIPlwIPNO_SYS,無(wú)操作系統(tǒng)模式,一種是有操作系統(tǒng)模式。用NO_SYS模式比較簡(jiǎn)單,你可以自行探索。操作系統(tǒng)模式主要需要基于操作系統(tǒng)的IPC機(jī)制,對(duì)網(wǎng)絡(luò)連接進(jìn)行了抽象(/隊(duì)列、互斥體等機(jī)制),從而保證內(nèi)核與應(yīng)用層API的通訊,這樣做的好處是lwIP內(nèi)核線程可以只負(fù)責(zé)數(shù)據(jù)包的TCP/IP封裝和拆封,而不用進(jìn)行數(shù)據(jù)的應(yīng)用層處理,從而極大而這些操作系統(tǒng)模擬層的函數(shù)主要是在h中的,我們一般在syc完成其定義。所以,我們很清楚,帶操作系統(tǒng)的移植就是在無(wú)操作系統(tǒng)的基礎(chǔ)上添加操作系統(tǒng)模擬層。CosmosCosmos統(tǒng)提供的IPC等機(jī)制基礎(chǔ)之上,對(duì)照sys.h文件中的函數(shù)一一去實(shí)現(xiàn)了。實(shí)際工程中完整移植網(wǎng)絡(luò)棧,需要將后面表格里的這0在IP中,用戶代碼通過(guò)郵箱與協(xié)議棧內(nèi)部交互。郵箱本質(zhì)上是指向數(shù)據(jù)的指針。API指針傳遞給內(nèi)核,內(nèi)核通過(guò)這個(gè)指針數(shù)據(jù),然后進(jìn)行處理。相反,內(nèi)核也是通過(guò)郵箱將數(shù)據(jù)傳遞給用戶代碼的。代err_tsys_mbox_new(sys_mbox_t*mbox,int{osMessageQDef(QUEUE,size,void*mbox=osMessageCreate(osMessageQ(QUEUE),#if7if(lwip_stats.sys.mbox.max<lwip_stats.sys.mbox.used)lwip_stats.sys.mbox.max=}#endif/*SYS_STATS

(*mbox==returnreturn}void (sys_mbox_t{if(osMessageWaiting(*mbox){#if#endif/*SYS_STATS}#if#endif/*SYS_STATS}voidsys_mbox_post(sys_mbox_t*mbox,void{while(osMessagePut(*mbox,(uint32_t)data,osWaitForever)!=}err_tsys_mbox_trypost(sys_mbox_t*mbox,void{err_tif(osMessagePut(*mbox,(uint32_t)msg,0)=={result=}elseresult=#if#endif/*SYS_STATS}return}u32_tsys_arch_mbox_fetch(sys_mbox_t*mbox,void**msg,u32_t{osEventuint32_tstarttime=if(timeout!={event=osMessageGet(*mbox,if(event.status=={*msg=(voidreturn(osKernelSysTick()-}{return}}{event=osMessageGet(*mbox,*msg=(voidreturn(osKernelSysTick()-}}u32_tsys_arch_mbox_tryfetch(sys_mbox_t*mbox,void{osEventevent=osMessageGet(*mbox,if(event.status=={*msg=(voidreturn}{return}}intsys_mbox_valid(sys_mbox_t{if(*mbox==returnreturn}voidsys_mbox_set_invalid(sys_mbox_t{*mbox=}//創(chuàng)建一個(gè)新的信號(hào)量。而"count"err_tsys_sem_new(sys_sem_t*sem,u8_t{*sem=osSemaphoreCreate(osSemaphore(SEM),if(*sem=={#if113#endif/*SYS_STATSreturn}if(count==0)//Meansitcan'tbe{}#if122if(lwip_stats.sys.sem.max<lwip_stats.sys.sem.used)lwip_stats.sys.sem.max=}#endif/*SYS_STATSreturn}此外還有一些函數(shù)也是協(xié)議棧需要的函數(shù),特別是sys_thread_new函數(shù),不但協(xié)議棧在初始化時(shí)需要用到,在后續(xù)我們實(shí)現(xiàn)各類基于lwIP的應(yīng)用時(shí)也會(huì)用得到,它的具體實(shí)現(xiàn)如下。代代sys_thread_tsys_thread_new(constchar*name,lwip_thread_fnthread,void{constosThreadDef_tos_thread_def={(char*)name,(os_pthread)thread,4456789returnosThreadCreate(&os_thread_def,}osThreadIdosThreadCreate(constosThreadDef_t*thread_def,void{TaskHandle_t#if(configSUPPORT_STATIC_ALLOCATION==1)&&(if((thread_def->buffer!=NULL)&&(thread_def->controlblock!=NULL)){handle=xTaskCreateStatic((TaskFunction_t)thread_def->pthread,(constportCHARthread_def->stacksize,argument,thread_def->buffer,thread_def-}elseif(xTaskCreate((TaskFunction_t)thread_def->pthread,(constportCHAR*)thread_dthread_def->stacksize,argument,make &handle)!=pdPASS){return}}#elif(configSUPPORT_STATIC_ALLOCATION==1handle=xTaskCreateStatic((TaskFunction_t)thread_def->pthread,(constthread_def->stacksize,argument,thread_def->buffer,thread_def->controlblock);if(xTaskCreate((TaskFunction_t)thread_def->pthread,(constportCHARthread_def->stacksize,argument,make&handle)!=pdPASS){return}return}至此,基于Cosmos操作系統(tǒng)移植lwIPDMAIPC、信號(hào)量、DMA最后,我們實(shí)現(xiàn)了將IPCosmos課我?guī)銓?shí)現(xiàn)了郵箱和系統(tǒng)線程相關(guān)的關(guān)鍵部分,其他函數(shù)移植道理相通,感的同學(xué)可以自行探索。我是LMOS,我們下節(jié)課見(jiàn)!給需要的人,Ta訂閱后你可得20贊

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論