程序是这样设计的:
先启动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时的时候不冲突?
这种问题在设计多核程序的时候应该很常见吧,希望能得到解答,谢谢
Andy Yin:
您好,
多核同时写一个资源确实存在冲突从而可能导致中断丢失。IPC只是其中的一种最简单的核间通信方式,还有很多其他的核间通信方式如Navigator就可以避免冲突。建议在实际软件开发时可以直接使用MCSDK安装完之后的IPC,其中封装了核间、及器件之间的通信API,并且由于MCSDK一直在升级,具有很强的移植性。请参考,谢谢!
Yu Liu:
回复 Andy Yin:
hao wu ,
您好!
可以考虑core1~core7使用IPCGR0中不同的SRCS比特,最后再置位IPCG比特。中断服务例程里面检查所有的SRCS比特都处理掉。
hao wu1:
回复 Yu Liu:
Yu Liu,您好!
我就是这样设置的,通过读取SRCS比特判断来自具体core1-7哪个核,但是现在问题不是在识别哪个核心的,而是在 触发core0中断产生了冲突,要触发中断只能通过写 IPCGR0的最后一位吧,如果同时写这一位就会导致中断丢失
Thomas Yang1:
你好
你可以在中断程序中while查询IPCGR的不同标志,然后执行相应的中断处理子程序即可,这样即使core0总的中断响应次数少了,但不会丢失相应中断处理流程。
谢谢!
Yu Liu:
回复 hao wu1:
hao wu,
感谢您的及时确认!
dongdong xiao1:
回复 hao wu1:
我想问一下,这个核间中断服务程序只有一个吗?只有一个event对应IPC_LOCAL,如果要实现不同核发的中断服务程序不同,该怎么配置?希望能得到回复!
xingacy:
回复 hao wu1:
你好 问一下 你的IPCAR进行清除操作,是直接在对应位置上赋值1吗?我也是这样的操作,但是没有清除不掉,请问你知道是什么原因吗?