添加至 C6678 INTC问题 wiki 页面

This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6678 INTC问题

Other Parts Discussed in Thread: TMS320C6678

您好:

几个问题:

1.文档中说"The event controllers consist of simple combination logic to provide additional events to each C66x CorePac, plus the TPCC, INTC0, and INTC1 provide 17 additional events as well as 8 broadcast events to each of the C66x CorePacs." 这里说,INTC0和INTC1可以产生8个广播事件同时给C6678的8个核,但是文档中TMS320C6678 Interrupt Topology( c6678的中断图)画的图显示INTC0的广播事件只给了前4个核,INTC1的广播事件给后4个核, 我想知道,INTC产生的广播事件到底是一次给8个核的还是一次只能给4个核?

2.假如INTC0的1号事件产生了,我该如何操作INTC的寄存器,将该事件映射到CPU4号中断上?希望给出例子.

谢谢!

  • si cheng 您好

    请参考附件中的代码

    Int.zip
  • Thomas Yang ,您好:

    看了您提供的代码后,有几个疑问:

    1.某个系统事件如果想通过INTC0产生一个核事件的话,我们只需知INTC0中该事件的事件号,然后设置ENABLE_SET_INDEX_REG,使能该事件对应的位即可?

    2.系统事件使能后,事件和INTC的4个通道应该有一个映射关系,这种映射关系文档中说的是可以随便映射到其中任意一个通道上,但是在CSL库中,发现CSL_CPINTC_mapSystemIntrToChannel ()函数的定义是一种有一定规律的映射.

    3.CH_MAP_REGx这个寄存器有256个,这256个寄存器是如何实现事件和通道的映射的?

    4.TMS320C6678 System Event Mapping 表中,INTC0_OUT(32+0+11*n), INTC1_OUT(32+0+11*(n-4), INTC0_OUT(2+8*n) ...等,这些表达式中,n表示什么意思,括号中的表达式 (32+0+11*n).(32+0+11*(n-4))都表示什么意思?文档中的注释没看明白!

    谢谢!

  • 1.某个系统事件如果想通过INTC0产生一个核事件的话,我们只需知INTC0中该事件的事件号,然后设置ENABLE_SET_INDEX_REG,使能该事件对应的位即可?

    2.系统事件使能后,事件和INTC的4个通道应该有一个映射关系,这种映射关系文档中说的是可以随便映射到其中任意一个通道上,但是在CSL库中,发现CSL_CPINTC_mapSystemIntrToChannel ()函数的定义是一种有一定规律的映射.

    3.CH_MAP_REGx这个寄存器有256个,这256个寄存器是如何实现事件和通道的映射的?

    sicheng

    您好,您这3个问题,请仔细阅读Interrupt userguide 和 datasheet中interrupt相关的部分。

    4.TMS320C6678 System Event Mapping 表中,INTC0_OUT(32+0+11*n), INTC1_OUT(32+0+11*(n-4), INTC0_OUT(2+8*n) ...等,这些表达式中,n表示什么意思,括号中的表达式 (32+0+11*n).(32+0+11*(n-4))都表示什么意思?文档中的注释没看明白!

    n 是core number

  • Thomas Yang ,您好:

    1.文档中对寄存器CH_MAP_REGx说的不是很清楚,我想知道每个INTC控制器的通道个数是否是1024?

    2.CH_MAP_REGx寄存器位域CH0_MAP,CH1_MAP,CH2_MAP,CH3_MAP这些位域代表的什么意思?感觉这些位域的值,代表着系统事件需要映射到的通道号的值,不知道是否正确?麻烦说明下,谢谢!

  • Sicheng

    您好,这2个问题在文档中都有答案

  • Thomas Yang,您好:

    图中INTC0可以同时产生8 Broadcast Events from INTC0给8个核,请问INTC0输入什么系统事件的时候,导致8 Broadcast Events from INTC0,INTC0该如何设置?希望可以给出例程!

    谢谢!

  • 8个核的IPC中断,您可以参考论坛中IPC中断例程。

  • 你好:

    论坛里面IPC例程只是一个核给另外一个核一个IPC中断,   不是同时给8个核中断, 我想实现一个事件发生时,同一时刻给8个核一个同步中断, INTC0产生的8个 Broadcast Events应该是现实这个功能,但是现在我在文档中没见到有哪个寄存器实现这个功能,而且输入INTC的系统级事件中,也没有发现这样的一个事件,如果你知道是哪个寄存器和事件号,请直接告诉我它们的名字,谢谢!

  • si cheng您好,

    对于6678而言,根据interrupt controller user guide知,INTC0输出的event可以同时输入到8个core上,在cslr_device.h中可以找到如下宏定义。因此只要有一个输入事件到INTC0,然后将该input_event分别map到每个核对应的INTC0_OUT_x + 16*coreID,即可根据一个输入事件产生多个host ISR到相应的核,从而可以按照你的方式产生相应的核间同步。

    #define CSL_GEM_INTC0_OUT_8_PLUS_16_MUL_N (0x0000004a)

    #define CSL_GEM_INTC0_OUT_9_PLUS_16_MUL_N (0x0000004b)

    #define CSL_GEM_INTC0_OUT_10_PLUS_16_MUL_N (0x0000004c)

    #define CSL_GEM_INTC0_OUT_11_PLUS_16_MUL_N (0x0000004d)

    #define CSL_GEM_INTC0_OUT_12_PLUS_16_MUL_N (0x0000005c)

    #define CSL_GEM_INTC0_OUT_13_PLUS_16_MUL_N (0x0000005d)

    #define CSL_GEM_INTC0_OUT_14_PLUS_16_MUL_N (0x0000005e)

    #define CSL_GEM_INTC0_OUT_15_PLUS_16_MUL_N (0x0000005f)

    如有描述或者理解不清的地方,请回复讨论,谢谢!

  • 您好:

    我在C6678的PDK文件下的cslr_device.h中,没有找到你给出的以上宏定义,但是在C6670的PDK中的cslr_device.h中,却找到了这些宏定义.我用的MCDSK版本是2.00.00.beta2,不知道你用的是哪个版本的?

    csl_cpIntcAux.h这个头文件中定义了一个函数

    CSL_IDEF_INLINE void CSL_CPINTC_mapSystemIntrToChannel (    CSL_CPINTC_Handle           hnd,

       CSL_CPINTCSystemInterrupt   sysIntr,

       CSL_CPINTCChannel           channel)

    但是该函数定义并不能实现将一个输入的系统事件映射到8个核上.谢谢!

  • si cheng您好,

    不好意思,我说的那些宏确实是在6670中找到的。在6678中存在如下宏(此处没有完全列出,详细请参考cslr_device.h),说明可以通过INTC将相同的输入中断事件映射到多个不同的核上。具体实现时可通过在每个核上分别调用CSL_CPINTC_mapSystemIntrToChannel,其输入的sysIntr是一致的,但是需要根据核ID区分channel,具体可参考如下宏的定义,其中N表示coreID(取值0~7)。

    #define CSL_GEM_INTC0_OUT_32_PLUS_11_MUL_N_OR_INTC0_OUT_32_PLUS_11_MUL_N_MINUS_4 (0x00000015)

    #define CSL_GEM_INTC0_OUT_33_PLUS_11_MUL_N_OR_INTC0_OUT_33_PLUS_11_MUL_N_MINUS_4 (0x00000016)

    #define CSL_GEM_INTC0_OUT_34_PLUS_11_MUL_N_OR_INTC0_OUT_34_PLUS_11_MUL_N_MINUS_4 (0x00000017)

    #define CSL_GEM_INTC0_OUT_35_PLUS_11_MUL_N_OR_INTC0_OUT_35_PLUS_11_MUL_N_MINUS_4 (0x00000018)

    #define CSL_GEM_INTC0_OUT_36_PLUS_11_MUL_N_OR_INTC0_OUT_36_PLUS_11_MUL_N_MINUS_4 (0x00000019)

    #define CSL_GEM_INTC0_OUT_37_PLUS_11_MUL_N_OR_INTC0_OUT_37_PLUS_11_MUL_N_MINUS_4 (0x0000001a)

    #define CSL_GEM_INTC0_OUT_38_PLUS_11_MUL_N_OR_INTC0_OUT_38_PLUS_11_MUL_N_MINUS_4 (0x0000001b)

    #define CSL_GEM_INTC0_OUT_39_PLUS_11_MUL_N_OR_INTC0_OUT_39_PLUS_11_MUL_N_MINUS_4 (0x0000001c)

    #define CSL_GEM_INTC0_OUT_40_PLUS_11_MUL_N_OR_INTC0_OUT_40_PLUS_11_MUL_N_MINUS_4 (0x0000001d)

    #define CSL_GEM_INTC0_OUT_41_PLUS_11_MUL_N_OR_INTC0_OUT_41_PLUS_11_MUL_N_MINUS_4 (0x0000001e)

    #define CSL_GEM_INTC0_OUT_42_PLUS_11_MUL_N_OR_INTC0_OUT_42_PLUS_11_MUL_N_MINUS_4 (0x0000001f)

  • 您好:

    INTC控制器同一时刻应该最多可以给4个核一个同步事件,因为器件手册中,事件表中有92号事件INTC0_OUT(4+8*n) Or INTC1_OUT(4+8*(n-4)),从这个可以看出,INTC0最多给4个核一个同步事件,0<=n<=3时,INTC0_OUT(4+8*n) ,n>=4时,INTC1_OUT(4+8*(n-4)).控制器变了.但是文档上说的是给8个核一个同步事件,画的图是4个,不知道是否有问题.

    谢谢

  • si cheng您好,

    关于user guide中如下描述的理解:

    INTC0,  and INTC1 provide 17 additional events as well as 8 broadcast events to each of the C66x corepacs.

    结合文档中figure7-29及table7-38,INTC0可以输出17个事件到Core0/1/2/3,INTC1可以输出17个事件到core4/5/6/7;INTC0输出8个广播事件到core0/1/2/3,INTC1输出8个广播事件到Core4/5/6/7。

    如果只看上述英文描述的话确实有点歧义,所有还是结合图表理解其真实含义,谢谢!

  • Andy Yin,您好:

    因为INTC最多只能同步4个核,如果我想在同一时刻同步8个核,我该如何操作?谢谢!

  • si cheng 您好,

    关于8核同步,请参考。

    1. 如你之前的想法,虽然INTC0/1分别只能输出中断到4个核上,但是可以注意到INTC0与INTC1具有很多相同输入事件,所以可以通过同一事件,分别通过INITC0、INTC1产生事件同步8个核;

    2. 可以使用hardware semphore,具体可以参考一下MCSDK安装完后PDK_6670中的exampleProjects/FFTC_Multicore_exampleProject,其中使用了hardware semphore进行多核的同步,使用起来也不复杂。

    如果您想到其他更好的方法也可以共享一下,非常感谢!