徐騫
摘 要: 中斷控制是嵌入式操作系統(tǒng)VxWorks正常運(yùn)行的基礎(chǔ),是其具有高實(shí)時(shí)性的保障。針對(duì)VxWorks系統(tǒng)下中斷控制驅(qū)動(dòng)開(kāi)發(fā)難度大、應(yīng)用廣等特點(diǎn),首次提出了VxWorks系統(tǒng)中斷控制驅(qū)動(dòng)分層模型?;谠撃P吞岢隽薞xWorks下中斷控制驅(qū)動(dòng)軟件的設(shè)計(jì)方法,并基于該方法實(shí)現(xiàn)了VxWorks下國(guó)產(chǎn)龍芯3A處理器中斷控制驅(qū)動(dòng)軟件的開(kāi)發(fā)。最后提出一種優(yōu)化龍芯3A中斷控制性能的方法,大大縮短了中斷響應(yīng)時(shí)間,提高了系統(tǒng)的性能。
關(guān)鍵詞: 中斷控制; VxWorks; 龍芯3A; 驅(qū)動(dòng)軟件
中圖分類(lèi)號(hào): TN876?34; TP311.1 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2017)14?0036?04
Abstract: Interrupt control is the base of normal running of the embedded operating system VxWorks and is a safeguard of high real?time performance. A drive hierarchical model of interrupt control on VxWorks is proposed aiming at the characteristics that the drive development of interrupt control on the embedded operating system VxWorks has great difficulty and its wide application. According to this model, a design method of interrupt control drive software based on VxWorks is put forward. The interrupt control drive software of Loongson 3A have was developed successfully with the method. A method to optimize the Loongson 3A interrupt control performance is presented. It greatly shortens the interrupt response time, and improves the performance of the system.
Keywords: interrupt control; VxWorks; Loongson 3A; drive software
VxWorks操作系統(tǒng)是風(fēng)河公司推出的一種嵌入式實(shí)時(shí)操作系統(tǒng), 以其高性能、高可靠性、高實(shí)時(shí)性等特點(diǎn)成為實(shí)時(shí)操作系統(tǒng)中最具特色的系統(tǒng)之一。其廣泛地應(yīng)用在通信、軍事、航空、航天等高端技術(shù)及實(shí)時(shí)性、擴(kuò)展性要求極高的領(lǐng)域中[1]。龍芯系列處理器芯片是龍芯中科技術(shù)有限公司研發(fā)的具有自主知識(shí)產(chǎn)權(quán)的處理器芯片,產(chǎn)品包括龍芯1號(hào)、龍芯2號(hào)和龍芯3號(hào)三個(gè)系列[2]。龍芯3A處理器是龍芯3號(hào)處理器的第一款產(chǎn)品,主要面向高性能計(jì)算機(jī)、服務(wù)器和高端桌面應(yīng)用,是一款實(shí)現(xiàn)64位MIPS Ⅲ指令集的高性能四核處理器芯片,片內(nèi)集成了HT控制器、PCI/PCIX等接口,最高工作主頻[3]可以達(dá)到1 GHz。VxWorks作為一個(gè)實(shí)時(shí)嵌入式操作系統(tǒng),通常采用中斷的方式來(lái)滿足系統(tǒng)實(shí)時(shí)性的要求。因此,中斷控制驅(qū)動(dòng)的實(shí)現(xiàn)對(duì)于VxWorks操作系統(tǒng)的開(kāi)發(fā)是至關(guān)重要的[4]。本文在研究VxWorks系統(tǒng)中斷控制技術(shù)的基礎(chǔ)之上,描述了VxWorks下龍芯3A中斷控制驅(qū)動(dòng)的設(shè)計(jì)方法和實(shí)現(xiàn)過(guò)程,并對(duì)其中斷控制性能進(jìn)行了優(yōu)化。
1 龍芯3A的中斷控制
龍芯3A的中斷通路示意圖如圖1所示。南橋的中斷控制器在接收到外部設(shè)備的中斷申請(qǐng)后,發(fā)出中斷請(qǐng)求,經(jīng)過(guò)PCIE根控制器轉(zhuǎn)化后發(fā)送到HT總線上,然后被HT控制器得知,HT控制器根據(jù)接收到的中斷信息來(lái)設(shè)置自己的中斷狀態(tài)寄存器,之后按照既定的配置發(fā)出中斷信號(hào)至CPU的中斷路由配置模塊,最后按照中斷路由模塊的設(shè)置將中斷信號(hào)送到某個(gè)CPU核上[5]。
2 VxWorks下的中斷控制
2.1 中斷控制驅(qū)動(dòng)分層模型
VxWorks下中斷控制有一個(gè)層次的劃分,一些中斷控制器的輸入是其他中斷控制器的輸出,因此可以將中斷控制驅(qū)動(dòng)抽象為三層,具體情況如圖2所示。
圖2中,第一層為CPU指定的中斷控制驅(qū)動(dòng),與CPU的體系架構(gòu)密切相關(guān),主要包括CPU一級(jí)與中斷相關(guān)的配置,如中斷路由等;第二層中斷控制器直接與第一層CPU中斷路由模塊相連,并作為其中斷輸入,最常見(jiàn)的如8259中斷控制器[5];第三層中斷控制作為第二層的中斷輸入,一般與外部設(shè)備密切相關(guān),主要實(shí)現(xiàn)了中斷服務(wù)程序的掛接和中斷的響應(yīng)處理,如傳統(tǒng)的PCI設(shè)備中斷控制就屬于該層[6]。
2.2 中斷控制驅(qū)動(dòng)設(shè)計(jì)方法
基于VxWorks下中斷控制驅(qū)動(dòng)分層模型,本文提出了VxWorks下中斷控制驅(qū)動(dòng)的設(shè)計(jì)方法,主要包括中斷路由配置、初始化中斷控制器、掛接中斷服務(wù)程序和中斷響應(yīng)處理四個(gè)部分,具體流程如圖3所示。
3 龍芯3A中斷控制驅(qū)動(dòng)的實(shí)現(xiàn)
根據(jù)VxWorks下中斷控制驅(qū)動(dòng)的設(shè)計(jì)方法,可以將龍芯3A中斷控制驅(qū)動(dòng)的實(shí)現(xiàn)主要分為四個(gè)步驟,配置中斷路由、初始化中斷控制器、掛接中斷程序以及中斷響應(yīng)處理。
3.1 配置中斷路由
龍芯3A下通過(guò)配置中斷路由模塊來(lái)確定中斷信號(hào)最終分配到哪個(gè)CPU核上[7?8],中斷路由模塊示意圖如圖4所示。
圖4中,中斷路由配置模塊有32個(gè)外部中斷源,以統(tǒng)一方式進(jìn)行管理。龍芯3A集成了4個(gè)處理器核,任意一個(gè)中斷源都可以通過(guò)軟件配置選擇期望中斷的目標(biāo)處理器核,進(jìn)一步中斷源可以選擇路由到處理器核4個(gè)中斷INT0~I(xiàn)NT3中的任意一個(gè),即圖4所示的CORE0~CORE3的IP0~I(xiàn)P3。在32個(gè)中斷源中,最重要的是與HT總線相關(guān)的中斷源,龍芯3A下絕大部分外部中斷都是通過(guò)HT中斷引腳輸入至CPU,通過(guò)設(shè)置相關(guān)的中斷路由寄存器可以對(duì)這些中斷源進(jìn)行路由配置,部分相關(guān)代碼如下:
STATUS sysIntRouteSet()
{ /*將HT0相關(guān)中斷路由至CPU CORE0 INT1*/
MIPS_SB64 _IO_base_regs_addr(HT0_INT0_ADDR,0x21);
MIPS_SB64 _IO_base_regs_addr(HT0_INT1_ADDR,0x21);
…
/*將HT1相關(guān)中斷路由至CPU CORE0 INT1*/
MIPS_SB64 _IO_base_regs_addr(HT1_INT0_ADDR,0x21);
MIPS_SB64 _IO_base_regs_addr(HT1_INT1_ADDR,0x21);
…}
3.2 初始化中斷控制器
龍芯3A下,中斷控制器位于南橋上,默認(rèn)配置為8259模式,初始化中斷控制器主要包括設(shè)置中斷控制器和使能中斷控制器兩個(gè)部分。
3.2.1 設(shè)置中斷控制器
龍芯3A中斷控制器可用的中斷輸入有8個(gè),INTA#~
INTH#,輸出的中斷號(hào)為irq0~irq15,每個(gè)中斷輸入與輸出中斷號(hào)的映射關(guān)系可以通過(guò)設(shè)置相關(guān)寄存器來(lái)完成,如圖5所示。
圖5中,可以先往0xC00寫(xiě)入一個(gè)值表示配置哪個(gè)中斷輸入,然后寫(xiě)0xC01表示將中斷輸入映射至哪個(gè)irq號(hào)。例如要把INTC#對(duì)應(yīng)的中斷號(hào)設(shè)置為irq6,則操作為:先往0xC00寫(xiě)入2,再往0xC01寫(xiě)入1即可。
3.2.2 使能中斷控制器
中斷配置寄存器都是以位的形式對(duì)相應(yīng)的中斷線進(jìn)行控制。中斷控制器使能的配置主要有三個(gè)寄存器:Intenset,Intenclr和Inten。Intenset設(shè)置中斷使能,Intenset寄存器寫(xiě)1的位對(duì)應(yīng)的中斷被使能;Intenclr清除中斷使能,Intenclr寄存器寫(xiě)1的位對(duì)應(yīng)的中斷被清除;Inten寄存器讀取當(dāng)前各中斷使能的情況。
3.3 掛接中斷服務(wù)程序
VxWorks系統(tǒng)下,需要實(shí)現(xiàn)類(lèi)函數(shù)func{vxbIntCtlrConnect}為硬件配置指定的中斷并搭接相應(yīng)的中斷服務(wù)程序以及中斷輸入,該函數(shù)主要通過(guò)調(diào)用系統(tǒng)函數(shù)intCtrlISRAdd()完成相關(guān)工作[9]。龍芯3A中斷控制驅(qū)動(dòng)中實(shí)現(xiàn)的類(lèi)函數(shù)名為vxbMipsSbIntCtlrConnect,其部分代碼如下:
LOCAL STATUS vxbMipsSbIntCtlrConnect()
{ …
/* 獲取中斷輸入并確認(rèn)其有效 */
if(ERROR == intCtlrPinFind(pDev,index,pIntCtlr,&isrHandle))
return (ERROR);
/*為指定的中斷分配中斷服務(wù)程序和參數(shù)*/
if (intCtlrISRAdd(&pVxbPMipsSbIntCtlrDrvCtrl?>isrHandle, inputPin,pIsr, pArg) != OK)
return (ERROR);
… }
3.4 中斷響應(yīng)處理
龍芯3A處理中斷的流程,從外部中斷請(qǐng)求到內(nèi)核軟件對(duì)中斷的處理,其過(guò)程都是一樣的,如圖6所示。
中斷發(fā)生時(shí),CPU會(huì)設(shè)置Cause寄存器的Excode域及相關(guān)的IP位[10]。進(jìn)而進(jìn)入軟件處理過(guò)程,軟件通過(guò)查詢Excode域來(lái)確定是哪一種類(lèi)型的異常,并選擇使用何種異常處理例程。如果是外部硬件中斷,就會(huì)進(jìn)入相應(yīng)的中斷分發(fā)函數(shù)。中斷分發(fā)函數(shù)再根據(jù)Cause寄存器的IP位來(lái)進(jìn)行一級(jí)中斷分發(fā),然后再根據(jù)中斷號(hào)的位域來(lái)進(jìn)行二次分發(fā),最后執(zhí)行具體的中斷操作處理程序[11]。
4 驅(qū)動(dòng)測(cè)試與優(yōu)化
4.1 驅(qū)動(dòng)測(cè)試
基于龍芯3A的硬件平臺(tái),對(duì)中斷控制驅(qū)動(dòng)進(jìn)行測(cè)試,能夠成功運(yùn)行VxWorks系統(tǒng),如圖7所示。
4.2 驅(qū)動(dòng)優(yōu)化
在驅(qū)動(dòng)開(kāi)發(fā)的設(shè)置中斷控制器環(huán)節(jié),默認(rèn)配置情況下,龍芯3A平臺(tái)的設(shè)備中斷輸入與中斷號(hào)的映射關(guān)系如表1所示。
從表1中可以看出,中斷號(hào)irq6對(duì)應(yīng)的中斷輸入過(guò)于集中,即掛接在中斷輸入INTC上的設(shè)備過(guò)多,這樣會(huì)導(dǎo)致系統(tǒng)中斷響應(yīng)的時(shí)間過(guò)長(zhǎng),從而影響系統(tǒng)的性能。可以在驅(qū)動(dòng)軟件設(shè)置控制器的環(huán)節(jié)對(duì)其進(jìn)行優(yōu)化,將其中的USB設(shè)備包括OHCI和EHCI進(jìn)行分流,將這些設(shè)備映射到其他中斷號(hào)上。修改后的軟件經(jīng)過(guò)測(cè)試,系統(tǒng)的中斷響應(yīng)時(shí)間大大縮短,性能顯著提升,測(cè)試結(jié)果如表2所示。
5 結(jié) 語(yǔ)
本文提出一種VxWorks系統(tǒng)中斷控制驅(qū)動(dòng)分層模型,基于該模型給出了VxWorks下中斷控制驅(qū)動(dòng)軟件的設(shè)計(jì)方法,并通過(guò)該方法實(shí)現(xiàn)了VxWorks下國(guó)產(chǎn)龍芯3A處理器中斷控制驅(qū)動(dòng)軟件的開(kāi)發(fā)。另外,本文還提出了一種優(yōu)化VxWorks下龍芯3A中斷控制性能的方法,通過(guò)該方法可以大大縮短系統(tǒng)中斷響應(yīng)時(shí)間,提高系統(tǒng)的性能。目前,VxWorks下龍芯3A中斷控制驅(qū)動(dòng)軟件已成功應(yīng)用于某通信系統(tǒng)項(xiàng)目中,在應(yīng)用的過(guò)程中,驅(qū)動(dòng)程序工作穩(wěn)定,性能可靠,滿足實(shí)際應(yīng)用的需求。
參考文獻(xiàn)
[1] 陳懷民,王哲,程鵬飛,等.VxWorks下設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)技術(shù)研究[J].現(xiàn)代電子技術(shù),2015,38(10):38?41.
[2] HU Weiwu,ZHANG Fuxin,LI Zusong. Microarchitecture of the Godson?2 processor [J]. Journal of computer science and technology,2005, 20(2): 243?249.
[3] 中科院計(jì)算技術(shù)研究所.龍芯3A處理器數(shù)據(jù)手冊(cè)[M].北京:龍芯中科技術(shù)服務(wù)中心有限公司,2010.
[4] 王迪.基于X86體系結(jié)構(gòu)VxWorksSMP調(diào)度和中斷機(jī)制研究與優(yōu)化[D].長(zhǎng)沙:國(guó)防科技大學(xué),2009.
[5] 李祖松,許先超,胡偉武,等.龍芯2號(hào)處理器的同時(shí)多線程設(shè)計(jì)[J].計(jì)算機(jī)學(xué)報(bào),2009,32(11):2265?2273.
[6] 徐立松,于淼,李佩玥,等.基于VxWorks的VME從板驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2013,36(6):79?82.
[7] 金浩,韓江洪,李陽(yáng)銘.基于ARM的嵌入式系統(tǒng)中斷處理機(jī)制研究[J].現(xiàn)代電子技術(shù),2005,28(22):1?3.
[8] 周啟平,張揚(yáng).VxWorks下設(shè)備驅(qū)動(dòng)程序及BSP開(kāi)發(fā)指南[M].北京:中國(guó)電力出版社,2004.
[9] 付月生,王麗.基于VxBus的驅(qū)動(dòng)程序架構(gòu)分析[J].計(jì)算技術(shù)與自動(dòng)化,2012,31(2):98?102.
[10] Wind River. VxWorks device driver developer′s guide Vlolume2 [M]. US: Wind River, 2008.
[11] Wind River. VxWorks architecture supplement, 6.7 [M]. US: Wind River, 2008.