摘 要:文中提出了一種低成本、高性能的嵌入式串口服務器的硬軟件設計方案。該服務器以ARM7芯片LPC2210為核心控制器, 采用RTL8019以太網(wǎng)控制器處理網(wǎng)絡數(shù)據(jù), TL16C554異步通信組件處理串口數(shù)據(jù)。對輕便TCP/ IP協(xié)議棧LW IP在μC/OS - Ⅱ實時操作系統(tǒng)中進行了移植, 并對16路串行通道設計了實時多任務方案, 使串口服務器能夠以TCP/UDP模式在網(wǎng)口和串口端進行雙向232 /485通信。實驗證明本服務器能使傳輸數(shù)據(jù)實時, 準確。
通過擴展多串口, 可以在PC端遠程監(jiān)控、管理各種外設, 或對外設進行系統(tǒng)升級。通常串口服務器采用ARM9 微處理器和帶TCP / IP協(xié)議棧的付費操作系統(tǒng), 而文中提出的串口服務器是通過移植LW IP協(xié)議棧到代碼開源的μC /OS - Ⅱ中實現(xiàn), 這樣不但降低成本, 而且代碼的編寫更加透明、靈活。
1 硬件系統(tǒng)的設計
本串口服務器采用Philip s的ARM7 系列芯片LPC2210,網(wǎng)絡控制芯片采用RTL8019, 串口采用TL16C554芯片擴展。為得到更廣泛的應用, 串口端還擴展485 接口, 通過跳線選擇232 /485 方式。系統(tǒng)結構框圖, 如圖1所示。

?
圖1 系統(tǒng)結構框圖
2 軟件系統(tǒng)的實現(xiàn)
串口服務器軟件系統(tǒng)包括兩部分: TCP / IP協(xié)議棧的移植和實時多任務應用程序。μC /OS - Ⅱ在LPC系列ARM中的移植采用周立功公司的方案。
2.1 TCP / IP協(xié)議棧的移植
LW IP是瑞士人Adma Dumkels等開發(fā)的源代碼開放的精簡TCP / IP 協(xié)議棧。目的是在于保證TCP協(xié)議完整的情況下減少系統(tǒng)資源的需求, 適合于資源較少的嵌入式系統(tǒng)應用。移植LW IP協(xié)議棧主要有兩部分代碼: (1)編寫操作系統(tǒng)模擬層相關代碼; (2) LW IP接口初始設置及網(wǎng)卡驅動。
2.1.1 操作系統(tǒng)模擬層相關代碼
操作系統(tǒng)模擬層存在的目的主要是在μC /OS - Ⅱ和LW IP之間提供一座橋梁, 使LW IP能與μC /OS - Ⅱ能以相同的規(guī)范存在于一個系統(tǒng)中并能相互通信。LW IP有信號量和郵箱兩種進程通訊方式, 而μC /OS - Ⅱ也提供這兩種進程通訊方式。
信號量用來同步任務, 操作函數(shù)有sys_new_sem (建立并返回一個新信號量) , sys_ sem _ signal(指定要發(fā)送的信號量) , sys_sem_free (指定要釋放的信號量) , sys_arch_sem_wait (等待由參數(shù)sem指定的信號量并阻塞線程) , 在這些函數(shù)體中進行數(shù)據(jù)結構的初始化并加入μC /OS - Ⅱ中的相關函數(shù)便可完成。
郵箱用來投遞消息, LW IP允許將郵箱實現(xiàn)為一個隊列,多條消息投遞到這個郵箱。
μC /OS - Ⅱ提供了豐富的消息隊列函數(shù), 且μC /OS - Ⅱ和LW IP投遞到郵箱中的消息均用指針實現(xiàn)。該系統(tǒng)建立了多個郵箱, 郵箱通過單向鏈表接在一起。接收消息的最大數(shù)量由消息數(shù)組決定, 結構圖如圖2所示。
?
圖2 郵箱數(shù)據(jù)結構圖
郵箱建好后用指針P_Mbox指向節(jié)點1, 申請新郵箱將節(jié)點1和節(jié)點2斷開, P_Mbox指向節(jié)點1的p stNext, 以此類推?;厥諘rP_Mbox的移動方向與申請時相反, 這樣不會浪費內存且比較穩(wěn)定。由以上結構和μC /OS - Ⅱ提供的函數(shù)寫出郵箱相關函數(shù)。
除此之外, 還需要編寫任務創(chuàng)建函數(shù)sys_thread_new和sys_arch_timeouts函數(shù), 由于每個任務都有timeouts鏈表, sys_arch _timeouts函數(shù)返回的sys_timeouts結構保存了timeouts鏈表的首地址。
2.1.2 LW IP初始化設置及底層驅動
LW IP的初始化設置包含在LW IP通信進程的入口函數(shù)中, 其入口函數(shù)LwipEntry的基本結構如下:
Void LwipEntry ( void 3 pvArg)
{
/ /初始化LW IP, 涉及LW IP使用的內存區(qū),PCB ( TCP /UDP)以及OS模擬層各個方面
__ilvInitLwip ( ) ;
/ /設置LW IP, 包括添加配置網(wǎng)絡接口, 建立接受任務等工作
__ilvSetLwip ( ) ;
/ /在這里建立LW IP 的應用, 服務器支持TCP /UDP方式, 兩種方式都建立
}
底層驅動在服務器每次收發(fā)數(shù)據(jù)中都要調用,這部分代碼需要有良好的健壯性和穩(wěn)定性。整個實現(xiàn)順序, 如圖3所示。

?
圖3 底層程序框架圖
發(fā)送主線首先是以太網(wǎng)初始化函數(shù)( 1)開始,調用鏈路層發(fā)送函數(shù)(2)并增加各層協(xié)議頭, 再調用RTL8019發(fā)送函數(shù)(9)發(fā)送數(shù)據(jù)。
接收主線除初始化以太網(wǎng)外, 需調用鏈路層初始化函數(shù)(3) , ( 3)中調用( 4)初始化RTL8019。
收到的數(shù)據(jù)先經過函數(shù)(8) , 然后通過信號量傳送到函數(shù)(6) , 由( 6)調用( 7)得到數(shù)據(jù)個數(shù), 最后由(5)根據(jù)以太網(wǎng)幀頭攜帶的上層協(xié)議類型判斷是交給IP協(xié)議還是ARP協(xié)議處理。
移植完畢, 進行數(shù)據(jù)收發(fā)實驗驗證。使用TCP傳輸協(xié)議, 由網(wǎng)口虛擬串口軟件VSPM通過串口調試工具收發(fā)數(shù)據(jù), 圖4是以10 ms的發(fā)送速度在自發(fā)自收程序中收發(fā)數(shù)據(jù)的截圖。

?
圖4 TCP協(xié)議數(shù)據(jù)傳輸界面
由于COM1和COM2被PC機占用, 故由網(wǎng)口虛擬出來的串口是COM3, 由圖4可看出在面向連接的TCP協(xié)議下, 高速收發(fā)數(shù)據(jù)不會丟包。
2.2 實時多任務方案的設計
16個串口分別與網(wǎng)絡端口組成16 個雙向通道。為使代碼靈活、透明, 程序不使用LW IP提供的SOCKET AP I。應用程序把每個雙向通道分為發(fā)送, 接收, 串口3個任務, 加上LW IP本身需占用一個任務, 共需建立49個任務。μC /OS - Ⅱ最多能建立64 個任務, 其中8 個操作系統(tǒng)本身占用,剩56個能滿足要求。由VSPM軟件把網(wǎng)口模擬成16個串口, 串口服務器偵聽的16 個端口分別是1 000~1 015, 如圖5所示。

?
圖5 網(wǎng)口虛擬擴展16個串口界面
網(wǎng)絡端和串口端的數(shù)據(jù)接收會觸發(fā)相應的中斷。每個雙向通道的3個任務各司其職, 網(wǎng)口端接收數(shù)據(jù)中斷后在傳輸層協(xié)議判斷信源的端口號,交給相應的接收任務, 處理完后交給串口任務把數(shù)據(jù)從相應串口發(fā)送; 串口接收數(shù)據(jù)后在中斷程序中判斷信源的通道號, 把數(shù)據(jù)交給串口任務,處理完后由發(fā)送任務通過網(wǎng)口把數(shù)據(jù)發(fā)送出去。
服務器支持TCP /UDP兩種傳輸協(xié)議, 下面給出一個通道的TCP傳輸流程圖, UDP部分代碼只需在相應任務中調用LW IP給的UDP函數(shù)。TCP模式下串口服務器工作在Server模式, PC機工作在Client模式, 流程圖, 如圖6所示。

?
圖6串口服務器單通道程序流程圖
3.結論
文中本服務器是以性能不及ARM9且不能使用L inux的ARM7為主控芯片, 但兩種開源代碼μC /OS - Ⅱ實時操作系統(tǒng)和LW IP協(xié)議棧的有效結合避免了高額的軟件費用, 而且能滿足通信要求。實驗證明, 基于LW IP和μC /OS - Ⅱ的串口服務器不僅能實現(xiàn)雙向通信,而且傳輸數(shù)據(jù)實時、準確, 符合工業(yè)應用的要求。
評論