唐小貝,杜小雪,隋江波
(1.海軍軍訓器材研究所 北京 102308;2.北海艦隊裝備部 山東 青島 266011;3.海軍航空工程學院 指揮系,山東 煙臺 264001)
基于VxWorks的環形緩沖機制的驅動設計
唐小貝1,杜小雪2,隋江波3
(1.海軍軍訓器材研究所 北京 102308;2.北海艦隊裝備部 山東 青島 266011;3.海軍航空工程學院 指揮系,山東 煙臺 264001)
針對軍用PDA硬件自定義設備在VxWorks嵌入式操作系統中的標準化驅動程序開發需求,分析了VxWorks嵌入式操作系統的驅動程序功能設計,以多串口通信驅動為例,結合看門狗定時器和中斷處理機制,采用VxWorks系統自身提供的環形緩沖區管理接口庫函數,設計了一種更為可靠高效、性能穩定的字符設備底層驅動程序,減少了通信的丟包率,提高了效率。對所有基于環形緩沖機制下的VxWorks字符設備驅動程序開發者具有參考價值。
軍用PDA;VxWorks;環形緩沖區;驅動
VxWorks作為一種強實時性的操作系統RTOS,廣泛應用于諸如單兵手持終端、軍用PDA等用戶定制的計算機上。這類嵌入式計算機,按照用途的不同,定制硬件時所采用的CPU類型和相關外設都有所區別。VxWorks系統能夠支持ARM、PowerPC、X86等大多數類型的CPU,但不同的硬件外設要求VxWorks系統必須提供相應的驅動程序[1]。因此,開發外設的驅動是在不同硬件平臺上移植VxWorks操作系統的關鍵[2]。文中以開發串口驅動為例,VxWorks系統環形緩沖機制在驅動設計中發揮了重要作用。
VxWorks系統環形緩沖機制可以更便捷地實現上層應用和底層硬件之間的讀寫操作,當上層應用的訪問操作速度和底層硬件操作寄存器的速度存在較大的差異時,可以起到良好的緩沖作用,大大減少丟包率[3]。

圖1 環形緩沖區讀寫操作
VxWorks中的環形緩沖[4,5]是基于先進先出(FIFO)的原則,并且提供了環形緩沖的數據結構,用戶對緩沖的使用只需要操作對應的數據結構即可,讀寫操作如圖1所示。對于環形緩沖,讀寫指針各自獨立,讀寫操作不需要系統內核提供任務同步或互斥的操作,所以讀任務和寫任務可以同時訪問環形緩沖,而無須互斥信號量的介入。但是,在運行多任務的系統中,如果存在多個讀任務和多個寫任務同時操作環形緩沖,則需要應用互斥操作機制。
對于用戶開發的嵌入式計算機,硬件外設通常是根據特定的需求定制的,所以一般采用非標準的驅動開發。驅動程序介于底層硬件和上層應用之間,用于屏蔽不同硬件平臺的差異,方便上層操作系統和應用程序的移植。在VxWorks操縱系統中,外部設備驅動程序通常被分成3大類型:字符設備驅動程序、塊設備驅動程序和網絡設備驅動程序[6]。下面所論及的驅動主要是基于字符設備進行的。
驅動程序一般包括3個部分:對硬件的相關配置和初始化操作、硬件的功能性實現以及與上層應用的接口函數[7],其功能說明如下。
1)初始化操作主要包括驅動程序用到的數據結構的初始化,硬件初始化中相關寄存器的配置,以及硬件啟動前中斷服務程序的掛接。通常在中斷服務程序的掛接之前,要禁止其相關的中斷,掛接完成之后,再開啟該中斷。這樣可以避免硬件中斷到來而中斷服務程序尚未掛接好時,所引起的意外狀況。
2)啟動系統運行后臺的定時查詢機制,或者利用中斷機制設計相應的中斷處理程序實現對硬件中斷的響應,實現硬件功能。
3)提供給上層應用程序與硬件交互的接口,一般包括設備的打開,關閉,相關參數的配置,數據的發送,數據的接收等。
文中涉及的硬件環境,CPU采用的是TSC695,它是高可靠性、高性能具有容錯抗輻射功能的32位SPARC RISC結構的處理器,存儲器包括RAM、PROM以及FLASH,串行通信是利用FPGA器件自定義設計的六路串口,這里以串口通信為例,利用環形緩沖機制,介紹驅動程序的設計。
該六路串口為自定義的串口,所以采用非標準的驅動程序架構實現。驅動程序按照上節中提到的3個部分來實行,即對硬件的相關配置和初始化操作、硬件的功能性實現、與上層應用的接口函數[8]。該驅動實現的結構框圖如圖2所示。

圖2 驅動程序實現框圖
首先建立串口的數據結構,包括基地址定義,發送緩沖區句柄,接收緩沖區句柄,波特率設置,打開標志。初始化串口的數據結構,對于每一個串口都需要建立對應的發送緩沖區和接收緩沖區。采用這種方式可以同時驅動多個串口,本設計中用到了6路串口,這樣只需在程序中添加6個串口的設備序號,然后根據串口設備號,調用串口的數據結構指針即可。
如圖2所示,發送緩沖區和接收緩沖區是用戶應用函數接口和底層硬件操作的橋梁。對發送操作而言,當用戶調用發送函數發送數據時,實際上只需把數據寫入發送緩沖區即可,后臺的定時查詢程序會定時的把數據讀出,或者響應硬件發送中斷將數據讀出,然后把從發送緩沖區讀出的數據寫到串口的發送數據寄存器。對于接收操作而言,用戶調用接收函數接收數據時,實際上只是從接收緩沖區中讀取有效數據,后臺的定時查詢程序會定時的讀取串口的接收數據寄存器,或者響應串口的接收中斷讀取串口接收數據寄存器,然后將從硬件上接收到的數據寫入到接收緩沖區中,如果接收緩沖區沒有接收到數據,則用戶的接收函數返回結果零,反之,返回接收到的數據個數,并將數據寫入用戶指定的數組中。若用中斷機制,需要調用函數intConnet掛接指定的程序來代替中斷服務程序。
提供給上層應用的接口函數,仿照標準驅動程序函數的實現[9-10],具體接口函數如表1所示。

表1 應用層接口函數
串口的處理過程可以分為兩種,定時查詢和中斷處理[11,13]。
1)定時查詢,好處是在傳輸大容量數據時,可以避免因CPU頻繁地響應串口的字節中斷而造成CPU資源緊張。本文的自定義六路串口,采用FPAG設計,串口FIFO的大小是128字節,提供了FIFO的滿中斷,半滿中斷,非空中斷,空中斷等標志,驅動程序可以通過定時的檢測FIFO的標志位,根據FIFO當前的狀態接收或者發送,而且是一次性的將FIFO中的數據發送或者接收,這樣提高了串口的收發效率。
定時查詢機制利用的是VxWorks操作系統提供的看門狗定時器,該定時器的管理函數庫為wdLib。wdLib庫提供了通用的看門狗定時器模塊,任何任務都可以創建看門狗定時器,并在指定延遲之后,在系統時鐘ISR的上下文運行一個指定的程序。調用wdCreate()創建一個看門狗定時器,然后調用wdStart()啟用,當延遲時間到達時,系統執行wdStart()函數指定的超時程序。由于看門狗定時器僅執行一次,但對設計的定時查詢程序來說,需要周期性的執行定時器,所以在超時程序中必須自身調用wdStart()函數來重新啟動定時器。
需要注意的問題是,VxWorks系統在中斷級調用超時程序,而不是在任務的上下文中。因此超時程序的設計規則與中斷服務程序是類似的,即程序中不能獲取信號量,不可以調用printf()等。
2)中斷處理,優點是可以及時響應硬件中斷,在傳輸數據量不大的情況下,是更優的選擇。中斷服務程序完成對硬件的響應,確認中斷源,清除中斷。通常中斷服務程序自身不處理過多的事情,而是利用系統提供的通信機制啟動相應的任務完成后續的處理。當串口接收數據時,產生接收中斷,系統中斷機制調用中斷處理程序判斷中斷是接收中斷,讀數據寄存器,將數據放入接收緩沖區;當發送數據時,先將第一個字節寫入數據寄存器,用以啟動發送空中斷,將其他待發送數據放入接收緩沖區,中斷發生時,中斷服務程序判斷發送緩沖非空,將數據送到數據寄存器,同時清中斷。
為方便系統調用,在運行過程中,可以根據需要改變串口的工作方式,比如設置新的波特率、新的方式字等,要求設計UartIoctl()函數。需要注意的是,如果使用中斷方式,當設置波特率時,需要在禁止系統中斷的條件下完成,即設置波特率前,調用intLock函數禁止中斷,設置完成后調用intUnlock函數恢復系統中斷設置。
VxWorks提供的環形緩沖區數據結構相關定義在rngLib.h中,定義如下:

為了在多線程中能夠很好使用,不發生讀寫沖突,增加了讀寫鎖。設計的增強環形緩沖區結構定義如下:


串口設備的設備描述結構定義如下:

對于VxWorks環形緩沖區的讀寫操作,在引入了讀寫數據鎖后,讀寫指針的值就不會出現錯誤值,保證了多任務下數據進出緩沖區的正確率。其基本代碼如下:


當操作底層硬件與接收緩沖區的數據傳輸時,根據FIFO的標志,調用readbuf()函數時設置Maxbytes分別為128、64或1;當操作底層硬件與發送緩沖區的數據傳輸時,根據FIFO的標志,調用writebuf()函數時設置 Maxbytes分別為1、64或128;而應用層接口函數 UartWrite()和 UartRead()調用 readbuf()和 writebuf()時,Maxbytes=len。
驅動程序開發完成后,將驅動程序庫和VxWorks操作系統編譯融合在一起,VxWorks啟動后,調用驅動程序中的硬件初始化函數,掛接中斷服務程序,在查詢方式的情況下,啟用后臺的定時查詢函數[14-16]。這樣用戶開發上層應用程序的軟硬件平臺就搭建好了。對于其他字符設備驅動程序的開發應用[17],與此類似。
文中以串口通信為例,重點討論了在VxWorks操作系統下,利用VxWorks環形緩沖機制進行TSC695處理器的自定義驅動程序的開發,在一定程度上提高了CPU的利用率和通信效率,減少了丟包率,對系統的可靠性和穩定性[18]有一定的改進。
[1]孔祥營,柏桂枝.嵌入式實時操作系統VxWorks及其開發環境Tornado[M].北京:中國電力出版社,2003.
[2]張原,鄒程帥,張帥,等.基于VxWorks的PCI總線多功能數據采集卡驅動開發[J].電子設計工程,2012(12):45-47.
[3]姚章俊,陳蜀宇,盧堯.一種高性能環形緩沖區的研究和實現[J].計算機工程,2012,38(8):228-231.
[4]徐勤朋,劉蔭忠.基于緩沖區的兩級插補器的研究與設計[J].組合機床與自動化加工技術,2014(3):9-12.
[5]蔡偉,周乃恩.基于環形緩存技術的無人機數據接口設備設計[J].微型機與應用,2013,32(2):7-8.
[6]基于嵌入式操作系統VxWorks的I2C總線驅動設計[J].單片機與嵌入式系統應用,2015(8):34-37.
[7]強新建,田澤,淮治華.VxWorks下驅動程序設計[J].西安石油大學學報:自然科學版,2010,25(3):11,94-96,104.
[8]李偉,李杰濤,韋金生.VxWorks下多串口卡驅動程序設計初探[J].硅谷,2013(13):48,194.
[9]莫進軍.實時操作系統VxWorks下實現串口通信的方法[J].信息與電腦,2011(4):169,171.
[10]官琴,王璐.基于VxWorks嵌入式系統的多串口驅動程序開發[J].兵工自動化,2011,30(6):94-96.
[11]陳楸,程鵬飛,吳成富,等.基于VxWorks定時中斷的自適應串口驅動設計[J].測控技術,2012,31(7):103-105.
[12]凌約雷,邱愛華,席隆,等.國產高可靠控制器BM3803MG的BSP設計[J].電子技術應用,2012(1):24-27.
[13]高常波.Vxworks下多串口擴展卡驅動實現[J].通信技術,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設備驅動開發詳解[M].電子工業出版社,2011.
[17]張煜,陳欣,宋力兵,等.基于MPC8280的CPU單元與內部總線驅動程序設計[J].電子設計工程,2014,22(19):43-46.
[18]白少卿,孫亮.膜片閥破裂壓力穩定性研究[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—),男,湖南洞口人,碩士,工程師。研究方向:作戰仿真、軟件建模、系統工程。