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

下載本文檔

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

文檔簡介

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

溫馨提示

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

最新文檔

評論

0/150

提交評論