Chinaunix首页 | 论坛 | 博客
  • 博客访问: 262303
  • 博文数量: 49
  • 博客积分: 1684
  • 博客等级: 上尉
  • 技术积分: 458
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-09 22:45
文章分类

全部博文(49)

文章存档

2023年(1)

2021年(2)

2018年(2)

2017年(7)

2016年(2)

2015年(6)

2014年(13)

2013年(7)

2012年(7)

2011年(1)

2010年(1)

分类: 高性能计算

2014-05-29 01:38:11

C6678的中断控制器

 

分两层,一层是每个core内部的中断控制器,这个叫interrupt controller,简写intc;一层是整个芯片的,属于芯片级的,在每个core的外面,这个叫chip-level interrupt controller,缩写CIC

分两层其实两层功能也不同,这个不用细说,intc可以直接处理一些中断,这些是每个核都同样的,但是还有一些中断,如果有需要不能让所有的核都能看到,则这个时候就需要在所有的核外进行统一管理了,这个就是CIC。在C6678上,CIC可以进行中断映射,这个功能就可以将一些中断映射至希望接管的core上,而让其他核感知不到这个中断。对于C6678CIC可以管控的中断一共最多可以有1024个,管控方式是可以将每个中断通过配置,映射至256channel中的某一个,一个channel上可以同时映射多个中断,映射至同一个channel的中断,相互之间就是逻辑“或”的关系了,即如果其中任何一个中断产生,该channel均会上报中断;system eventschannel映射完了之后,还不能完成中断的上报,还需要把这256channel映射至host interrupthost interrupt的数量最大也是256个。这个host interrupt的编号和CICx_OUTn是一一对应的,但是整个对应关系并不是从CIC0开始按序号一边编到最后的CICx,而是CIC分多个,每个CICOUT都是从OUT0开始编号。实际上CICx_OUTncorepacintc的输入,是定死的,如下图:




比如21行中的CIC0_OUT,对于core0来说,core0intcsystem event 21接的就是CIC0_OUT32 + 0 + 11 * 0),即CIC0_OUT32啦,这个CIC0_OUT32是不可能让其他core来接管的;

同样,对于core1来说,core1 intcsystem event 21接的就是CIC0_OUT32 + 0 + 11 * 1),即CIC0_OUT43,这个CIC0_OUT43同样也只能由core1接管,不可能让其他core来接管CIC0_OUT43。其他类推。

因此对于从CIC的输入,到最后core可以处理的整个流程,有3个环节决定CIC的输入最终由哪个core来处理,这3个环节分别是:

1、  system interruptchannelmap

2、  channelhost interruptmap

3、  host interruptcorepac intc的连接

之所以最后一个叫连接,而不叫map,是因为这个level上确实不存在什么mapmap,而是直接连死的,如上面图下的分析。而前面的两个map中,真正算的上map的只能有1个,就是第一个,system interruptchannelmap,因为这个level是可以配置的,可以随意配置,而第二个map,即channelhost interruptmap实际上是硬件固定的,但是有一个map状态寄存器可以查询。第三个也是硬件固定的,貌似跟第二个差不多,但是不叫map,至于原因,是因为这个level上连像第二级的映射查询都没有。

因此,需要将system interrupt配置至要处理的core能正确感知的话,主要是配置level1,即system interruptchannelmap,而且需要根据level2level3的关系来确定level1的配置,比如有一个CIC上连的中断,如果我们希望这个中断由core0来接管的话,那么先确认core0可以相应那些CICx_OUTn,然后确认这个OUTnhost interrupt编号,此时便可以确认map到该host interrupt的是哪个channel了,再然后,将core0要接管的这个CIC中断map到对应的channel上即可,最后还需要几个使能,包含CIC输入的使能、host interrupt的使能,以及intc对应的event使能。当然,并非所有CIC上的中断都可以由core0来接管,因为可以映射到core0的中断实际仅仅局限于CIC0上的,具体限制如下图所示:

 

阅读(5133) | 评论(9) | 转发(0) |
给主人留下些什么吧!~~

orihard12015-12-18 16:16:16

“基于TMS320C6678、FPGA XC5VSX95T的6U CPCI 8路光纤信号处理卡”这款6678板卡不错,有问题可以到太速科技网站和技术人员探讨咨询!

flyonaie2015-06-16 17:44:06

flyonaie:您好,请教哈!
问题1:
方式1:通过c6678上某一个gpio口(8个核使用共同的GPIO口吗,还是每个核都由GPIO口?)来触发8个核的中断,事件选择是直接选用Core-x上的Primary Events,还是选择CIC-n上的63 Common Events(没查到资料关于Common Events是否有对应的GPIO事件),然后通过Broadcas Events来广播中断?而且c6678中 Interrupt Topology图显示CIC0广播中断只能广播到核0~3,CIC1广播中断只能广播到核4~7,有点纳闷!
方式2:Core0作为主核,接收到相应gpio中断后,发送IPC中断给其他辅核,这种方式测试过,IPC中断延时20us以上,我也不知道这测试结果是否准确,没有参考的!您有吗?
问题2:通过外部FPGA来触发多个C6678中所有的核中断,和触发一个C6678在技术实现上有很大区别吗?
Thanks in advance!

这里张贴不了TMS320C6678的Interrupt Topolopy图,问题在于由CIC0出来的8 Broadcas Events 只能广播到Core0-3,并不能广播到8个核(图中显示的是,但文档又说可以),在一个问题就是片级中断控制器对应的事件感觉没有关于GPIO口的事件(可能是没有找到,您怎么看?)。
1.、方案中要求外部FPGA触发DSP6678的某一个GPIO口来实现8核的中断同步。您又怎么看?
2、IPC中断通信延时不知道您是否知道?
very谢谢!

回复 | 举报

flyonaie2015-06-16 11:48:56

lelee007:你说的那两种方法都是可行的,CIC0和CIC1都有中断广播,可以将中断广播给8个core,然后每个core去读取中断状态,然后对应ID的core去处理

FPGA上设置8个中断源,分别给8个core的中断,这个要确认一下DSP的corepac中断是否有通过pin引出来,这个我记不太清了,如果有引脚引出的话,那就完全没问题

您好,请教哈!
问题1:
方式1:通过c6678上某一个gpio口(8个核使用共同的GPIO口吗,还是每个核都由GPIO口?)来触发8个核的中断,事件选择是直接选用Core-x上的Primary Events,还是选择CIC-n上的63 Common Events(没查到资料关于Common Events是否有对应的GPIO事件),然后通过Broadcas Events来广播中断?而且c6678中 Interrupt Topology图显示CIC0广播中断只能广播到核0~3,CIC1广播中断只能广播到核4~7,有点纳闷!
方式2:Core0作为主核,接收到相应gpio中断后,发送IPC中断给其他辅核,这种方式测试过,IPC中断延时20us以上,我也不知道这测试结果是否准确,没有参考的!您有吗?
问题2:通过外部FPGA来触发多个C6678中所有的核中断,和触发一个C6678在技术实现上有很大区别吗?
Thanks in advance!

回复 | 举报

guzl862014-10-21 10:02:26

lelee007:刚才翻了一下文档,corepac的event 90是非广播中断,每个core对应一个GPIO,按序号对应,就是gpio0产生的中断发到core0,gpio1到core1

以此类推到gpio7

所以可以让FPGA产生8个中断源,分别给gpio0、1、2.。。。。7,每个中断会单独触发一个core,其他core都不可见

谢谢,我再考虑一下,如果有什么不明白的还是要来麻烦大牛。谢谢

回复 | 举报

lelee0072014-10-20 17:42:38

guzl86:我们不想某个core的负担过重,能不能将这个fpga发过来的中断分给8个core,每个核的中断处理里面去读取coreID寄存器,如果是自己的就进行处理,如果不是就里面退出中断?这个方法是否可行?
另外就是在FPGA上弄8个中断控制器,分别对应8个中断,然后我在系统中将8个中断分配给不同的core?

刚才翻了一下文档,corepac的event 90是非广播中断,每个core对应一个GPIO,按序号对应,就是gpio0产生的中断发到core0,gpio1到core1

以此类推到gpio7

所以可以让FPGA产生8个中断源,分别给gpio0、1、2.。。。。7,每个中断会单独触发一个core,其他core都不可见

回复 | 举报