歡迎您光臨本站 登入註冊首頁

基於VxWorks的多串口卡通信實現

admin @ 2014-03-25 , reply:0

概述

   VxWorks操作系統是美國WindRiver公司於1983年設計開發的一種嵌入式實時操作系統(RTOS),良好的持續發展能力、高性能的內核以及友好的用戶開發環境,……

    VxWorks操作系統是美國Wind River公司於1983年設計開發的一種嵌入式實時操作系統(RTOS),良好的持續發展能力、高性能的內核以及友好的用戶開發環境,使其在嵌入式實時操作系統領域居於領先地位,廣泛應用於現代的各種嵌入式計算機系統中,比如軍事指揮系統、武器控制系統或工業控制系統中。而在這些系統中,往往不是單個計算機的控制,而是多個計算機以及其他設備組成通信網路共同完成控制作用,因此,對於每一個嵌入式計算機除了連接必需的外設之外,還需要考慮計算機之間的通信。計算機間常用的通信方式是利用串列口來實現的。本文在VxWorks多串口通信的實現過程中未採用常見的標準VxWorks虛擬設備ttyDrv驅動方式,而是在用戶的驅動程序中直接對硬體進行初始化,以中斷方式進行串口通信。

1 環境及配置
    VxWorks嵌入式開發採用圖1所示的主機一目標機方式。
 
    其他硬體與本文關係不大,這裡主要介紹串口卡,該卡是DIAMOND SYSTEM公司生產的EMERALD-MM-8型8串口擴展卡(以下簡稱EMM8),是基於2片ST16C554晶元的8串口集成板卡,每一路串口均可單獨配置成符合RS-232C/RS-422A/RS-485協議規範,最高速率可達115.2 kb/s。通用非同步收發器(UART)ST16C554用來擴展4路串口通道。每路通道各有一組16 B的收發FIFO和移位寄存器,用來緩衝數據和串並轉換。每個通道有12個8 b內部寄存器,用來存放收發數據以及配置該串口的工作模式,需要在初始化時對各寄存器進行設置。本文根據工程的要求,將卡上的硬體跳線設好,如:各串口使用RS-232C協議,按照datasheet進行硬體跳線。其中J9的配置較為重要,如圖2所示。
 
    D、C、B、A 四位表示base address,從data sheet中查表可知其跳線情況,以本項目為例,base address為0x300,則D、C、B、A分別為out、out、in、in,為1100。
    2、3、4…15為該卡可用的中斷號,要使用哪個中斷就必須將其跳為in。本項目由於中斷資源不足,只能用一個中斷號即7號中斷,因此只將7設為in。
    CK為頻段範圍跳線,對ST16C554來說必須為in。
    另外,EMM8在系統啟動時會從板上的EEPROM 中讀取各個埠的基本配置信息,主要是埠映射地址及分配的中斷號,這些信息可以在啟動后編程修改,但一般是固定的,因此只要在EEPROM 中配置一次並保存即可。

2 多串口驅動開發
2.1 I/O系統與串口設備驅動層次結構
    I/O系統與串口設備驅動層次如圖3所示。
 
    圖3中最底層就是要編寫的驅動程序。在這裡主要完成對具體硬體的各種操作,以及與上層的介面。硬體驅動層上面是ttyDrv和tyLib。這一層比較特殊,是Vxworks專門為串口設備準備的一個虛擬驅動庫,它把跟具體硬體無關的操作集成在了這一層中。這樣用戶只編寫與硬體有關的驅動和跟這一層的介面函數即可。從總的結構講,這2層都屬於設備驅動的範疇。再上一層是I/O系統層,Vxworks的I/O系統向上提供了7個基本的I/O介面,供應用程序調用;向下提供與各種設備驅動程序的介面。I/O系統把應用程序跟驅動程序有機地連接起來。最頂層就是用戶根據應用需要編寫的應用程序。ttyDrv是一個虛擬設備驅動,用於處理I/O系統與底層實際設備驅動程序(可以是用戶設計的驅動程序)之間的通信。使用ttyDrv控制串口是比較常見的串口驅動實現方式,實際上,直接對硬體進行初始化,以中斷方式進行串口通信也是可行的方式,且更加靠近底層,可以更自由、高效的控制串口。

2.2 EMM8驅動開發
    首先是對各串口的初始化和中斷配置,初始化包括設置波特率以及數據格式。
    在實際的工程應用中,需要8個串口共同使用一個中斷(中斷資源不足),實現8串口的全雙工同時收發。難點在於使用同一個中斷且不能丟數據,對於驅動使用同中斷問題,關鍵是接收數據的中斷服務程序ISR。經過探索,不論是否使用單中斷,讀EMM8卡上I/O Register Map表中的一個中斷狀態寄存器(interrupt status register),可以指出當時是哪一個串口收到數據,讀出該串口的數據即可。但是這種實現方法經過測試在接收時丟數據。后經研究發現,中斷狀態寄存器並不一定在某一個時刻只有一個埠位發生跳轉。即CPU 收到中斷後,有可能是幾個串口“同時”收到數據,這是因為中斷控制器將同一個CPU中斷分給了不同的串口。從CPU端看來只有一個中斷,但從各串口來講,這個中斷有可能是幾個串口“同時”產生的。因此要對中斷狀態寄存器進行輪詢,由發生跳轉的串口位接收該串口的數據。修改後,經過編寫用例測試,可以穩定地使用單中斷接收數據且不影響數據的發送。

2.3 驅動測試
    首先是各串口的功能測試,使用“串口調試助手”軟體工具通過PC機與各目標機串口通信,收發數據,然後通過屏幕顯示得到的數據,對比規定的預期結果,檢測數據收發是否正確。經多次驗證,工作穩定,通信正確。
    綜合測試:使用2台PC104分別安裝STV2050CPU模塊和EMM8多串口模塊各1塊,2台PC通過網口(交換機)連接2台PC104,2個EMM8通過8根RS-232雙頭串口線連接。2台PC通過網口使用tornado的shell工具下載啟動程序。2台PC104分別稱為1主機和2主機。測試方法是:1主機同時發送8串口的數據,2主機8串口接收並轉發回1主機。1主機接收返回的數據,判斷是否通信錯誤。經檢驗正確通信300000次無錯,多次驗證。完成對EMM8多串口通訊模塊全雙工收發的測試。
    經過以上測試,表明本文所述的多串口卡通信實現方法有效,所開發模塊穩定可靠。

3 結束語
    本文介紹了VxWorks嵌入式系統中的多串口卡通信的實現過程,因篇幅有限,不能列出詳盡代碼。本文以EMM8為例,採用驅動直接訪問硬體的方法,較為簡潔、高效地解決了單中斷多串口全雙工通信的問題,滿足了項目需求,並經過了測試和驗收。為日後類似問題的解決提供了一些參考和經驗。


[admin via 研發互助社區 ] 基於VxWorks的多串口卡通信實現已經有2184次圍觀

http://cocdig.com/docs/show-post-42153.html