沙海珍,魏利卓
(1.重慶郵電大學(xué) 通信與信息工程學(xué)院,重慶 400065;2.中國電子信息產(chǎn)業(yè)集團有限公司第六研究所)
?
沙海珍1,魏利卓2
(1.重慶郵電大學(xué) 通信與信息工程學(xué)院,重慶 400065;2.中國電子信息產(chǎn)業(yè)集團有限公司第六研究所)
在KeyStone多核DSP應(yīng)用系統(tǒng)中,中斷的使用是不可或缺的一部分,處理中斷的能力也是衡量一個芯片性能的重要因素之一。本文以TI公司推出的高性能TMS320C6670四核DSP為基礎(chǔ),講述了基于KeyStone架構(gòu)的多核DSP的中斷路由機制,并以TMS320C6670集成的SRIO高速接口的LSU中斷和DOORBELL中斷為例,通過調(diào)用TMS320C6670的SYS/BIOS提供的CSL庫函數(shù),分別給出了兩者的實現(xiàn)方法。
DSP;中斷;TMS320C6670;SRIO
TI公司推出的TMS320C6670(以下簡稱C6670)四核DSP采用先進的KeyStone多內(nèi)核架構(gòu),集成了HyperLink、PCIe、SRIO以及其他外設(shè),可實現(xiàn)內(nèi)核與存儲器存取的直接通信,能夠充分發(fā)揮多內(nèi)核性能。它在電源方面采用TI Green Power技術(shù),使其具有很好的電源效率。此外,C6670在計算方面采用定點+浮點架構(gòu),支持將浮點算法方便地移植到多核平臺上[1]?;谝陨线@些優(yōu)點,C6670在數(shù)字控制領(lǐng)域已經(jīng)有著非常廣泛的應(yīng)用,成為電子工業(yè)領(lǐng)域不可替代的高性能產(chǎn)品。
中斷處理是一個芯片必須具備的能力,尤其在DSP系統(tǒng)中是必不可少的重要環(huán)節(jié),它對輸入輸出處理、多道程序和分時操作、實時處理和人機交互等方面都起著重要的作用。中斷由外設(shè)請求和CPU響應(yīng)兩個過程組成。首先,某一外設(shè)向CPU發(fā)出請求信號,請求CPU暫停當前程序而去處理中斷服務(wù)子程序ISR。其次,當CPU接收到這個請求信號后,便對當前執(zhí)行的主程序進行現(xiàn)場標記并暫停其運行,自動轉(zhuǎn)移到請求設(shè)備的中斷服務(wù)子程序中去。當中斷服務(wù)程序結(jié)束后,CPU就回到之前標記的主程序之處繼續(xù)執(zhí)行。
C6670的中斷控制系統(tǒng)由兩部分組成:芯片中斷處理控制器(Chip Interrupt Controller,CIC)和核中斷控制器(Interrupt Controller,INTC),架構(gòu)圖略——編者注。外部設(shè)備產(chǎn)生的中斷由CIC和INTC共同作用,以實現(xiàn)CPU響應(yīng)中斷的目的。其中,CIC位于內(nèi)核外部,主要負責將外部中斷映射到CorePac、EDMA和HyperLink內(nèi)部的主機中斷信號。CorePac中斷控制器則位于核內(nèi)部,負責將主機中斷信號轉(zhuǎn)為CPU可處理的12個可屏蔽中斷信號。
1.1 CorePac中斷路由
在C6670中,EDMA3控制器以及4個CorePac都可以直接接收中斷,但是無論是CorePac還是EDMA3控制器,其能直接接收的中斷輸入是有限的。KeyStone CorePac能夠直接接收的中斷輸入為1個可屏蔽的硬件Exception、12個可屏蔽的硬件Interrupt(INT4~INT15)、1個不可屏蔽的NMI信號以及1個復(fù)位信號[2]。Exception其實也為Interrupt,區(qū)別在于Exception常常伴隨的是錯誤信息的發(fā)生。其中Exception、NMI、Reset信號都是芯片保留的中斷輸入,用戶能夠自行配置的中斷輸入實際為12個(INT4~INT15),在這12個可屏蔽中斷輸入中,INT4的優(yōu)先級最高,INT15的優(yōu)先級最低。
然而,作為一個復(fù)雜的DSP芯片,如果其能處理的中斷源僅為15個,是遠遠無法滿足復(fù)雜程序需求的。所以為了能夠處理更多的中斷源,KeyStone結(jié)構(gòu)的DSP CorePac內(nèi)部集成了一個中斷控制器INTC,其作用是將更多的中斷源(對于KeyStone架構(gòu)DSP來說,是128個System Event)路由到這12個可屏蔽中斷輸入中去。
CorePac中集成了Interrupt Selector,使得編程人員可以將這128個System Event中的任何一個路由到INT4~INT15中的任何一個,從而完成事件響應(yīng)。例如,C6670的第85號System Event為GPINT11事件,如果把第85號事件路由到CorePac的第7個可屏蔽中斷輸入(INT7),那么當DSP的第11個GPIO引腳的事件發(fā)生以后,且當前沒有更高優(yōu)先級的中斷發(fā)生(比INT7更高優(yōu)先級的中斷),則DSP的CorePac會跳轉(zhuǎn)到中斷向量表,進一步去執(zhí)行中斷處理函數(shù)。
CorePac的INTC中還集成了一個Event Combiner控制器,起到事件合成的作用。這128個System Event中的第4~127個System Event都是來自芯片內(nèi)部或者外部的Event,都是有實際物理意義的,而使用Event Combiner則可以將第4~31號System Event中的若干個合成為Event #0,或者將第32~63號System Event中的若干個合成為Event #1,或者將第64~95號System Event中的若干個合成為Event #2,或者將第96~127號System Event中的若干個合成為Event #3。如圖1所示,則等效的System Event有128個。
圖1 Event Combiner目的圖
對于合成的System Event,是“或”的關(guān)系。即如果使用了Event Combiner將第7、13、35號System Event合成為Event #0,那么只要7、13、35中的任何一個事件發(fā)生,就等效為Event #0事件發(fā)生。
整個CorePac中,128個System Event到12個可屏蔽中斷(INT4~INT15)的結(jié)構(gòu)框圖見圖2。
圖2 INTC內(nèi)部中斷路由結(jié)構(gòu)圖
1.2 CIC中斷路由
KeyStone DSP核心CorePac能夠處理128個System Event(其中實際有直接物理意義的為124個,Event 0~3為合成的結(jié)果,共計128個),絕大部分是芯片內(nèi)部DMA、QMSS等模塊產(chǎn)生的事件,這128個事件仍然無法滿足程序的需求。因為DSP芯片諸多外設(shè)產(chǎn)生的事件同樣需要得到及時地處理,比如SRIO、PCIE等外設(shè),而每個外設(shè)產(chǎn)生的事件往往不止一個,比如SRIO事件也分為包發(fā)送成功事件、包發(fā)送失敗事件、Doorbell接收事件等。所以,如果希望在這些大量的外設(shè)事件發(fā)生后,CorePac能夠去執(zhí)行相應(yīng)的中斷處理函數(shù),那么這些事件也是需要路由到CorePac的12個可屏蔽中斷輸入(INT4~INT15)中去的。但是,這些外設(shè)事件是不能夠像128個System Event那樣直接路由到INT4~INT15中去的[3]。而CIC在外設(shè)事件到CorePac之間的路由起到了橋梁的作用。需要注意的是,CIC/Cpintc不是CorePac的INTC,其是在CorePac外部的,CorePac的INTC是在CorePac內(nèi)部的。
由圖1可知,C6670內(nèi)部有3個CIC,即CIC0~CIC2。其中CIC0負責外設(shè)事件到CorePac的路由,CIC1~CIC2負責外設(shè)事件到EDMA3或者HyperLink控制器之間的路由。這里只討論CIC0的功能,而CIC1~CIC2的路由機制一致,與CIC0的區(qū)別僅僅為目的地不同。
CIC0的輸入稱為System Interrupt,輸出為CIC0_OUTx(稱為Host Interrupt)。CIC0能夠接收的System Interrupt有208個,CIC0的目的即為把這208個System Interrupt路由到其CIC0_OUTx去。如果若干個System Interrupt通過CIC0路由到了某一個Host Interrupt,那么這若干個System Interrupt為“或”的關(guān)系。而Host Interrupt與CorePac的 INTC的System Event是一一對應(yīng)的。例如,Host Interrupt中的CIC0_OUT0對應(yīng)的是System Event 56,或者CIC0_OUT(64+0+10×n)對應(yīng)的是System Event22,其中n為核號。
總的來說,KeyStone DSP中斷路由路徑有兩種,如圖3所示。第一,System Event經(jīng)過Event Combiner后,再通過Interrupt Selector路由到INTCx,或者System Event不經(jīng)過Event Combiner,直接通過Interrupt Selector路由到INTCx。第二,System Interrupt經(jīng)過CIC0路由到某個Host Interrupt,而Host Interrupt是對應(yīng)到System Event的,之后再將該System Event經(jīng)過Event Combiner、Inter-
rupt Selector路由到INTCx,或者直接將該System Event經(jīng)過Interrupt Selector路由到INTCx。
Primary Interrput直接對應(yīng)于某個System Event。例如GPINT4對應(yīng)System Event #78,輸入CorePac INT。用戶可以選擇是否經(jīng)過Event Combiner,如果經(jīng)過Event Combiner,則合成為Event2,再經(jīng)過Interrupt Selector路由到INTCx;如果不經(jīng)過Event Combiner,則直接將System Event #78經(jīng)過Interrupt selector路由到INTCx。
Secondary Interrupt也稱為System Interrupt,先經(jīng)過CIC0路由到CIC0的某個輸出(Host Interrupt),比如可以將CIC0的第122號輸入INTDST10,經(jīng)過CIC0路由到CIC0_OUT7。而每個Host Interrupt是直接對應(yīng)某個System Event的,例如CIC0_OUT7對應(yīng)的是System Event #63。如果經(jīng)過Event Combiner,則合成為Event1,再經(jīng)過Interrupt Selector路由到INTCx;如果不經(jīng)過Event Combiner,則直接將System Event #63路由到INTCx。
圖3 System Interrupt到INTCx的路由路徑
SRIO模塊能夠輸出若干種不同的中斷,這些中斷屬于System Interrupt。如果當SRIO中斷到來后,想讓DSP及時地去處理相應(yīng)的中斷函數(shù),則需要將該中斷經(jīng)過某個路徑路由到INTCx中去。
SRIO的主要中斷有兩種:一種為包發(fā)送中斷,該中斷可以通知DSP,SRIO模塊已經(jīng)發(fā)送了一個協(xié)議包;另一種為Doorbell中斷,為SRIO模塊接收遠程器件發(fā)送來的Doorbell包,并做相應(yīng)的處理。其中, SRIO模塊中的LSU寄存器負責的是DIO協(xié)議包的發(fā)送,則DIO協(xié)議包的發(fā)送中斷可以稱為LSU中斷[4]。無論是LSU中斷還是Doorbell中斷,都是SRIO內(nèi)部的Peripheral Interrupt,需要路由到System Interrupt。System Interrupt是從SRIO外設(shè)輸出到CIC0輸入端口的信號。
KeyStone DSP的SRIO模塊共有24個System Interrupt,稱為INTDST0~23。其中INTDST0~15為通用System Interrupt,可以連接LSU或者Doorbell Peripheral Interrupt,再輸入到CIC0;而INTDST16~INTDST23只連接Doorbell Peripheral Interrupt,且為System Event,是直接輸入到CorePac的。
3.1 SRIO LSU中斷路徑的實現(xiàn)
SRIO模塊內(nèi)部會產(chǎn)生40個LSU中斷,其中有32個中斷由寄存器LSU0_ICSR控制,另外8個由寄存器LSU1_ICSR控制。這里以寄存器LSU0_ICSR的最低位ICS0代表的SRCID0 Transaction Complete without errors中斷信號為例,說明LSU中斷路由的實現(xiàn),路由路徑如圖4所示。首先將LSU產(chǎn)生的“SRCID0 Transaction Complete without errors”路由到INTDST1,然后將INTDST1對應(yīng)的中斷處理函數(shù)myDioTxCompletionIsr插入到CpIntc_dispatch表中,接著在CIC0內(nèi)部,將INTDST1路由到Host Interrupt #8,獲取Host Interrupt #8對應(yīng)的System Event ID,此處為74,將System Event #74經(jīng)過Event Combiner送入Interrupt Selector,并將CpIntc_dispatch
插入到EventCombiner_dispatch中去。在程序的SYS/BIOS cfg文件loopbackDioIsr.cfg中,定義了以下代碼:
ECM.eventGroupHwiNum[0] = 7;
ECM.eventGroupHwiNum[1] = 8;
ECM.eventGroupHwiNum[2] = 9;
ECM.eventGroupHwiNum[3] = 10;
即可將System Event #2路由到INTC9。
圖4 LSU中斷路由路徑
如此,則當“SRCID0 Transaction Complete without errors”發(fā)生時,CPU能夠響應(yīng)。首先去處理EventCombiner_dispatch表,而CpIntc_dispatch表已經(jīng)插入了Event Combiner_dispacth表,則接著去處理CpIntc_dispatch表。而中斷處理函數(shù)myDioTxCompletionIsr插入到了CpIntc_dispatch表,則myDioTxCompletionIsr就會被執(zhí)行。
3.2 SRIO Doorbell中斷路徑的實現(xiàn)
根據(jù)RapidIO協(xié)議可知,Doorbell包中攜帶16位的Doorbell Info。對于協(xié)議本身來說,這16位數(shù)據(jù)是沒有含義的,而對于KeyStone DSP來說,這16位的Doorbell Info即為Doorbell中斷源。
KeyStone DSP定義了Doorbell Info的第0~3位代表位信息,第5~6位代表Reg信息,其他位為保留位,無含義。例如,如果KeyStone DSP接收到的Doorbell中Info Field為0b 0000 0000 0100 1010,即表示Reg=2且Bit=10中斷,對應(yīng)的是Doorbell[2]_ICSR.ICS10標志位被置1。也就是說,如果Doorbell[n]_ICSR.ICSx位被硬件置1,則表明接收到的Doorbell Info[3:0]=x,doorbell Info[6:5]=n。KeyStone SRIO模塊能夠產(chǎn)生的Peripheral Interrupt共4×16=64種,每種對應(yīng)一個特定的Doorbell Info值。
如前所述,Peripheral Interrupt是需要路由到System Interrupt(INTDST0~INTDST23)上去的。而寄存器Doorbelln_ICRR和Doorbelln_ICRR2定義了Reg=n且Bit=x的Doorbell Info Peripheral Interrupt被路由到INTDSTy上去。
一旦能夠?qū)⒛硞€特定的Doorbell Info路由到某個INTDSTy上之后,剩下的步驟就是將INTDSTy再經(jīng)過某個路徑路由到INTCz上去,就能實現(xiàn)當DSP接收到該Doorbell Info時,中斷能夠被處理。
KeyStone SRIO模塊的Doorbell中斷的路由路徑有4種,分別為經(jīng)過CIC0和Event Combiner、經(jīng)過CIC0但不經(jīng)過Event Combiner、不經(jīng)過CIC0但經(jīng)過Event Combiner、不經(jīng)過CIC0和Event Combiner。
下面說明Doorbell不經(jīng)過CIC0和Event Combiner實現(xiàn)中斷的路由路徑,如圖5所示。
首先,將Reg=0且Bit=任意的Doorbell Info中斷路由到INTDST16。部分代碼如下:
CSL_SRIO_SetDoorbellRoute(hSrio, 0);
for (i = 0; i < 16; i++){
CSL_SRIO_RouteDoorbellInterrupts(hSrio, 0, i, 0);
CSL_SRIO_RouteDoorbellInterrupts(hSrio, 1, i, 1);
CSL_SRIO_RouteDoorbellInterrupts(hSrio, 2, i, 2);
CSL_SRIO_RouteDoorbellInterrupts(hSrio, 3, i, 3);
}
然后,直接將INTDST16對應(yīng)的System Event #20直接路由到INTC7上,關(guān)鍵代碼如下:
Hwi_Params hwiParams;
Hwi_Handle myHwi;
Error_Block eb;
Hwi_Params_init(&hwiParams);
Error_init(&eb);
hwiParams.arg = (UArg)hDrvManagedSrioDrv;
hwiParams.eventId = 20;
myHwi = Hwi_create(7, (CpIntc_FuncPtr)myDoorbellCompletionIsr, &hwiParams, &eb);
本文以四核DSP TMS320C6670為例,詳細地介紹了基于KeyStone架構(gòu)的多核DSP的中斷系統(tǒng)的組成、中斷的路由機制及其不同的實現(xiàn)方法,并簡要介紹了其高速串行接口SRIO的兩種中斷:LSU中斷和Doorbll中斷的路由路徑。本文軟件程序設(shè)計沒有采用直接對寄存器進行操作,而是借助SYS/BIOS平臺中硬件中斷Hwi的創(chuàng)建來進行中斷的實現(xiàn),通過調(diào)用CSL的庫函數(shù),省去了直接對寄存器操作的繁雜過程,在很大程度上提高了編碼的效率及正確性。
[1] 牛金海.TMS320C66x KeyStone架構(gòu)多核DSP入門與實例精解[M].上海:上海交通大學(xué)出版社,2014:58-62.
[2] Texas Instruments.TMS320C66x CorePac User's Guide,2013.
[3] Texas Instrument.Keystone Architecture Chip Interrupt Controller(CIC) User's Guide,2012.
[4] 吳文德.基于TI6678平臺的SYS/BIOS應(yīng)用技術(shù)研究[D].北京:中國科學(xué)院大學(xué),2015.
[5] Texas Instrument.Multicore Programming Guide Multicore Programming and Applications/DSP Systems,2012.
[6] Texas Instruments.TMS320C66x DSP CPU and Instruction Set Reference Guide,2010.
沙海珍(碩士研究生),主要研究方向為寬帶無線移動互聯(lián)網(wǎng)絡(luò);魏利卓(碩士研究生),主要研究方向為嵌入式軟件開發(fā)。
圖8 文件上傳結(jié)果
參考文獻
[1] 汪小燕,連曉平,董燕,等.基于TFTP協(xié)議的嵌入式系統(tǒng)開發(fā)方法設(shè)計與實現(xiàn)[J].華中科技大學(xué)學(xué)報:自然科學(xué)版,2006,34(12):56-58.
[2] 熊傳玉,徐尤華.Android系統(tǒng)下基于JSON的天氣預(yù)報應(yīng)用的實現(xiàn)[J].微型電腦應(yīng)用,2016,32(1):8-10.
[3] 謝永悠.簡單文件傳送協(xié)議(TFTP)的C語言實現(xiàn)[J].電子元器件應(yīng)用,2010,12(3):55-58.
[4] 沈煒,王曉聰.基于Qt的嵌入式圖形界面的研究和應(yīng)用[J].工業(yè)控制計算機,2016,29(1):101-104.
柯玉山(碩士研究生),主要研究方向嵌入式系統(tǒng)應(yīng)用、無線傳感器網(wǎng)絡(luò);陳阿輝(碩士研究生),主要研究方向為雷達測距系統(tǒng);邱菁(碩士研究生),主要研究方向為雷達測距算法。
(責任編輯:薛士然 收稿日期:2016-08-05)
Sha Haizhen1,Wei Lizhuo2
(1.Communication and Information Engineering,Chongqing University of Posts and Telecommunications,Chongqing 400065,China;2.China Institute of Electronic Information Industry Group Co.,Ltd.6)
In the system of KeyStone multi-core DSP’s application,the use of interrupts is an indispensable section,and the ability to handle the interrupt is an important factor of measuring the performance of a chip.In the paper,based on the TMS320C6670 with four cores, the routing path of interrupts on KeyStone multi-core DSP is introduced in detail.Taking the high-speed interface SRIO’s LSU interrupt and DOORBELL interrupt as the example,the realization methods are given respectively through calling CSL library functions provided by SYS/BIOS of TMS320C6670.
DSP;interrupt;TMS320C6670;SRIO
TP601
A
?士然
2016-08-09)