前言:本站為你精心整理了RT-Thread 網(wǎng)絡(luò)通信系統(tǒng)的設(shè)計(jì)范文,希望能為你的創(chuàng)作提供參考價(jià)值,我們的客服老師可以幫助你提供個(gè)性化的參考范文,歡迎咨詢(xún)。
ARMCortex-M3內(nèi)核可以對(duì)4GB空間進(jìn)行簡(jiǎn)單和固定的存儲(chǔ)器映射,片內(nèi)512kB的Flash用作存儲(chǔ)器異常/中斷向量表以及操作系統(tǒng)的鏡像,系統(tǒng)復(fù)位后從中讀取指令執(zhí)行;64kB的SRAM為程序的運(yùn)行空間和數(shù)據(jù)空間,啟動(dòng)代碼先將系統(tǒng)鏡像復(fù)制到SRAM后執(zhí)行。此外,該CPU內(nèi)置靈活的靜態(tài)存儲(chǔ)控制器(FlexibleStaticMemoryController),可以方便外擴(kuò)總線型的SRAM,NorFlash存儲(chǔ)器。由于處理器內(nèi)部沒(méi)有集成MAC電路,網(wǎng)絡(luò)功能需通過(guò)網(wǎng)絡(luò)接口芯片來(lái)實(shí)現(xiàn)物理層通信。
DM9000A由3.3V供電,支持IEEE的802.3網(wǎng)絡(luò)傳輸協(xié)議的10/100M以太網(wǎng)物理層單芯片收發(fā)器,片內(nèi)集成濾波器、16kB的FIFO的SRAM緩存,自帶可觸發(fā)中斷的MII管理接口并支持中繼模式和節(jié)點(diǎn)模式、全雙工和半雙工模式的轉(zhuǎn)換[2]。通過(guò)RJ45連接到Internet,綜合LwIP程序包、通信協(xié)議(TCP/UDP)和網(wǎng)絡(luò)編程函數(shù),即可實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)傳輸。
底層網(wǎng)絡(luò)驅(qū)動(dòng)DM9000A的網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序分為設(shè)備的初始化和數(shù)據(jù)的發(fā)送接收兩部分。DM9000A的初始化過(guò)程是在CPU配置內(nèi)部網(wǎng)絡(luò)控制寄存器(NCR)、中斷寄存器(ISR)等寄存器后進(jìn)行的,具體過(guò)程包括軟件復(fù)位、設(shè)置網(wǎng)絡(luò)工作模式、設(shè)置PHY、選擇模式、使能喚醒時(shí)間、使能RX/TX中斷,使能數(shù)據(jù)接收功能等。初始化完成后,DM9000A進(jìn)入等待數(shù)據(jù)發(fā)送/接收狀態(tài),圖2是其數(shù)據(jù)傳輸流程圖。當(dāng)處理器發(fā)送數(shù)據(jù)時(shí),先將TCP或IP數(shù)據(jù)打包成以太網(wǎng)數(shù)據(jù)幀,然后通過(guò)16bit總線寫(xiě)入到DM9000A的數(shù)據(jù)緩存區(qū),再將數(shù)據(jù)長(zhǎng)度等信息寫(xiě)到DM9000A的相應(yīng)寄存器內(nèi)后使能發(fā)送;當(dāng)DM9000A接收到外部網(wǎng)絡(luò)傳來(lái)的網(wǎng)絡(luò)數(shù)據(jù)時(shí),將數(shù)據(jù)幀緩存在內(nèi)部SRAM中,由CPU通過(guò)標(biāo)志位對(duì)接收到的數(shù)據(jù)進(jìn)行處理[3]。
RT-Thread操作系統(tǒng)
RT-Thread是采用面向?qū)ο箫L(fēng)格設(shè)計(jì)、C語(yǔ)言實(shí)現(xiàn)的開(kāi)放源代碼的RTOS,其突出特點(diǎn)是小型、實(shí)用和可裁剪。其核心能夠小到僅占用2.5kB的ROM和1kB的RAM空間;系統(tǒng)線程調(diào)度核心是完全bitmap方式,可使計(jì)算時(shí)間完全固定;配置文件rtconfig.h包含多種選項(xiàng),能夠?qū)ernel細(xì)節(jié)進(jìn)行精細(xì)調(diào)整,并可對(duì)文件系統(tǒng)、網(wǎng)絡(luò)協(xié)議棧、圖形用戶(hù)界面及FinshShell等組件進(jìn)行可選配置。
RT-Thread系統(tǒng)移植RT-ThreadKernel代碼目前支持多數(shù)主流CPU芯片,其bsp(板級(jí)支持包)含有所支持的各平臺(tái)的移植代碼,并會(huì)包含有兩個(gè)匯編文件,一個(gè)是系統(tǒng)啟動(dòng)初始化文件,一個(gè)是線程進(jìn)行上下文切換的文件,其他的都是C源文件。移植時(shí)選好開(kāi)發(fā)平臺(tái)后僅需修改rtconfig.py和rtconfig.h文件。RT-Thread源碼具有非常好的移植性,可以非常容易的移植到其他開(kāi)發(fā)環(huán)境下。本系統(tǒng)采用MDK開(kāi)發(fā)環(huán)境,修改rtconfig.py文件中CROSS_TOOL=‘keil’和EXEC_PATH=‘D:/Keil’后,并配置rtconfig.h使能LwIP和FinshShell(其他組件可根據(jù)需要配置)。
RT-Thread初始化RealViewMDK的用戶(hù)程序入口是main()函數(shù),main()函數(shù)調(diào)用rt_thread_startup()函數(shù)(RT-Thread多平臺(tái)下的統(tǒng)一入口點(diǎn)),函數(shù)中包含了RT-Thread操作系統(tǒng)的啟動(dòng)流程:包括初始化系統(tǒng)相關(guān)的硬件,初始化定時(shí)器、調(diào)度器等系統(tǒng)組件,初始化系統(tǒng)設(shè)備,初始化各個(gè)應(yīng)用線程、并啟動(dòng)調(diào)度器。其中用戶(hù)代碼入口位置是rt_application_init(),在這個(gè)函數(shù)中可以初始化用戶(hù)應(yīng)用程序的線程,當(dāng)打開(kāi)調(diào)度器后,用戶(hù)線程也將得到執(zhí)行。
LwIP協(xié)議棧
LwIP是一種源代碼開(kāi)放的TCP/IP協(xié)議棧的實(shí)現(xiàn),占用的體積大概在幾十kB的RAM和40kB的ROM代碼左右,因此十分適合于使用到嵌入式設(shè)備中。
LwIP協(xié)議初始化LwIP由協(xié)議的實(shí)現(xiàn)模塊(IP,ICMP,UDP,TCP)、操作系統(tǒng)模擬層、緩沖與內(nèi)存管理模塊、網(wǎng)絡(luò)接口函數(shù)和API接口函數(shù)等相對(duì)獨(dú)立的模塊組成。使用LwIP協(xié)議棧,需要初始化協(xié)議棧,同時(shí)協(xié)議棧本身會(huì)啟動(dòng)一個(gè)TCP/IP的線程,和協(xié)議相關(guān)的處理都會(huì)放在這個(gè)線程中完成[4]。
LwIPAPILwIPAPI在LwIP的應(yīng)用中,可以充分發(fā)揮其內(nèi)部結(jié)構(gòu)優(yōu)勢(shì),且不必在協(xié)議棧和應(yīng)用程序之間復(fù)制數(shù)據(jù),故可以使應(yīng)用程序巧妙地直接處理內(nèi)部緩沖區(qū)。LwIPAPI主要使用兩種數(shù)據(jù)類(lèi)型,netbuf和netconn。netbuf是描述網(wǎng)絡(luò)緩存,對(duì)應(yīng)的函數(shù)為netbuf_new()、netbuf_delete()、netbuf_ref()、netbuf_data()等;netconn是描述網(wǎng)絡(luò)連接,對(duì)應(yīng)的函數(shù)為netconn_new()、netconn_delete()、netconn_connect()、net-conn_recv()、netconn_write()等。
BSDSocket網(wǎng)絡(luò)編程LwIP提供了一個(gè)輕型BSDSocketAPI的實(shí)現(xiàn),為大量已有的網(wǎng)絡(luò)應(yīng)用程序提供了兼容的接口。LwIP的socket接口實(shí)現(xiàn)都在函數(shù)名前加有l(wèi)wip前綴,同時(shí)在頭文件中把它采用宏定義的方式定義成標(biāo)準(zhǔn)的BSDSocketAPI接口。BSD是UNIX/Linux系統(tǒng)中通用的網(wǎng)絡(luò)接口,也廣泛應(yīng)用于嵌入式系統(tǒng)和實(shí)時(shí)操作系統(tǒng)中,不僅能夠支持不同的網(wǎng)絡(luò)類(lèi)型,而且擁有內(nèi)部進(jìn)程之間的通信機(jī)制,圖3顯示了通過(guò)BSDSocket網(wǎng)絡(luò)編程實(shí)現(xiàn)的分層結(jié)構(gòu)[5]。
嵌入式網(wǎng)絡(luò)應(yīng)用實(shí)現(xiàn)
RT-Thread實(shí)時(shí)操作系統(tǒng)可實(shí)現(xiàn)多任務(wù)的調(diào)度管理,上層應(yīng)用程序則可通過(guò)LwIP協(xié)議棧及調(diào)用LwIPAPI來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)通信及網(wǎng)絡(luò)任務(wù),再配合操作系統(tǒng)的RTGUI,DFS文件系統(tǒng)及設(shè)備驅(qū)動(dòng)等組件來(lái)增加系統(tǒng)的實(shí)用性及擴(kuò)展性。
HTTP協(xié)議通信過(guò)程超文本傳輸協(xié)議(HTTP)是一個(gè)實(shí)現(xiàn)WWW的應(yīng)用層協(xié)議,是一種請(qǐng)求/響應(yīng)協(xié)議,當(dāng)基于HTTP的客戶(hù)端/服務(wù)器數(shù)據(jù)交換有請(qǐng)求產(chǎn)生時(shí),就開(kāi)始一次HTTP數(shù)據(jù)通信。其過(guò)程如下:瀏覽器(客戶(hù)端)首先提取出URL中的主機(jī),然后向DNS發(fā)出請(qǐng)求、解析主機(jī)名的IP地址(服務(wù)器偵聽(tīng)端口一般為80);DNS將解析地址返回給瀏覽器;瀏覽器向該地址請(qǐng)求建立TCP連接;客戶(hù)端發(fā)出請(qǐng)求報(bào)文,服務(wù)器向客戶(hù)端發(fā)送響應(yīng)報(bào)文,并將指定數(shù)據(jù)發(fā)送給客戶(hù)端;結(jié)束后斷開(kāi)連接[6]。
WebServer實(shí)現(xiàn)WebServer任務(wù)是基于LwIPAPI接口函數(shù)來(lái)實(shí)現(xiàn)應(yīng)用,圖4為其任務(wù)流程圖。從圖中可以看出當(dāng)用戶(hù)通過(guò)網(wǎng)絡(luò)連接訪問(wèn)服務(wù)器頁(yè)面時(shí),HTTP協(xié)議首先和服務(wù)器建立TCP連接,服務(wù)器通過(guò)進(jìn)入netconn_accept()函數(shù),并等待其郵箱信息的到來(lái),等待期間線程被掛起。通過(guò)兩次握手后,客戶(hù)端就把HTTP請(qǐng)求報(bào)文作為第三次握手的第三個(gè)報(bào)文的數(shù)據(jù)發(fā)送給服務(wù)器,服務(wù)器收到HTTP請(qǐng)求報(bào)文后,就把所請(qǐng)求的頁(yè)面作為響應(yīng)報(bào)文返回給客戶(hù)。該WebServe通過(guò)建立數(shù)據(jù)處理函數(shù)HTML編寫(xiě)服務(wù)器設(shè)置界面后,可應(yīng)用于遠(yuǎn)程網(wǎng)絡(luò)控制系統(tǒng),通過(guò)在網(wǎng)頁(yè)程序中加入<META/>標(biāo)記,瀏覽器可以自發(fā)周期性的刷新頁(yè)面,用戶(hù)在瀏覽器端可及時(shí)收到遠(yuǎn)程現(xiàn)場(chǎng)傳感器采集的數(shù)據(jù),并可控制及設(shè)置參數(shù)來(lái)調(diào)節(jié)和監(jiān)控遠(yuǎn)程現(xiàn)場(chǎng)環(huán)境,圖5為基于HTTP協(xié)議實(shí)現(xiàn)的嵌入式遠(yuǎn)程網(wǎng)絡(luò)監(jiān)控系統(tǒng)的測(cè)試效果[7]。
系統(tǒng)網(wǎng)絡(luò)通信測(cè)試LwIP協(xié)議已經(jīng)實(shí)現(xiàn)了大部分的Socket網(wǎng)絡(luò)連接函數(shù),要實(shí)現(xiàn)Socket的基本通信,只需要在此基礎(chǔ)上通過(guò)調(diào)用其Socket網(wǎng)絡(luò)連接函數(shù)即可實(shí)現(xiàn)簡(jiǎn)單的客戶(hù)機(jī)/服務(wù)器網(wǎng)絡(luò)數(shù)據(jù)通信。為測(cè)試本網(wǎng)絡(luò)通信系統(tǒng)的可靠性和穩(wěn)定性,在RT-Thread操作系統(tǒng)下增加TCP客戶(hù)端和UDP服務(wù)器網(wǎng)絡(luò)測(cè)試程序線程,其實(shí)現(xiàn)過(guò)程與WebServer類(lèi)似,不同之處是基本網(wǎng)絡(luò)通信過(guò)程采用了更為標(biāo)準(zhǔn)化的BSDSocketAPI來(lái)實(shí)現(xiàn),數(shù)據(jù)處理過(guò)程也和各測(cè)試任務(wù)相關(guān)。經(jīng)TCP&UDP測(cè)試工具及RT-Thread自帶的FinshShell的測(cè)試表明,該系統(tǒng)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)穩(wěn)定可靠,傳輸速率可達(dá)10Mb/s以上,滿(mǎn)足多數(shù)嵌入式網(wǎng)絡(luò)通信設(shè)備的要求。
結(jié)束語(yǔ)
本文詳細(xì)介紹了利用STM32單片機(jī),在移植RT-Thread實(shí)時(shí)操作系統(tǒng)的基礎(chǔ)上,實(shí)現(xiàn)了幾乎完整的TCI/IP協(xié)議棧,并且操作系統(tǒng)還采用模塊化設(shè)計(jì),用戶(hù)在使用時(shí)可根據(jù)需要進(jìn)行裁剪以節(jié)約資源。此外通過(guò)建立嵌入式網(wǎng)絡(luò)應(yīng)用程序檢測(cè)了其通信性能,表明該系統(tǒng)為構(gòu)建嵌入式設(shè)備的網(wǎng)絡(luò)通信提供了一種低成本高可靠性的解決方案;結(jié)合嵌入式設(shè)備友好的人機(jī)界面、易于升級(jí)和擴(kuò)展等優(yōu)點(diǎn),本通信系統(tǒng)在廣播電視播控系統(tǒng)、網(wǎng)絡(luò)媒體傳播技術(shù)、智能監(jiān)控領(lǐng)域中有著廣泛的應(yīng)用前景。
作者:陳希超王健單位:杭州電子科技大學(xué)電子信息學(xué)院聚光科技(杭州)股份有限公司