freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于armcortexm3的雙以太網(wǎng)口通信的實現(xiàn)畢業(yè)論文(編輯修改稿)

2025-07-16 08:50 本頁面
 

【文章內(nèi)容簡介】 兩個匯編文件,一個是系統(tǒng)啟動初始化文件,一個是線程進行上下文切換的文件,其他的都是C源文件。 虛擬文件系統(tǒng)RTThread提供的文件系統(tǒng)稱為設(shè)備文件系統(tǒng),它主要包含了一個非常輕型的虛擬文件系統(tǒng)。虛擬文件系統(tǒng)的好處就是,不管下層采用了什么文件系統(tǒng),例如內(nèi)存虛擬文件系統(tǒng),F(xiàn)AT32文件系統(tǒng)還是YAFFS2閃存文件系統(tǒng),對上層應用程序提供的接口都是統(tǒng)一的。 shell系統(tǒng)RTThread的shell系統(tǒng)——FinSH,提供了一套供用戶在命令行操作的接口,主要用于調(diào)試、查看系統(tǒng)信息。由于系統(tǒng)程序大多數(shù)采用C語言來編寫,F(xiàn)inSH命令行的設(shè)計被設(shè)計成類似C語言表達式的風格:它能夠解析執(zhí)行大部分C語言的表達式,也能夠使用類似于C語言的函數(shù)調(diào)用方式(或函數(shù)指針方式)訪問系統(tǒng)中的函數(shù)及全局變量。 圖形用戶界面RTThread/GUI組件是一套完全針對嵌入式系統(tǒng)而進行優(yōu)化的圖形用戶界面,它在保留通常意義的多窗口的前提下,提出了面板,工作臺,視圖的概念,通過一個個視圖的渲染展現(xiàn)出圖形用戶界面絢麗的外觀。它同樣也包括了基本控件的支持、中文顯示的支持、多線程的支持;針對嵌入式系統(tǒng)計算能力不足的特點,它會自動對界面區(qū)域進行可視區(qū)域的剪切,該重繪顯示的地方進行重繪,被覆蓋的地方則不進行重復繪圖。 支持的平臺圖32 RTTherad支持的平臺 RTThread的內(nèi)核對象模型RTThread的內(nèi)核對象模型是一種非常有趣的面向?qū)ο髮崿F(xiàn)方式。由于C語言更為面向系統(tǒng)底層,操作系統(tǒng)核心通常都是采用C語言和匯編語言混合編寫而成。C語言作為一門高級計算機編程語言,一般被認為是一種面向過程的編程語言:程序員按照特定的方式把要處理事物的過程一級級分解成一個個子過程。 面向?qū)ο笤从谌祟悓κ澜绲恼J知多偏向于類別模式,根據(jù)世界中不同物品的特性分門別類的組織在一起抽象并歸納,形成各個類別的自有屬性。在計算機領(lǐng)域一般采用一門新的,具備面向?qū)ο筇卣鞯木幊陶Z言實現(xiàn)面向?qū)ο蟮脑O(shè)計,例如常見的編程語言C++,Java,Python等。那么RT Thread既然有意引入對象系統(tǒng),為什么不直接采用C++來實現(xiàn)?這個需要從C++的實現(xiàn)說起,用過C++的開發(fā)人員都知道,C++的對象系統(tǒng)中會引入很多未知的東西,例如虛擬重載表,命名粉 碎,模板展開等。面向?qū)ο笥兴浅?yōu)越的地方,取其精華(即面向?qū)ο笏枷?,面向?qū)ο笤O(shè)計),也就是RTThread內(nèi)核對象模型的來源。RTThread實時操作系統(tǒng)中包含一個小型的,非常緊湊的對象系統(tǒng),這個對象系統(tǒng)完全采用C語言實現(xiàn)。在了解RTThread內(nèi)部或采用RTThread編程時有必要先熟悉它,它是RTThread實現(xiàn)的基礎(chǔ)。 內(nèi)核對象管理工作模式圖33 RTThread內(nèi)核對象管理工作模式RTThread采用內(nèi)核對象管理系統(tǒng)來訪問/管理所有內(nèi)核對象。內(nèi)核對象包含了內(nèi)核中絕大部分設(shè)施,而這些內(nèi)核對象可以是靜態(tài)分配的靜態(tài)對象,也可以是從系統(tǒng)內(nèi)存堆中分配的動態(tài)對象。通過內(nèi)核對象系統(tǒng),RTThread做到了不依賴于具體的內(nèi)存分配方式,系統(tǒng)的靈活性得到極大的提高。RTThread內(nèi)核對象包括:線程,信號量,互斥鎖,事件,郵箱,消息隊列和定時器,內(nèi)存池,設(shè)備驅(qū)動等。對象容器中包含了每類內(nèi)核對象的信息,包括對象類型,大小等。對象容器給每類內(nèi)核對象分配了一個鏈表,所有的內(nèi)核對象都被鏈接到該鏈表上。下圖顯示了RTThread中各類內(nèi)核對象的派生和繼承關(guān)系。對于每一種具體內(nèi)核對象和對象控制塊,除了基本結(jié)構(gòu)外,還有自己的擴展屬性(私有屬性),例如,對于線程控制塊,在基類對象基礎(chǔ)上進行擴展,增加了線程狀態(tài)、優(yōu)先級等屬性。這些屬性在基類對象的操作中不會用到,只有在與具體線程相關(guān)的操作中才會使用。因此從面向?qū)ο蟮挠^點,可以認為每一種具體對象是抽象對象的派生,繼承了基本對象的屬性并在此基礎(chǔ)上擴展了與自己相關(guān)的屬性。圖34 RTThread中各類內(nèi)核對象的派生和繼承關(guān)系在對象管理模塊中,定義了通用的數(shù)據(jù)結(jié)構(gòu),用來保存各種對象的共同屬性,各種具體對象只需要在此基礎(chǔ)上加上自己的某些特別的屬性,就可以清楚的表示自己的特征。這種設(shè)計方法的優(yōu)點:(1)提高了系統(tǒng)的可重用性和擴展性,增加新的對象類別很容易,只需要繼承通用對象的屬性再加少量擴展即可。(2)提供統(tǒng)一的對象操作方式,簡化了各種具體對象的操作,提高了系統(tǒng)的可靠性。 線程狀態(tài)線程運行的過程中,在一個時間內(nèi)只允許一個線程在處理器中運行,即線程會有多種不同的線程狀態(tài),如運行態(tài),非運行態(tài)等。在RTThread實時操作系統(tǒng)中,線程包含四種狀態(tài),操作系統(tǒng)會自動根據(jù)它運行的情況而動態(tài)調(diào)整它的狀態(tài)。RTThread中的四種線程狀態(tài):(1) RT THREAD INIT/CLOSE線程初始狀態(tài)。當線程剛開始創(chuàng)建還沒開始運行時就處于這個狀態(tài);當線程運行結(jié)束時也處于這個狀態(tài)。在這個狀態(tài)下,線程不參與調(diào)度。(2)RT THREAD SUSPEND掛起態(tài)。線程此時被掛起:它可能因為資源不可用而等待掛起;或主動延時一段時間而被掛起。在這個狀態(tài)下,線程不參與調(diào)度。 (3)RT THREAD READY 就緒態(tài)。線程正在運行;或當前線程運行完讓出處理機后,操作系統(tǒng)尋找最高優(yōu)先級的就緒態(tài)線程運行。(4) RT THREAD RUNNING運行態(tài)。線程當前正在運行,在單核系統(tǒng)中,只有rt thread self()函數(shù)返回的線程處于這個狀態(tài);在多核系統(tǒng)中則不受這個限制。RTThread實時操作系統(tǒng)提供一系列的操作系統(tǒng)調(diào)用接口,使得線程的狀態(tài)在這四個狀態(tài)之間來回的變換。例如一個就緒態(tài)的線程由于申請一個資源(例如使用rt sem take),而有可能進入阻塞態(tài)。又如,一個外部中斷發(fā)生,轉(zhuǎn)入中斷處理函數(shù),中斷處理函數(shù)釋放了某個資源,導致了當前運行任務的切換,喚醒了另一阻塞態(tài)的任務,改變其狀態(tài)為就緒態(tài)等等。線程通過調(diào)用函數(shù)rt thread create/init調(diào)用進入到初始狀態(tài)(RT THREAD INIT/RT THREAD CLOSE),通過函數(shù)rt thread startup調(diào)用后進入到就緒狀態(tài)(RT THREAD READY)。當這個線程調(diào)用rt thread delay,rt sem take,rt mb recv等函數(shù)時,將主動掛起或由于獲取不到資源進入到掛起狀態(tài)。在掛起狀態(tài)的線程,如果它等待超時依然未獲得資源或由于其他線程釋放了資源,它將返回到就緒狀態(tài)。2. LwIP協(xié)議棧 LwIP協(xié)議棧簡介LwIP是Light Weight (輕型)IP協(xié)議,有無操作系統(tǒng)的支持都可以運行。LwIP實現(xiàn)的重點是在保持TCP協(xié)議主要功能的基礎(chǔ)上減少對RAM 的占用,它只需十幾KB的RAM和40K左右的ROM就可以運行,這使LwIP協(xié)議棧適合在低端的嵌入式系統(tǒng)中使用。lwIP協(xié)議棧主要關(guān)注的是怎么樣減少內(nèi)存的使用和代碼的大小,這樣就可以讓lwIP適用于資源有限的小型平臺例如嵌入式系統(tǒng)。為了簡化處理過程和內(nèi)存要求,lwIP對API進行了裁減,可以不需要復制一些數(shù)據(jù)。lwip提供三種API:RAW APIlwip APIBSD APIRAW API把協(xié)議棧和應用程序放到一個進程里邊,該接口基于函數(shù)回調(diào)技術(shù),使用該接口的應用程序可以不用進行連續(xù)操作。不過,這會使應用程序編寫難度加大且代碼不易被理解。為了接收數(shù)據(jù),應用程序會向協(xié)議棧注冊一個回調(diào)函數(shù)。該回調(diào)函數(shù)與特定的連接相關(guān)聯(lián),當該關(guān)聯(lián)的連接到達一個信息包,該回調(diào)函數(shù)就會被協(xié)議棧調(diào)用。這既有優(yōu)點也有缺點。優(yōu)點是既然應用程序和TCP/IP協(xié)議棧駐留在同一個進程中,那么發(fā)送和接收數(shù)據(jù)就不再產(chǎn)生進程切換。主要缺點是應用程序不 能使自己陷入長期的連續(xù)運算中,這樣會導致通訊性能下降,原因是TCP/IP處理與連續(xù)運算是不能并行發(fā)生的。這個缺點可以通過把應用程序分為兩部分來克 服,一部分處理通訊,一部分處理運算。lwip API把接收與處理放在一個線程里面。這樣只要處理流程稍微被延遲,接收就會被阻塞,直接造成頻繁丟包、響應不及時等嚴重問題。因此,接收與協(xié)議處理必須分開。LwIP顯然已經(jīng)考慮到了這一點,他為我們提供了tcpip_input()函數(shù)來處理這個問題,雖然他并沒有在rawapi一文中說明。我們都應該知道tcpip_input()函數(shù),它們來自于由底層網(wǎng)絡驅(qū)動組成的接收線程。我們在編寫網(wǎng)絡驅(qū)動時,其接收部分以任務的形式創(chuàng)建。數(shù)據(jù)包到達后,去掉以太網(wǎng)包頭得到IP包,然后直接調(diào)用tcpip_input()函數(shù)將其投遞到mbox郵箱。投遞結(jié)束,接收任務繼續(xù)下一個數(shù)據(jù)包的接收,而被投遞得IP包將由TCPIP線程繼續(xù)處理。這樣,即使某個IP包的處理時間過長也不會造成頻繁丟包現(xiàn)象的發(fā)生。這就是lwip API。BSD API提供了基于openreadwriteclose模型的UNIX標準API,它的最大特點是使應用程序移植到其它系統(tǒng)時比較容易,但用在嵌入式系統(tǒng)中效率比較低,占用資源多。這對于我們的嵌入式應用有時是不能容忍的。圖35 LwIP示意圖 LwIP的以太網(wǎng)數(shù)據(jù)接收圖36 LwIP數(shù)據(jù)的接收示意圖LWIP使用了一個eth_hdr的數(shù)據(jù)結(jié)構(gòu)來描述以太網(wǎng)數(shù)據(jù)包包頭的14個字節(jié)。如下,PACK_STRUCT_BEGIN struct eth_hdr { PACK_STRUCT_FIELD(struct eth_addr dest)。 //目標 MAC 地址 PACK_STRUCT_FIELD(struct eth_addr src)。 //源 MAC 地址 PACK_STRUCT_FIELD(u16_t type)。 //類型} PACK_STRUCT_STRUCT。 PACK_STRUCT_END 其中PACK_STRUCT_xxx 都是與編譯器字對齊相關(guān)的宏定義,上面的dest、src和type三個字段分別和上圖中的目的MAC地址、源MAC地址和類型域數(shù)據(jù)包接收進程,源代碼如下:void ethernetif_input(void *arg) //創(chuàng)建該進程{ struct eth_hdr *ethhdr。 struct pbuf *p。 struct netif *netif = (struct netif *)arg。 while (1) { p = low_level_input (netif)。 if (p == NULL) conti
點擊復制文檔內(nèi)容
研究報告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1