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.

6678多核IPC问题

程序是这样设计的:

先启动core1-core7等待,然后启动core0。

core0给core1-core7发IPC中断。

然后,core1-core7收到中断后,又都给core0发IPC中断,即设置IPCAR0的最后一位为1。

运行的结果是,core1-core7都能准确的收到core0发来的IPC中断,但是,在收到中断后,同时给core0发中断时,core0只能收到 core1、core3和core7三个核发来的IPC中断,运行很多次都是这样,这是为什么呢,core1到core7的代码都是一样的,是不是同时给IPCAR0的最后一位置1的时候会产生冲突,应该如何避免呢?怎么保证其他7个核同时来IPC时的时候不冲突?

这种问题在设计多核程序的时候应该很常见吧,希望能得到解答,谢谢

  • 您好,

    多核同时写一个资源确实存在冲突从而可能导致中断丢失。IPC只是其中的一种最简单的核间通信方式,还有很多其他的核间通信方式如Navigator就可以避免冲突。建议在实际软件开发时可以直接使用MCSDK安装完之后的IPC,其中封装了核间、及器件之间的通信API,并且由于MCSDK一直在升级,具有很强的移植性。请参考,谢谢!

  • hao wu ,

    您好!

    可以考虑core1~core7使用IPCGR0中不同的SRCS比特,最后再置位IPCG比特。中断服务例程里面检查所有的SRCS比特都处理掉。

  • Yu Liu,您好!

    我就是这样设置的,通过读取SRCS比特判断来自具体core1-7哪个核,但是现在问题不是在识别哪个核心的,而是在 触发core0中断产生了冲突,要触发中断只能通过写 IPCGR0的最后一位吧,如果同时写这一位就会导致中断丢失

  • 你好

    你可以在中断程序中while查询IPCGR的不同标志,然后执行相应的中断处理子程序即可,这样即使core0总的中断响应次数少了,但不会丢失相应中断处理流程。

    谢谢!

  • hao wu,

    再确认各个核通知核0的整个过程。

    core1~core7分别置位IPCGR0中不同的SRCS比特(比如SRCS1~SRCS7),最后再置位IPCG比特。然后核0会产生中断。

    核0在中断服务例程循环检查IPCAR0中被置位的比特进行相应处理,处理完某个比特的事件后只对IPCAR0中的对应比特写入1进行该比特的清除。这样即使在进入中断后仍然有别的核配置了IPCGR0也应该能够得到处理。特别是在推出中断服务例程之前需要检查是否IPCAR0所有的SRCC比特都被处理然后退出。硬件时序上无法同时写IPCG位,但是可能时间上非常接近,按照上面的处理方法应该避免掉大部分的问题。

    当然按照上面的处理之后仍然有很小的概率在中断服务例程退出瞬间又发生了IPCG比特置位。在芯片硬件设计上该中断是电平触发,只要SRCC没有全部被清除,应该会再次触发中断处理。

    建议你在进入中断和推出中断前保存IPCAR0的值,出中断后打印出来观察问题的原因。

  • 非常感谢!问题已经解决,是我没有利用IPCAR将对应的SRCC比特位清除导致的,我在中断服务例程中加了IPCAR进行清除操作,就没问题了,我利用的是SRCS1-SRCS3位识别core1-core7,而没有进行清除操作,因此只能识别001 core1 011 core3 和 111 core7了,感谢上面几位的解答!

  • hao wu,

    感谢您的及时确认!

  • 我想问一下,这个核间中断服务程序只有一个吗?只有一个event对应IPC_LOCAL,如果要实现不同核发的中断服务程序不同,该怎么配置?希望能得到回复!

  • 你好 问一下 你的IPCAR进行清除操作,是直接在对应位置上赋值1吗?我也是这样的操作,但是没有清除不掉,请问你知道是什么原因吗?