APP下载

KeyStone架构的多核DSP中断路由机制及其实现方法

2017-02-09沙海珍魏利卓

单片机与嵌入式系统应用 2017年1期
关键词:外设寄存器中断

沙海珍,魏利卓

(1.重庆邮电大学 通信与信息工程学院,重庆 400065;2.中国电子信息产业集团有限公司第六研究所)



沙海珍1,魏利卓2

(1.重庆邮电大学 通信与信息工程学院,重庆 400065;2.中国电子信息产业集团有限公司第六研究所)

在KeyStone多核DSP应用系统中,中断的使用是不可或缺的一部分,处理中断的能力也是衡量一个芯片性能的重要因素之一。本文以TI公司推出的高性能TMS320C6670四核DSP为基础,讲述了基于KeyStone架构的多核DSP的中断路由机制,并以TMS320C6670集成的SRIO高速接口的LSU中断和DOORBELL中断为例,通过调用TMS320C6670的SYS/BIOS提供的CSL库函数,分别给出了两者的实现方法。

DSP;中断;TMS320C6670;SRIO

引 言

TI公司推出的TMS320C6670(以下简称C6670)四核DSP采用先进的KeyStone多内核架构,集成了HyperLink、PCIe、SRIO以及其他外设,可实现内核与存储器存取的直接通信,能够充分发挥多内核性能。它在电源方面采用TI Green Power技术,使其具有很好的电源效率。此外,C6670在计算方面采用定点+浮点架构,支持将浮点算法方便地移植到多核平台上[1]。基于以上这些优点,C6670在数字控制领域已经有着非常广泛的应用,成为电子工业领域不可替代的高性能产品。

中断处理是一个芯片必须具备的能力,尤其在DSP系统中是必不可少的重要环节,它对输入输出处理、多道程序和分时操作、实时处理和人机交互等方面都起着重要的作用。中断由外设请求和CPU响应两个过程组成。首先,某一外设向CPU发出请求信号,请求CPU暂停当前程序而去处理中断服务子程序ISR。其次,当CPU接收到这个请求信号后,便对当前执行的主程序进行现场标记并暂停其运行,自动转移到请求设备的中断服务子程序中去。当中断服务程序结束后,CPU就回到之前标记的主程序之处继续执行。

1 KeyStone多核DSP的中断系统架构

C6670的中断控制系统由两部分组成:芯片中断处理控制器(Chip Interrupt Controller,CIC)和核中断控制器(Interrupt Controller,INTC),架构图略——编者注。外部设备产生的中断由CIC和INTC共同作用,以实现CPU响应中断的目的。其中,CIC位于内核外部,主要负责将外部中断映射到CorePac、EDMA和HyperLink内部的主机中断信号。CorePac中断控制器则位于核内部,负责将主机中断信号转为CPU可处理的12个可屏蔽中断信号。

1.1 CorePac中断路由

在C6670中,EDMA3控制器以及4个CorePac都可以直接接收中断,但是无论是CorePac还是EDMA3控制器,其能直接接收的中断输入是有限的。KeyStone CorePac能够直接接收的中断输入为1个可屏蔽的硬件Exception、12个可屏蔽的硬件Interrupt(INT4~INT15)、1个不可屏蔽的NMI信号以及1个复位信号[2]。Exception其实也为Interrupt,区别在于Exception常常伴随的是错误信息的发生。其中Exception、NMI、Reset信号都是芯片保留的中断输入,用户能够自行配置的中断输入实际为12个(INT4~INT15),在这12个可屏蔽中断输入中,INT4的优先级最高,INT15的优先级最低。

然而,作为一个复杂的DSP芯片,如果其能处理的中断源仅为15个,是远远无法满足复杂程序需求的。所以为了能够处理更多的中断源,KeyStone结构的DSP CorePac内部集成了一个中断控制器INTC,其作用是将更多的中断源(对于KeyStone架构DSP来说,是128个System Event)路由到这12个可屏蔽中断输入中去。

CorePac中集成了Interrupt Selector,使得编程人员可以将这128个System Event中的任何一个路由到INT4~INT15中的任何一个,从而完成事件响应。例如,C6670的第85号System Event为GPINT11事件,如果把第85号事件路由到CorePac的第7个可屏蔽中断输入(INT7),那么当DSP的第11个GPIO引脚的事件发生以后,且当前没有更高优先级的中断发生(比INT7更高优先级的中断),则DSP的CorePac会跳转到中断向量表,进一步去执行中断处理函数。

CorePac的INTC中还集成了一个Event Combiner控制器,起到事件合成的作用。这128个System Event中的第4~127个System Event都是来自芯片内部或者外部的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,是“或”的关系。即如果使用了Event Combiner将第7、13、35号System Event合成为Event #0,那么只要7、13、35中的任何一个事件发生,就等效为Event #0事件发生。

整个CorePac中,128个System Event到12个可屏蔽中断(INT4~INT15)的结构框图见图2。

图2 INTC内部中断路由结构图

1.2 CIC中断路由

KeyStone DSP核心CorePac能够处理128个System Event(其中实际有直接物理意义的为124个,Event 0~3为合成的结果,共计128个),绝大部分是芯片内部DMA、QMSS等模块产生的事件,这128个事件仍然无法满足程序的需求。因为DSP芯片诸多外设产生的事件同样需要得到及时地处理,比如SRIO、PCIE等外设,而每个外设产生的事件往往不止一个,比如SRIO事件也分为包发送成功事件、包发送失败事件、Doorbell接收事件等。所以,如果希望在这些大量的外设事件发生后,CorePac能够去执行相应的中断处理函数,那么这些事件也是需要路由到CorePac的12个可屏蔽中断输入(INT4~INT15)中去的。但是,这些外设事件是不能够像128个System Event那样直接路由到INT4~INT15中去的[3]。而CIC在外设事件到CorePac之间的路由起到了桥梁的作用。需要注意的是,CIC/Cpintc不是CorePac的INTC,其是在CorePac外部的,CorePac的INTC是在CorePac内部的。

由图1可知,C6670内部有3个CIC,即CIC0~CIC2。其中CIC0负责外设事件到CorePac的路由,CIC1~CIC2负责外设事件到EDMA3或者HyperLink控制器之间的路由。这里只讨论CIC0的功能,而CIC1~CIC2的路由机制一致,与CIC0的区别仅仅为目的地不同。

CIC0的输入称为System Interrupt,输出为CIC0_OUTx(称为Host Interrupt)。CIC0能够接收的System Interrupt有208个,CIC0的目的即为把这208个System Interrupt路由到其CIC0_OUTx去。如果若干个System Interrupt通过CIC0路由到了某一个Host Interrupt,那么这若干个System Interrupt为“或”的关系。而Host Interrupt与CorePac的 INTC的System Event是一一对应的。例如,Host Interrupt中的CIC0_OUT0对应的是System Event 56,或者CIC0_OUT(64+0+10×n)对应的是System Event22,其中n为核号。

2 KeyStone DSP中断路由路径

总的来说,KeyStone DSP中断路由路径有两种,如图3所示。第一,System Event经过Event Combiner后,再通过Interrupt Selector路由到INTCx,或者System Event不经过Event Combiner,直接通过Interrupt Selector路由到INTCx。第二,System Interrupt经过CIC0路由到某个Host Interrupt,而Host Interrupt是对应到System Event的,之后再将该System Event经过Event Combiner、Inter-

rupt Selector路由到INTCx,或者直接将该System Event经过Interrupt Selector路由到INTCx。

Primary Interrput直接对应于某个System Event。例如GPINT4对应System Event #78,输入CorePac INT。用户可以选择是否经过Event Combiner,如果经过Event Combiner,则合成为Event2,再经过Interrupt Selector路由到INTCx;如果不经过Event Combiner,则直接将System Event #78经过Interrupt selector路由到INTCx。

Secondary Interrupt也称为System Interrupt,先经过CIC0路由到CIC0的某个输出(Host Interrupt),比如可以将CIC0的第122号输入INTDST10,经过CIC0路由到CIC0_OUT7。而每个Host Interrupt是直接对应某个System Event的,例如CIC0_OUT7对应的是System Event #63。如果经过Event Combiner,则合成为Event1,再经过Interrupt Selector路由到INTCx;如果不经过Event Combiner,则直接将System Event #63路由到INTCx。

图3 System Interrupt到INTCx的路由路径

3 KeyStone DSP的SRIO中断

SRIO模块能够输出若干种不同的中断,这些中断属于System Interrupt。如果当SRIO中断到来后,想让DSP及时地去处理相应的中断函数,则需要将该中断经过某个路径路由到INTCx中去。

SRIO的主要中断有两种:一种为包发送中断,该中断可以通知DSP,SRIO模块已经发送了一个协议包;另一种为Doorbell中断,为SRIO模块接收远程器件发送来的Doorbell包,并做相应的处理。其中, SRIO模块中的LSU寄存器负责的是DIO协议包的发送,则DIO协议包的发送中断可以称为LSU中断[4]。无论是LSU中断还是Doorbell中断,都是SRIO内部的Peripheral Interrupt,需要路由到System Interrupt。System Interrupt是从SRIO外设输出到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中断路径的实现

SRIO模块内部会产生40个LSU中断,其中有32个中断由寄存器LSU0_ICSR控制,另外8个由寄存器LSU1_ICSR控制。这里以寄存器LSU0_ICSR的最低位ICS0代表的SRCID0 Transaction Complete without errors中断信号为例,说明LSU中断路由的实现,路由路径如图4所示。首先将LSU产生的“SRCID0 Transaction Complete without errors”路由到INTDST1,然后将INTDST1对应的中断处理函数myDioTxCompletionIsr插入到CpIntc_dispatch表中,接着在CIC0内部,将INTDST1路由到Host Interrupt #8,获取Host Interrupt #8对应的System Event ID,此处为74,将System Event #74经过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”发生时,CPU能够响应。首先去处理EventCombiner_dispatch表,而CpIntc_dispatch表已经插入了Event Combiner_dispacth表,则接着去处理CpIntc_dispatch表。而中断处理函数myDioTxCompletionIsr插入到了CpIntc_dispatch表,则myDioTxCompletionIsr就会被执行。

3.2 SRIO Doorbell中断路径的实现

根据RapidIO协议可知,Doorbell包中携带16位的Doorbell Info。对于协议本身来说,这16位数据是没有含义的,而对于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中断,对应的是Doorbell[2]_ICSR.ICS10标志位被置1。也就是说,如果Doorbell[n]_ICSR.ICSx位被硬件置1,则表明接收到的Doorbell Info[3:0]=x,doorbell Info[6:5]=n。KeyStone SRIO模块能够产生的Peripheral Interrupt共4×16=64种,每种对应一个特定的Doorbell Info值。

如前所述,Peripheral Interrupt是需要路由到System Interrupt(INTDST0~INTDST23)上去的。而寄存器Doorbelln_ICRR和Doorbelln_ICRR2定义了Reg=n且Bit=x的Doorbell Info Peripheral Interrupt被路由到INTDSTy上去。

一旦能够将某个特定的Doorbell Info路由到某个INTDSTy上之后,剩下的步骤就是将INTDSTy再经过某个路径路由到INTCz上去,就能实现当DSP接收到该Doorbell Info时,中断能够被处理。

KeyStone SRIO模块的Doorbell中断的路由路径有4种,分别为经过CIC0和Event Combiner、经过CIC0但不经过Event Combiner、不经过CIC0但经过Event Combiner、不经过CIC0和Event Combiner。

下面说明Doorbell不经过CIC0和Event Combiner实现中断的路由路径,如图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对应的System Event #20直接路由到INTC7上,关键代码如下:

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架构的多核DSP的中断系统的组成、中断的路由机制及其不同的实现方法,并简要介绍了其高速串行接口SRIO的两种中断:LSU中断和Doorbll中断的路由路径。本文软件程序设计没有采用直接对寄存器进行操作,而是借助SYS/BIOS平台中硬件中断Hwi的创建来进行中断的实现,通过调用CSL的库函数,省去了直接对寄存器操作的繁杂过程,在很大程度上提高了编码的效率及正确性。

[1] 牛金海.TMS320C66x KeyStone架构多核DSP入门与实例精解[M].上海:上海交通大学出版社,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应用技术研究[D].北京:中国科学院大学,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.

沙海珍(硕士研究生),主要研究方向为宽带无线移动互联网络;魏利卓(硕士研究生),主要研究方向为嵌入式软件开发。

图8 文件上传结果

结 语

参考文献

[1] 汪小燕,连晓平,董燕,等.基于TFTP协议的嵌入式系统开发方法设计与实现[J].华中科技大学学报:自然科学版,2006,34(12):56-58.

[2] 熊传玉,徐尤华.Android系统下基于JSON的天气预报应用的实现[J].微型电脑应用,2016,32(1):8-10.

[3] 谢永悠.简单文件传送协议(TFTP)的C语言实现[J].电子元器件应用,2010,12(3):55-58.

[4] 沈炜,王晓聪.基于Qt的嵌入式图形界面的研究和应用[J].工业控制计算机,2016,29(1):101-104.

柯玉山(硕士研究生),主要研究方向嵌入式系统应用、无线传感器网络;陈阿辉(硕士研究生),主要研究方向为雷达测距系统;邱菁(硕士研究生),主要研究方向为雷达测距算法。

(责任编辑:薛士然 收稿日期: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)

猜你喜欢

外设寄存器中断
STM32和51单片机寄存器映射原理异同分析
Lite寄存器模型的设计与实现
跟踪导练(二)(5)
千里移防,卫勤保障不中断
Microchip推出具备双ADC外设的全新器件,扩展其低成本8位PIC®单片机产品线
AT89C51与中断有关的寄存器功能表解
FPGA内嵌PowerPC的中断响应分析
高速数模转换器AD9779/AD9788的应用
一种可重构线性反馈移位寄存器设计
外设天地行情