雷 瑛 劉亙煒 張 安 張 磊
(西安電子工程研究所 西安 710100)
VxWorks是一個(gè)具有微內(nèi)核、可裁剪的高性能強(qiáng)實(shí)時(shí)操作系統(tǒng),它以其良好的可靠性和卓越的實(shí)時(shí)性被廣泛地應(yīng)用在工業(yè)控制、醫(yī)療器械、航空航天以及國防電子等高精尖技術(shù)及實(shí)時(shí)性要求極高的領(lǐng)域中[1]。相對(duì)于RS-232串口,RS-422串口具有抗干擾能力強(qiáng)、通訊速率高、通訊距離遠(yuǎn)等特點(diǎn),在嵌入式實(shí)時(shí)操作系統(tǒng)中使用串口通信,不僅可擴(kuò)展嵌入式設(shè)備通信能力,而且可擴(kuò)大其應(yīng)用范圍。
VxWorks是美國Wind River System公司推出的一個(gè)嵌入式實(shí)時(shí)操作系統(tǒng),主要特點(diǎn)有:
a.微內(nèi)核Wind具有快速多任務(wù)切換、搶占式任務(wù)調(diào)度、中斷延遲小、任務(wù)間通信手段多樣化、網(wǎng)絡(luò)流量大等特點(diǎn)。b.VxWorks系統(tǒng)具有良好的可裁減能力,用戶可根據(jù)自己系統(tǒng)的功能目標(biāo)通過交叉開發(fā)環(huán)境方便地設(shè)置。c.支持應(yīng)用程序的動(dòng)態(tài)鏈接和下載,縮短了編輯和調(diào)試的周期。d.具有良好的兼容性,在不同運(yùn)行環(huán)境間可以方便的移植,減少了開發(fā)周期和經(jīng)費(fèi)。
某多功能雷達(dá)為有效適應(yīng)復(fù)雜作戰(zhàn)任務(wù)和戰(zhàn)場(chǎng)環(huán)境,多個(gè)分系統(tǒng)之間均有數(shù)據(jù)量較大的實(shí)時(shí)通訊,并要求響應(yīng)時(shí)間快,處理迅速。系統(tǒng)硬件設(shè)計(jì)選用定制方式將計(jì)算機(jī)模塊和大規(guī)??删幊唐骷﨔PGA作在一塊印制板上,采用F81218多串口芯片擴(kuò)展了6個(gè)標(biāo)準(zhǔn)RS422串口,將2個(gè)計(jì)算機(jī)自帶的可設(shè)串口也設(shè)為標(biāo)準(zhǔn)RS422串口,系統(tǒng)硬件原理圖如圖1所示。軟件采用VxWorks 5.5開發(fā),能很好地解決以上問題。
圖1 系統(tǒng)硬件原理圖
VxWorks 5.5附帶的BSP版本為1.2.3,該版本BSP已經(jīng)內(nèi)置串行通訊接口的驅(qū)動(dòng),但是默認(rèn)僅能驅(qū)動(dòng)大多數(shù)主板附帶的COM1和COM2兩個(gè)串口,為了滿足該項(xiàng)目應(yīng)用需求,需要修改BSP,以添加對(duì)COM3~COM8串行接口的驅(qū)動(dòng)支持,修改如下:
a.在VxWorks內(nèi)核組件中加入hardware→periphe→serial中所有組件;
b.在BSP文件夾pc.h文件里加入8個(gè)串口對(duì)應(yīng)地址:
添加串口中斷號(hào)定義,其中COM3~COM8共享5號(hào)中斷:
c.在 sysSerial.c文件的表 I8250-CHAN-PARAS devParas[]中加入對(duì)新添加串口設(shè)備的映射:
添加中斷服務(wù)程序?qū)蚕碇袛嗟奶幚韀2]:
若以上添加成功,在 VxWorks啟動(dòng)后可以用devs命令查詢到新添加的串行設(shè)備。
VxWorks對(duì)于串口的操作是通過I/O系統(tǒng)提供的 create、open、read、write、close、delete、ioctl等控制接口實(shí)現(xiàn),分別完成串口創(chuàng)建、串口打開、讀串口、寫串口、關(guān)閉串口、刪除串口,串口設(shè)置等操作[3]。串口基類完成對(duì)串口基本參數(shù)的設(shè)置及工作流程的構(gòu)建,各個(gè)子類與基類不同的處理過程通過純虛函數(shù)重載來添加。根據(jù)不同標(biāo)志(FLAG),轉(zhuǎn)入相應(yīng)的串口子類程序。系統(tǒng)軟件模塊圖如圖2所示。
圖2 系統(tǒng)軟件模塊圖
串口通信協(xié)議如下所示:
在基類中完成對(duì)所有串口基本工作參數(shù)如工作模式、設(shè)備控制字、輸入輸出緩沖區(qū)等的設(shè)置,程序舉例如下[4]:
在基類中定義串口收數(shù)任務(wù)(任務(wù)1)和串口數(shù)據(jù)處理任務(wù)(任務(wù)2)。串口收數(shù)任務(wù)實(shí)時(shí)監(jiān)測(cè)串口是否有數(shù)據(jù)到來,一旦監(jiān)測(cè)到有數(shù)據(jù)則全部讀取并交由數(shù)據(jù)封包函數(shù)按照通訊協(xié)議根據(jù)字頭、數(shù)據(jù)長度打包;數(shù)據(jù)封包函數(shù)一旦收滿一包數(shù)則釋放信號(hào)量通知串口數(shù)據(jù)處理任務(wù)。串口數(shù)據(jù)處理任務(wù)一旦獲取信號(hào)量則根據(jù)FLAG不同轉(zhuǎn)入相應(yīng)的串口子類數(shù)據(jù)解析函數(shù)根據(jù)數(shù)據(jù)類型的不同進(jìn)行相應(yīng)的處理,程序舉例如下:
將傳進(jìn)來的數(shù)據(jù)寫入相應(yīng)的串口,程序舉例如下:
在串口子類構(gòu)造函數(shù)中定義FLAG的具體值;在子類重載函數(shù)Open()中調(diào)用基類串口初始化函數(shù)重新定義該串口特有的一些工作參數(shù);在子類重載函數(shù)parse(const BYTE* pBYTE,const int size)中對(duì)傳進(jìn)來封好包的數(shù)據(jù)進(jìn)行進(jìn)一步解析,根據(jù)數(shù)據(jù)類型的不同轉(zhuǎn)到相應(yīng)的處理函數(shù)進(jìn)行處理。Open()和 parse(const BYTE* pBYTE,const int size)在基類中設(shè)置為可重載的純虛函數(shù),程序舉例如下:
本文描述了在實(shí)時(shí)操作系統(tǒng)VxWorks中對(duì)多串口系統(tǒng)實(shí)現(xiàn)數(shù)據(jù)通信的方法,并給出了示例程序,該方法適用于工業(yè)控制等多方面。VxWorks以其優(yōu)異的實(shí)時(shí)性和可靠性,增強(qiáng)了了串口通信能力,并且擴(kuò)大了其應(yīng)用范圍,能適應(yīng)數(shù)據(jù)量大,多任務(wù)、多響應(yīng)、實(shí)時(shí)性要求高的環(huán)境。
[1]徐惠民.基于VxWorks的嵌入式系統(tǒng)及實(shí)驗(yàn)[M].北京:北京郵電大學(xué)出版社,2006.
[2]孔祥營,張保山,俞烈彬.VxWorks驅(qū)動(dòng)及分布式編程[M].北京:中國電力出版社,2007.
[3]張楊,于銀濤.VxWorks內(nèi)核、設(shè)備驅(qū)動(dòng)與BSP開發(fā)詳解[M].北京:人民郵電出版社,2009.
[4]孟英謙,王玲.嵌入式VxWorks實(shí)時(shí)操作系統(tǒng)中串口通信的實(shí)現(xiàn)[J].軟件技術(shù),2003(1):52~54.