首頁 > 文章中心 > 正文

          RT-Thread 網絡通信系統的設計

          前言:本站為你精心整理了RT-Thread 網絡通信系統的設計范文,希望能為你的創作提供參考價值,我們的客服老師可以幫助你提供個性化的參考范文,歡迎咨詢。

          RT-Thread 網絡通信系統的設計

          ARMCortex-M3內核可以對4GB空間進行簡單和固定的存儲器映射,片內512kB的Flash用作存儲器異常/中斷向量表以及操作系統的鏡像,系統復位后從中讀取指令執行;64kB的SRAM為程序的運行空間和數據空間,啟動代碼先將系統鏡像復制到SRAM后執行。此外,該CPU內置靈活的靜態存儲控制器(FlexibleStaticMemoryController),可以方便外擴總線型的SRAM,NorFlash存儲器。由于處理器內部沒有集成MAC電路,網絡功能需通過網絡接口芯片來實現物理層通信。

          DM9000A由3.3V供電,支持IEEE的802.3網絡傳輸協議的10/100M以太網物理層單芯片收發器,片內集成濾波器、16kB的FIFO的SRAM緩存,自帶可觸發中斷的MII管理接口并支持中繼模式和節點模式、全雙工和半雙工模式的轉換[2]。通過RJ45連接到Internet,綜合LwIP程序包、通信協議(TCP/UDP)和網絡編程函數,即可實現網絡數據傳輸。

          底層網絡驅動DM9000A的網絡設備驅動程序分為設備的初始化和數據的發送接收兩部分。DM9000A的初始化過程是在CPU配置內部網絡控制寄存器(NCR)、中斷寄存器(ISR)等寄存器后進行的,具體過程包括軟件復位、設置網絡工作模式、設置PHY、選擇模式、使能喚醒時間、使能RX/TX中斷,使能數據接收功能等。初始化完成后,DM9000A進入等待數據發送/接收狀態,圖2是其數據傳輸流程圖。當處理器發送數據時,先將TCP或IP數據打包成以太網數據幀,然后通過16bit總線寫入到DM9000A的數據緩存區,再將數據長度等信息寫到DM9000A的相應寄存器內后使能發送;當DM9000A接收到外部網絡傳來的網絡數據時,將數據幀緩存在內部SRAM中,由CPU通過標志位對接收到的數據進行處理[3]。

          RT-Thread操作系統

          RT-Thread是采用面向對象風格設計、C語言實現的開放源代碼的RTOS,其突出特點是小型、實用和可裁剪。其核心能夠小到僅占用2.5kB的ROM和1kB的RAM空間;系統線程調度核心是完全bitmap方式,可使計算時間完全固定;配置文件rtconfig.h包含多種選項,能夠對Kernel細節進行精細調整,并可對文件系統、網絡協議棧、圖形用戶界面及FinshShell等組件進行可選配置。

          RT-Thread系統移植RT-ThreadKernel代碼目前支持多數主流CPU芯片,其bsp(板級支持包)含有所支持的各平臺的移植代碼,并會包含有兩個匯編文件,一個是系統啟動初始化文件,一個是線程進行上下文切換的文件,其他的都是C源文件。移植時選好開發平臺后僅需修改rtconfig.py和rtconfig.h文件。RT-Thread源碼具有非常好的移植性,可以非常容易的移植到其他開發環境下。本系統采用MDK開發環境,修改rtconfig.py文件中CROSS_TOOL=‘keil’和EXEC_PATH=‘D:/Keil’后,并配置rtconfig.h使能LwIP和FinshShell(其他組件可根據需要配置)。

          RT-Thread初始化RealViewMDK的用戶程序入口是main()函數,main()函數調用rt_thread_startup()函數(RT-Thread多平臺下的統一入口點),函數中包含了RT-Thread操作系統的啟動流程:包括初始化系統相關的硬件,初始化定時器、調度器等系統組件,初始化系統設備,初始化各個應用線程、并啟動調度器。其中用戶代碼入口位置是rt_application_init(),在這個函數中可以初始化用戶應用程序的線程,當打開調度器后,用戶線程也將得到執行。

          LwIP協議棧

          LwIP是一種源代碼開放的TCP/IP協議棧的實現,占用的體積大概在幾十kB的RAM和40kB的ROM代碼左右,因此十分適合于使用到嵌入式設備中。

          LwIP協議初始化LwIP由協議的實現模塊(IP,ICMP,UDP,TCP)、操作系統模擬層、緩沖與內存管理模塊、網絡接口函數和API接口函數等相對獨立的模塊組成。使用LwIP協議棧,需要初始化協議棧,同時協議棧本身會啟動一個TCP/IP的線程,和協議相關的處理都會放在這個線程中完成[4]。

          LwIPAPILwIPAPI在LwIP的應用中,可以充分發揮其內部結構優勢,且不必在協議棧和應用程序之間復制數據,故可以使應用程序巧妙地直接處理內部緩沖區。LwIPAPI主要使用兩種數據類型,netbuf和netconn。netbuf是描述網絡緩存,對應的函數為netbuf_new()、netbuf_delete()、netbuf_ref()、netbuf_data()等;netconn是描述網絡連接,對應的函數為netconn_new()、netconn_delete()、netconn_connect()、net-conn_recv()、netconn_write()等。

          BSDSocket網絡編程LwIP提供了一個輕型BSDSocketAPI的實現,為大量已有的網絡應用程序提供了兼容的接口。LwIP的socket接口實現都在函數名前加有lwip前綴,同時在頭文件中把它采用宏定義的方式定義成標準的BSDSocketAPI接口。BSD是UNIX/Linux系統中通用的網絡接口,也廣泛應用于嵌入式系統和實時操作系統中,不僅能夠支持不同的網絡類型,而且擁有內部進程之間的通信機制,圖3顯示了通過BSDSocket網絡編程實現的分層結構[5]。

          嵌入式網絡應用實現

          RT-Thread實時操作系統可實現多任務的調度管理,上層應用程序則可通過LwIP協議棧及調用LwIPAPI來實現網絡通信及網絡任務,再配合操作系統的RTGUI,DFS文件系統及設備驅動等組件來增加系統的實用性及擴展性。

          HTTP協議通信過程超文本傳輸協議(HTTP)是一個實現WWW的應用層協議,是一種請求/響應協議,當基于HTTP的客戶端/服務器數據交換有請求產生時,就開始一次HTTP數據通信。其過程如下:瀏覽器(客戶端)首先提取出URL中的主機,然后向DNS發出請求、解析主機名的IP地址(服務器偵聽端口一般為80);DNS將解析地址返回給瀏覽器;瀏覽器向該地址請求建立TCP連接;客戶端發出請求報文,服務器向客戶端發送響應報文,并將指定數據發送給客戶端;結束后斷開連接[6]。

          WebServer實現WebServer任務是基于LwIPAPI接口函數來實現應用,圖4為其任務流程圖。從圖中可以看出當用戶通過網絡連接訪問服務器頁面時,HTTP協議首先和服務器建立TCP連接,服務器通過進入netconn_accept()函數,并等待其郵箱信息的到來,等待期間線程被掛起。通過兩次握手后,客戶端就把HTTP請求報文作為第三次握手的第三個報文的數據發送給服務器,服務器收到HTTP請求報文后,就把所請求的頁面作為響應報文返回給客戶。該WebServe通過建立數據處理函數HTML編寫服務器設置界面后,可應用于遠程網絡控制系統,通過在網頁程序中加入<META/>標記,瀏覽器可以自發周期性的刷新頁面,用戶在瀏覽器端可及時收到遠程現場傳感器采集的數據,并可控制及設置參數來調節和監控遠程現場環境,圖5為基于HTTP協議實現的嵌入式遠程網絡監控系統的測試效果[7]。

          系統網絡通信測試LwIP協議已經實現了大部分的Socket網絡連接函數,要實現Socket的基本通信,只需要在此基礎上通過調用其Socket網絡連接函數即可實現簡單的客戶機/服務器網絡數據通信。為測試本網絡通信系統的可靠性和穩定性,在RT-Thread操作系統下增加TCP客戶端和UDP服務器網絡測試程序線程,其實現過程與WebServer類似,不同之處是基本網絡通信過程采用了更為標準化的BSDSocketAPI來實現,數據處理過程也和各測試任務相關。經TCP&UDP測試工具及RT-Thread自帶的FinshShell的測試表明,該系統發送數據和接收數據穩定可靠,傳輸速率可達10Mb/s以上,滿足多數嵌入式網絡通信設備的要求。

          結束語

          本文詳細介紹了利用STM32單片機,在移植RT-Thread實時操作系統的基礎上,實現了幾乎完整的TCI/IP協議棧,并且操作系統還采用模塊化設計,用戶在使用時可根據需要進行裁剪以節約資源。此外通過建立嵌入式網絡應用程序檢測了其通信性能,表明該系統為構建嵌入式設備的網絡通信提供了一種低成本高可靠性的解決方案;結合嵌入式設備友好的人機界面、易于升級和擴展等優點,本通信系統在廣播電視播控系統、網絡媒體傳播技術、智能監控領域中有著廣泛的應用前景。

          作者:陳希超王健單位:杭州電子科技大學電子信息學院聚光科技(杭州)股份有限公司

          文檔上傳者