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.

IPC中断问题



          技术支持你好,我参考的是IPC_example_on_6678,现在有几个问题想请教一下。

          KICK0 = KICK0_UNLOCK;
          KICK1 = KICK1_UNLOCK;   是解锁的意思,我每打开一个核的IPCGR(最低位置1)之前都必须打开。那么对于每个核,下次如果还要打开该核的中断,是不是就不用再置1了?直接可以跳入中断?需不需要响应中断后将IPCGR最低位清掉,下次才可以响应IPC中断?

        还有程序里面写的是:

      KICK0 = KICK0_UNLOCK;
      KICK1 = KICK1_UNLOCK;

    *(volatile uint32_t *) iIPCGRInfo[iNextCore] = interruptInfo;

     *(volatile uint32_t *) iIPCGRInfo[iNextCore] |= 1;
     // lock Config
     KICK0 = KICK_LOCK;
     KICK1 = KICK_LOCK;    为什么解锁要写2遍?应该只要前面的解锁就可以了吧?

       还有一个问题是中断优先级的问题:如果核0在响应IPC的中断,但是另外一个中断(比如需要核0搬移数据,优先级比IPC高)出现了,那么核0必须从IPC中断跳出来去响应该中断,这个优先级怎么去设置呢?仅仅是设置CSL_INTC_VECTID_4到CSL_INTC_VECTID_15么?还需要什么寄存器设置呢?

      最后一个问题是:IPC_example_on_6678所有的中断都对应到vector:CSL_INTC_VECTID_4,如果8个核同时响应了IPC中断(IPC_example_on_6678里面不是同时的),那么是不是得排队啊?问题比较多,希望得到解答,谢谢~~

  • 中断向量表number不同则优秀级不同,INT15 优先级最低

    8个核同时相应IPC中断,通过不同的core服务各自不同的中断相应程序(CSL_INTC_VECTID_4),不会出现排队的情况

  • 那么配置IPCGR寄存器之前需要配置KICK0/1解锁吗?,不配置能否触发IPC中断?

  • 需要。可以参考IPC例程:http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/p/1056/2535.aspx#2535

  • 在程序运行期间,KICK0/1是只要解锁1次就可以还是配置1次设备寄存器组之前都要解锁1次

  • 你好,我想问一下,如果core1和core2同时向core0发送IPC中断,core0该如何响应?

    我在程序中的设计是这样的,为了实现IPC有效性测试,我将core0设为主控核,core0向core1和core2发送IPC中断,当core1和core2接收到core0的中断后进入中断服务函数,这两个核的中断服务函数为向core0产生IPC中断,其中core1发送ipc中断的标号为0x10,core2发送中断的标号为0x20。当core0接收到中断后对IPCAR0中的标号来进行检测,判断是否为这两个核产生的IPC中断。

    但是在程序的运行后我发现,core确实进了两次IPC中断服务函数,但是接收到的中断标记却不对,一次是0x30,第二次是0。但是单步运行是正确的,所以我想问一下是不是和中断优先级有关系?

    core0对于core1和core2发送IPC中断是连续发送了两个IPC中断,之后我试了一下,如果先发送core1IPC中断,之后通过for循环等待一段时间之后在发送core2的IPC中断就不会出现问题,连续发送会出现问题。

    多谢~~

  • 你好,我想问一下,如果core1和core2同时向core0发送IPC中断,core0该如何响应?

    我在程序中的设计是这样的,为了实现IPC有效性测试,我将core0设为主控核,core0向core1和core2发送IPC中断,当core1和core2接收到core0的中断后进入中断服务函数,这两个核的中断服务函数为向core0产生IPC中断,其中core1发送ipc中断的标号为0x10,core2发送中断的标号为0x20。当core0接收到中断后对IPCAR0中的标号来进行检测,判断是否为这两个核产生的IPC中断。

    但是在程序的运行后我发现,core确实进了两次IPC中断服务函数,但是接收到的中断标记却不对,一次是0x30,第二次是0。但是单步运行是正确的,所以我想问一下是不是和中断优先级有关系?

    core0对于core1和core2发送IPC中断是连续发送了两个IPC中断,之后我试了一下,如果先发送core1IPC中断,之后通过for循环等待一段时间之后在发送core2的IPC中断就不会出现问题,连续发送会出现问题。

    多谢~~

  • 您好,

    使用IPC register核间中断,根据IPCAR寄存器中对应SRCC bit的值来确定中断源,如果有多个bit被置上,可以在一个中断服务函数中循环响应。

    对于你这种应用,也可以使用QMSS进行核间通信,可以使用QpendQ或者Accumulator Queue,此时即使多个core同时向同一个queue中push descriptor也会产生多次中断,并且可以根据queue中的描述符来决定中断源。

  • 请问你现在问题解决了吗,我遇到了这样的情况,能留个联系方式交流一下吗

  • 我现在用的方法就是andy说的那种进入中断之后通过分支语句来查询相应的标记位,然后在这个分支中只清除这个位就能在一个中断函数中处理多个中断了。

    但是用队列的方式我不是特别会。

    我的QQ:286848516

  • 函数里面只有一个中断服务程序么?,三个核公用一个中断号和服务程序?

  • 你好,请问一下TI的哪个文档有具体讲解IPCGR和IPCAR寄存器呢?在sprab27b中并没有看到相关内容