Works環(huán)境下雙冗余以太網(wǎng)卡技術(shù)在底層驅動(dòng)中的實(shí)現
VxWorks操作系統是美國Wind River公司于1983年設計開(kāi)發(fā)的一種嵌入式實(shí)時(shí)操作系統(RTOS),良好的持續發(fā)展能力、高性能的內核以及友好的用戶(hù)開(kāi)發(fā)環(huán)境,使其在嵌入式實(shí)時(shí)操作系統領(lǐng)域居于領(lǐng)先地位,廣泛應用于現代的各種嵌入式計算機系統中,比如軍事指揮系統、武器控制系統或工業(yè)控制系統中。而在這些系統中,往往不是單個(gè)計算機的控制,而是多個(gè)計算機以及其他設備組成通信網(wǎng)絡(luò )共同完成控制作用,因此,對于每一個(gè)嵌入式計算機除了連接必需的外設之外,還需要考慮計算機之間的通信。計算機間常用的通信方式是利用串行口來(lái)實(shí)現的。本文在VxWorks多串口通信的實(shí)現過(guò)程中未采用常見(jiàn)的標準VxWorks虛擬設備ttyDrv驅動(dòng)方式,而是在用戶(hù)的驅動(dòng)程序中直接對硬件進(jìn)行初始化,以中斷方式進(jìn)行串口通信。
本文引用地址:http://dyxdggzs.com/article/148568.htm1 環(huán)境及配置
VxWorks嵌入式開(kāi)發(fā)采用圖1所示的主機一目標機方式。
其他硬件與本文關(guān)系不大,這里主要介紹串口卡,該卡是DIAMOND SYSTEM公司生產(chǎn)的EMERALD-MM-8型8串口擴展卡(以下簡(jiǎn)稱(chēng)EMM8),是基于2片ST16C554芯片的8串口集成板卡,每一路串口均可單獨配置成符合RS-232C/RS-422A/RS-485協(xié)議規范,最高速率可達115.2 kb/s。通用異步收發(fā)器(UART)ST16C554用來(lái)擴展4路串口通道。每路通道各有一組16 B的收發(fā)FIFO和移位寄存器,用來(lái)緩沖數據和串并轉換。每個(gè)通道有12個(gè)8 b內部寄存器,用來(lái)存放收發(fā)數據以及配置該串口的工作模式,需要在初始化時(shí)對各寄存器進(jìn)行設置。本文根據工程的要求,將卡上的硬件跳線(xiàn)設好,如:各串口使用RS-232C協(xié)議,按照datasheet進(jìn)行硬件跳線(xiàn)。其中J9的配置較為重要,如圖2所示。
D、C、B、A 四位表示base address,從data sheet中查表可知其跳線(xiàn)情況,以本項目為例,base address為0x300,則D、C、B、A分別為out、out、in、in,為1100。
2、3、4…15為該卡可用的中斷號,要使用哪個(gè)中斷就必須將其跳為in。本項目由于中斷資源不足,只能用一個(gè)中斷號即7號中斷,因此只將7設為in。
CK為頻段范圍跳線(xiàn),對ST16C554來(lái)說(shuō)必須為in。
另外,EMM8在系統啟動(dòng)時(shí)會(huì )從板上的EEPROM 中讀取各個(gè)端口的基本配置信息,主要是端口映射地址及分配的中斷號,這些信息可以在啟動(dòng)后編程修改,但一般是固定的,因此只要在EEPROM 中配置一次并保存即可。
2 多串口驅動(dòng)開(kāi)發(fā)
2.1 I/O系統與串口設備驅動(dòng)層次結構
I/O系統與串口設備驅動(dòng)層次如圖3所示。
圖3中最底層就是要編寫(xiě)的驅動(dòng)程序。在這里主要完成對具體硬件的各種操作,以及與上層的接口。硬件驅動(dòng)層上面是ttyDrv和tyLib。這一層比較特殊,是Vxworks專(zhuān)門(mén)為串口設備準備的一個(gè)虛擬驅動(dòng)庫,它把跟具體硬件無(wú)關(guān)的操作集成在了這一層中。這樣用戶(hù)只編寫(xiě)與硬件有關(guān)的驅動(dòng)和跟這一層的接口函數即可。從總的結構講,這2層都屬于設備驅動(dòng)的范疇。再上一層是I/O系統層,Vxworks的I/O系統向上提供了7個(gè)基本的I/O接口,供應用程序調用;向下提供與各種設備驅動(dòng)程序的接口。I/O系統把應用程序跟驅動(dòng)程序有機地連接起來(lái)。最頂層就是用戶(hù)根據應用需要編寫(xiě)的應用程序。ttyDrv是一個(gè)虛擬設備驅動(dòng),用于處理I/O系統與底層實(shí)際設備驅動(dòng)程序(可以是用戶(hù)設計的驅動(dòng)程序)之間的通信。使用ttyDrv控制串口是比較常見(jiàn)的串口驅動(dòng)實(shí)現方式,實(shí)際上,直接對硬件進(jìn)行初始化,以中斷方式進(jìn)行串口通信也是可行的方式,且更加靠近底層,可以更自由、高效的控制串口。
2.2 EMM8驅動(dòng)開(kāi)發(fā)
首先是對各串口的初始化和中斷配置,初始化包括設置波特率以及數據格式。
在實(shí)際的工程應用中,需要8個(gè)串口共同使用一個(gè)中斷(中斷資源不足),實(shí)現8串口的全雙工同時(shí)收發(fā)。難點(diǎn)在于使用同一個(gè)中斷且不能丟數據,對于驅動(dòng)使用同中斷問(wèn)題,關(guān)鍵是接收數據的中斷服務(wù)程序ISR。經(jīng)過(guò)探索,不論是否使用單中斷,讀EMM8卡上I/O Register Map表中的一個(gè)中斷狀態(tài)寄存器(interrupt status register),可以指出當時(shí)是哪一個(gè)串口收到數據,讀出該串口的數據即可。但是這種實(shí)現方法經(jīng)過(guò)測試在接收時(shí)丟數據。后經(jīng)研究發(fā)現,中斷狀態(tài)寄存器并不一定在某一個(gè)時(shí)刻只有一個(gè)端口位發(fā)生跳轉。即CPU 收到中斷后,有可能是幾個(gè)串口“同時(shí)”收到數據,這是因為中斷控制器將同一個(gè)CPU中斷分給了不同的串口。從CPU端看來(lái)只有一個(gè)中斷,但從各串口來(lái)講,這個(gè)中斷有可能是幾個(gè)串口“同時(shí)”產(chǎn)生的。因此要對中斷狀態(tài)寄存器進(jìn)行輪詢(xún),由發(fā)生跳轉的串口位接收該串口的數據。修改后,經(jīng)過(guò)編寫(xiě)用例測試,可以穩定地使用單中斷接收數據且不影響數據的發(fā)送。
2.3 驅動(dòng)測試
首先是各串口的功能測試,使用“串口調試助手”軟件工具通過(guò)PC機與各目標機串口通信,收發(fā)數據,然后通過(guò)屏幕顯示得到的數據,對比規定的預期結果,檢測數據收發(fā)是否正確。經(jīng)多次驗證,工作穩定,通信正確。
綜合測試:使用2臺PC104分別安裝STV2050CPU模塊和EMM8多串口模塊各1塊,2臺PC通過(guò)網(wǎng)口(交換機)連接2臺PC104,2個(gè)EMM8通過(guò)8根RS-232雙頭串口線(xiàn)連接。2臺PC通過(guò)網(wǎng)口使用tornado的shell工具下載啟動(dòng)程序。2臺PC104分別稱(chēng)為1主機和2主機。測試方法是:1主機同時(shí)發(fā)送8串口的數據,2主機8串口接收并轉發(fā)回1主機。1主機接收返回的數據,判斷是否通信錯誤。經(jīng)檢驗正確通信300000次無(wú)錯,多次驗證。完成對EMM8多串口通訊模塊全雙工收發(fā)的測試。
經(jīng)過(guò)以上測試,表明本文所述的多串口卡通信實(shí)現方法有效,所開(kāi)發(fā)模塊穩定可靠。
3 結束語(yǔ)
本文介紹了VxWorks嵌入式系統中的多串口卡通信的實(shí)現過(guò)程,因篇幅有限,不能列出詳盡代碼。本文以EMM8為例,采用驅動(dòng)直接訪(fǎng)問(wèn)硬件的方法,較為簡(jiǎn)潔、高效地解決了單中斷多串口全雙工通信的問(wèn)題,滿(mǎn)足了項目需求,并經(jīng)過(guò)了測試和驗收。為日后類(lèi)似問(wèn)題的解決提供了一些參考和經(jīng)驗。
評論