唐小貝,杜小雪,隋江波
(1.海軍軍訓器材研究所 北京 102308;2.北海艦隊裝備部 山東 青島 266011;3.海軍航空工程學院 指揮系,山東 煙臺 264001)
基于VxWorks的環(huán)形緩沖機制的驅(qū)動設計
唐小貝1,杜小雪2,隋江波3
(1.海軍軍訓器材研究所 北京 102308;2.北海艦隊裝備部 山東 青島 266011;3.海軍航空工程學院 指揮系,山東 煙臺 264001)
針對軍用PDA硬件自定義設備在VxWorks嵌入式操作系統(tǒng)中的標準化驅(qū)動程序開發(fā)需求,分析了VxWorks嵌入式操作系統(tǒng)的驅(qū)動程序功能設計,以多串口通信驅(qū)動為例,結(jié)合看門狗定時器和中斷處理機制,采用VxWorks系統(tǒng)自身提供的環(huán)形緩沖區(qū)管理接口庫函數(shù),設計了一種更為可靠高效、性能穩(wěn)定的字符設備底層驅(qū)動程序,減少了通信的丟包率,提高了效率。對所有基于環(huán)形緩沖機制下的VxWorks字符設備驅(qū)動程序開發(fā)者具有參考價值。
軍用PDA;VxWorks;環(huán)形緩沖區(qū);驅(qū)動
VxWorks作為一種強實時性的操作系統(tǒng)RTOS,廣泛應用于諸如單兵手持終端、軍用PDA等用戶定制的計算機上。這類嵌入式計算機,按照用途的不同,定制硬件時所采用的CPU類型和相關(guān)外設都有所區(qū)別。VxWorks系統(tǒng)能夠支持ARM、PowerPC、X86等大多數(shù)類型的CPU,但不同的硬件外設要求VxWorks系統(tǒng)必須提供相應的驅(qū)動程序[1]。因此,開發(fā)外設的驅(qū)動是在不同硬件平臺上移植VxWorks操作系統(tǒng)的關(guān)鍵[2]。文中以開發(fā)串口驅(qū)動為例,VxWorks系統(tǒng)環(huán)形緩沖機制在驅(qū)動設計中發(fā)揮了重要作用。
VxWorks系統(tǒng)環(huán)形緩沖機制可以更便捷地實現(xiàn)上層應用和底層硬件之間的讀寫操作,當上層應用的訪問操作速度和底層硬件操作寄存器的速度存在較大的差異時,可以起到良好的緩沖作用,大大減少丟包率[3]。
圖1 環(huán)形緩沖區(qū)讀寫操作
VxWorks中的環(huán)形緩沖[4,5]是基于先進先出(FIFO)的原則,并且提供了環(huán)形緩沖的數(shù)據(jù)結(jié)構(gòu),用戶對緩沖的使用只需要操作對應的數(shù)據(jù)結(jié)構(gòu)即可,讀寫操作如圖1所示。對于環(huán)形緩沖,讀寫指針各自獨立,讀寫操作不需要系統(tǒng)內(nèi)核提供任務同步或互斥的操作,所以讀任務和寫任務可以同時訪問環(huán)形緩沖,而無須互斥信號量的介入。但是,在運行多任務的系統(tǒng)中,如果存在多個讀任務和多個寫任務同時操作環(huán)形緩沖,則需要應用互斥操作機制。
對于用戶開發(fā)的嵌入式計算機,硬件外設通常是根據(jù)特定的需求定制的,所以一般采用非標準的驅(qū)動開發(fā)。驅(qū)動程序介于底層硬件和上層應用之間,用于屏蔽不同硬件平臺的差異,方便上層操作系統(tǒng)和應用程序的移植。在VxWorks操縱系統(tǒng)中,外部設備驅(qū)動程序通常被分成3大類型:字符設備驅(qū)動程序、塊設備驅(qū)動程序和網(wǎng)絡設備驅(qū)動程序[6]。下面所論及的驅(qū)動主要是基于字符設備進行的。
驅(qū)動程序一般包括3個部分:對硬件的相關(guān)配置和初始化操作、硬件的功能性實現(xiàn)以及與上層應用的接口函數(shù)[7],其功能說明如下。
1)初始化操作主要包括驅(qū)動程序用到的數(shù)據(jù)結(jié)構(gòu)的初始化,硬件初始化中相關(guān)寄存器的配置,以及硬件啟動前中斷服務程序的掛接。通常在中斷服務程序的掛接之前,要禁止其相關(guān)的中斷,掛接完成之后,再開啟該中斷。這樣可以避免硬件中斷到來而中斷服務程序尚未掛接好時,所引起的意外狀況。
2)啟動系統(tǒng)運行后臺的定時查詢機制,或者利用中斷機制設計相應的中斷處理程序?qū)崿F(xiàn)對硬件中斷的響應,實現(xiàn)硬件功能。
3)提供給上層應用程序與硬件交互的接口,一般包括設備的打開,關(guān)閉,相關(guān)參數(shù)的配置,數(shù)據(jù)的發(fā)送,數(shù)據(jù)的接收等。
文中涉及的硬件環(huán)境,CPU采用的是TSC695,它是高可靠性、高性能具有容錯抗輻射功能的32位SPARC RISC結(jié)構(gòu)的處理器,存儲器包括RAM、PROM以及FLASH,串行通信是利用FPGA器件自定義設計的六路串口,這里以串口通信為例,利用環(huán)形緩沖機制,介紹驅(qū)動程序的設計。
該六路串口為自定義的串口,所以采用非標準的驅(qū)動程序架構(gòu)實現(xiàn)。驅(qū)動程序按照上節(jié)中提到的3個部分來實行,即對硬件的相關(guān)配置和初始化操作、硬件的功能性實現(xiàn)、與上層應用的接口函數(shù)[8]。該驅(qū)動實現(xiàn)的結(jié)構(gòu)框圖如圖2所示。
圖2 驅(qū)動程序?qū)崿F(xiàn)框圖
首先建立串口的數(shù)據(jù)結(jié)構(gòu),包括基地址定義,發(fā)送緩沖區(qū)句柄,接收緩沖區(qū)句柄,波特率設置,打開標志。初始化串口的數(shù)據(jù)結(jié)構(gòu),對于每一個串口都需要建立對應的發(fā)送緩沖區(qū)和接收緩沖區(qū)。采用這種方式可以同時驅(qū)動多個串口,本設計中用到了6路串口,這樣只需在程序中添加6個串口的設備序號,然后根據(jù)串口設備號,調(diào)用串口的數(shù)據(jù)結(jié)構(gòu)指針即可。
如圖2所示,發(fā)送緩沖區(qū)和接收緩沖區(qū)是用戶應用函數(shù)接口和底層硬件操作的橋梁。對發(fā)送操作而言,當用戶調(diào)用發(fā)送函數(shù)發(fā)送數(shù)據(jù)時,實際上只需把數(shù)據(jù)寫入發(fā)送緩沖區(qū)即可,后臺的定時查詢程序會定時的把數(shù)據(jù)讀出,或者響應硬件發(fā)送中斷將數(shù)據(jù)讀出,然后把從發(fā)送緩沖區(qū)讀出的數(shù)據(jù)寫到串口的發(fā)送數(shù)據(jù)寄存器。對于接收操作而言,用戶調(diào)用接收函數(shù)接收數(shù)據(jù)時,實際上只是從接收緩沖區(qū)中讀取有效數(shù)據(jù),后臺的定時查詢程序會定時的讀取串口的接收數(shù)據(jù)寄存器,或者響應串口的接收中斷讀取串口接收數(shù)據(jù)寄存器,然后將從硬件上接收到的數(shù)據(jù)寫入到接收緩沖區(qū)中,如果接收緩沖區(qū)沒有接收到數(shù)據(jù),則用戶的接收函數(shù)返回結(jié)果零,反之,返回接收到的數(shù)據(jù)個數(shù),并將數(shù)據(jù)寫入用戶指定的數(shù)組中。若用中斷機制,需要調(diào)用函數(shù)intConnet掛接指定的程序來代替中斷服務程序。
提供給上層應用的接口函數(shù),仿照標準驅(qū)動程序函數(shù)的實現(xiàn)[9-10],具體接口函數(shù)如表1所示。
表1 應用層接口函數(shù)
串口的處理過程可以分為兩種,定時查詢和中斷處理[11,13]。
1)定時查詢,好處是在傳輸大容量數(shù)據(jù)時,可以避免因CPU頻繁地響應串口的字節(jié)中斷而造成CPU資源緊張。本文的自定義六路串口,采用FPAG設計,串口FIFO的大小是128字節(jié),提供了FIFO的滿中斷,半滿中斷,非空中斷,空中斷等標志,驅(qū)動程序可以通過定時的檢測FIFO的標志位,根據(jù)FIFO當前的狀態(tài)接收或者發(fā)送,而且是一次性的將FIFO中的數(shù)據(jù)發(fā)送或者接收,這樣提高了串口的收發(fā)效率。
定時查詢機制利用的是VxWorks操作系統(tǒng)提供的看門狗定時器,該定時器的管理函數(shù)庫為wdLib。wdLib庫提供了通用的看門狗定時器模塊,任何任務都可以創(chuàng)建看門狗定時器,并在指定延遲之后,在系統(tǒng)時鐘ISR的上下文運行一個指定的程序。調(diào)用wdCreate()創(chuàng)建一個看門狗定時器,然后調(diào)用wdStart()啟用,當延遲時間到達時,系統(tǒng)執(zhí)行wdStart()函數(shù)指定的超時程序。由于看門狗定時器僅執(zhí)行一次,但對設計的定時查詢程序來說,需要周期性的執(zhí)行定時器,所以在超時程序中必須自身調(diào)用wdStart()函數(shù)來重新啟動定時器。
需要注意的問題是,VxWorks系統(tǒng)在中斷級調(diào)用超時程序,而不是在任務的上下文中。因此超時程序的設計規(guī)則與中斷服務程序是類似的,即程序中不能獲取信號量,不可以調(diào)用printf()等。
2)中斷處理,優(yōu)點是可以及時響應硬件中斷,在傳輸數(shù)據(jù)量不大的情況下,是更優(yōu)的選擇。中斷服務程序完成對硬件的響應,確認中斷源,清除中斷。通常中斷服務程序自身不處理過多的事情,而是利用系統(tǒng)提供的通信機制啟動相應的任務完成后續(xù)的處理。當串口接收數(shù)據(jù)時,產(chǎn)生接收中斷,系統(tǒng)中斷機制調(diào)用中斷處理程序判斷中斷是接收中斷,讀數(shù)據(jù)寄存器,將數(shù)據(jù)放入接收緩沖區(qū);當發(fā)送數(shù)據(jù)時,先將第一個字節(jié)寫入數(shù)據(jù)寄存器,用以啟動發(fā)送空中斷,將其他待發(fā)送數(shù)據(jù)放入接收緩沖區(qū),中斷發(fā)生時,中斷服務程序判斷發(fā)送緩沖非空,將數(shù)據(jù)送到數(shù)據(jù)寄存器,同時清中斷。
為方便系統(tǒng)調(diào)用,在運行過程中,可以根據(jù)需要改變串口的工作方式,比如設置新的波特率、新的方式字等,要求設計UartIoctl()函數(shù)。需要注意的是,如果使用中斷方式,當設置波特率時,需要在禁止系統(tǒng)中斷的條件下完成,即設置波特率前,調(diào)用intLock函數(shù)禁止中斷,設置完成后調(diào)用intUnlock函數(shù)恢復系統(tǒng)中斷設置。
VxWorks提供的環(huán)形緩沖區(qū)數(shù)據(jù)結(jié)構(gòu)相關(guān)定義在rngLib.h中,定義如下:
為了在多線程中能夠很好使用,不發(fā)生讀寫沖突,增加了讀寫鎖。設計的增強環(huán)形緩沖區(qū)結(jié)構(gòu)定義如下:
串口設備的設備描述結(jié)構(gòu)定義如下:
對于VxWorks環(huán)形緩沖區(qū)的讀寫操作,在引入了讀寫數(shù)據(jù)鎖后,讀寫指針的值就不會出現(xiàn)錯誤值,保證了多任務下數(shù)據(jù)進出緩沖區(qū)的正確率。其基本代碼如下:
當操作底層硬件與接收緩沖區(qū)的數(shù)據(jù)傳輸時,根據(jù)FIFO的標志,調(diào)用readbuf()函數(shù)時設置Maxbytes分別為128、64或1;當操作底層硬件與發(fā)送緩沖區(qū)的數(shù)據(jù)傳輸時,根據(jù)FIFO的標志,調(diào)用writebuf()函數(shù)時設置 Maxbytes分別為1、64或128;而應用層接口函數(shù) UartWrite()和 UartRead()調(diào)用 readbuf()和 writebuf()時,Maxbytes=len。
驅(qū)動程序開發(fā)完成后,將驅(qū)動程序庫和VxWorks操作系統(tǒng)編譯融合在一起,VxWorks啟動后,調(diào)用驅(qū)動程序中的硬件初始化函數(shù),掛接中斷服務程序,在查詢方式的情況下,啟用后臺的定時查詢函數(shù)[14-16]。這樣用戶開發(fā)上層應用程序的軟硬件平臺就搭建好了。對于其他字符設備驅(qū)動程序的開發(fā)應用[17],與此類似。
文中以串口通信為例,重點討論了在VxWorks操作系統(tǒng)下,利用VxWorks環(huán)形緩沖機制進行TSC695處理器的自定義驅(qū)動程序的開發(fā),在一定程度上提高了CPU的利用率和通信效率,減少了丟包率,對系統(tǒng)的可靠性和穩(wěn)定性[18]有一定的改進。
[1]孔祥營,柏桂枝.嵌入式實時操作系統(tǒng)VxWorks及其開發(fā)環(huán)境Tornado[M].北京:中國電力出版社,2003.
[2]張原,鄒程帥,張帥,等.基于VxWorks的PCI總線多功能數(shù)據(jù)采集卡驅(qū)動開發(fā)[J].電子設計工程,2012(12):45-47.
[3]姚章俊,陳蜀宇,盧堯.一種高性能環(huán)形緩沖區(qū)的研究和實現(xiàn)[J].計算機工程,2012,38(8):228-231.
[4]徐勤朋,劉蔭忠.基于緩沖區(qū)的兩級插補器的研究與設計[J].組合機床與自動化加工技術(shù),2014(3):9-12.
[5]蔡偉,周乃恩.基于環(huán)形緩存技術(shù)的無人機數(shù)據(jù)接口設備設計[J].微型機與應用,2013,32(2):7-8.
[6]基于嵌入式操作系統(tǒng)VxWorks的I2C總線驅(qū)動設計[J].單片機與嵌入式系統(tǒng)應用,2015(8):34-37.
[7]強新建,田澤,淮治華.VxWorks下驅(qū)動程序設計[J].西安石油大學學報:自然科學版,2010,25(3):11,94-96,104.
[8]李偉,李杰濤,韋金生.VxWorks下多串口卡驅(qū)動程序設計初探[J].硅谷,2013(13):48,194.
[9]莫進軍.實時操作系統(tǒng)VxWorks下實現(xiàn)串口通信的方法[J].信息與電腦,2011(4):169,171.
[10]官琴,王璐.基于VxWorks嵌入式系統(tǒng)的多串口驅(qū)動程序開發(fā)[J].兵工自動化,2011,30(6):94-96.
[11]陳楸,程鵬飛,吳成富,等.基于VxWorks定時中斷的自適應串口驅(qū)動設計[J].測控技術(shù),2012,31(7):103-105.
[12]凌約雷,邱愛華,席隆,等.國產(chǎn)高可靠控制器BM3803MG的BSP設計[J].電子技術(shù)應用,2012(1):24-27.
[13]高常波.Vxworks下多串口擴展卡驅(qū)動實現(xiàn)[J].通信技術(shù),2010(4):47-49.
[14]Wind River System,Inc VxWorks 6.1 Programmer’s Guide[M].2012.
[15]Wind River System,IncBSP Developer’sKit User’s Guide[M].2012.
[16]曹桂平.VxWorks設備驅(qū)動開發(fā)詳解[M].電子工業(yè)出版社,2011.
[17]張煜,陳欣,宋力兵,等.基于MPC8280的CPU單元與內(nèi)部總線驅(qū)動程序設計[J].電子設計工程,2014,22(19):43-46.
[18]白少卿,孫亮.膜片閥破裂壓力穩(wěn)定性研究[J].火箭推進,2015(6):46.
Driver design based on ring buffer in VxWorks
TANG Xiao-bei1,DU Xiao-xue2,SUI Jiang-bo3
(1.Naval Research Institute of Drill Equipment,Beijing 102308,china;2.Weapon Department,North Sea Fleet,qingdao 266011,china;3.Department 5,Naval Aeronautical and Astronautical University,Yantai 264001,china)
For development requirements of standard driving of the military PDA custom hardware in VxWorks embedded operation system,Analyzed the driver function design of VxWorks embedded operating system,with multiple serial ports driver as an example,combined with the watchdog timer and interrupt handling mechanism,used thering managementinterface function VxWorks System itself provides,designed a more efficient and reliable,stable performance of the driver of character device,reduced the rateof loss of communication and improved the efficiency.All reference value based on VxWorks character device driver developers to thering.
military PDA; VxWorks; ring buffer; driver
TN954
A
1674-6236(2017)16-0037-05
2016-05-18稿件編號:201605178
唐小貝(1975—),男,湖南洞口人,碩士,工程師。研究方向:作戰(zhàn)仿真、軟件建模、系統(tǒng)工程。