各位大侠,
最近在调试6678 的IPC,从core0触发core1.在调试过程中,需要将core0和core1两个核group后才能在run的时候,core0会触发core1.
如果我没有group后两个核是单独的,运行core0后,它不会将core1触发。
请问,有没有其他方式,不用group方式从core0触发core1,并使core1运行?我看了手册里里面写到一句话:
Group, connect the target, load and run the project on Core 0~7 simultaneously。
如果没有其他方式的话,在release版本中,脱离CCS平台和仿真器,core0是如何触发core1的呢?
Thomas Yang1:
Hi chunlei gan
group的目的是让core0或者core1同步运行,避免出现core0运行了,而core1还没有初始化的情况
对于实际release版本,你可以用代码的形式保证2core 同步运行,方法比较多,比如采用共享全局变量作为旗语来让2者同步
chunlei gan:
回复 Thomas Yang1:
Hi Thomas Yang
刚刚看bootlaoder手册,boot通过core0的BOOT_MAGIC ADDRESS来触发core0,这部分代码写在ROM里面,用户无法查看,那么想必在core1里面也有BOOT_MAGIC ADDRESS这样的一个相关地址用来使core0触发core1.想问下,我的理解正确么?
您刚刚所说用全局变量的方式保持2core同步可以这样理解么:
在core0触发后,给一个全局变量旗语置1,当core1发现全局变量旗语置1后启动?
但是问题来了,那时候core1还没有初始化吧?如何知道全局变量旗语已经置1了呢?
谢谢。
Andy Yin:
回复 chunlei gan:
您好,
每个core都有相应magic address;都是由core0写该地址并通过IPC触发其他核。
Thomas Yang1:
回复 chunlei gan:
Hi chunlei gan
在core0和core1都正常启动,跳到main函数后,用软件的方法来同步2个core
应用代码查到core0和core1的启动标志(软件定义的全局变量,core0_init = ok, core1_init =ok)后,才能继续向下执行,否则需要等待
chunlei gan:
回复 Thomas Yang1:
Hi Thomas Yang
1 .您说在core0和core1都正常启动?想问下在做main函数之前,所有的8个核都已经起来了?这块是在c_int00里面做的吧?(对c_int00这块不大了解 ),core0已经启动后,其他core都进入idle状态,然后等待core0去用IPC触发其他核么?
2. 您说的全局变量可以这样理解么,在除core0以外的所有核都进入idle状态后,就将每个核的全局变量置成OK,而此时还没有进入main函数,应该在c_int00里面么?然后每个核在main去判断全局变量的值?
不好意思,我现在对多核的一个流程有些模糊,或者有相应的资料我去看下。谢谢
chunlei gan:
回复 Thomas Yang1:
Hi Thomas Yang ,
用软件同步2个core还是不大明白,能否说的详细点呢?谢谢
chunlei gan:
回复 Andy Yin:
Hi Andy Yin:
我在core0里面写了相应的magic address,并通过IPC也触发了其他核,如下:
if(coreID == 0)
{
….
core0_init = OK_INIT;
/* Writing the entry address to other cores */
for (core = 1; core < 8; core++)
{
printf("core %d writing the entry address to other cores,core %d.\n",coreID,core);
DEVICE_REG32_W(BOOT_MAGIC_ADDR(core), (uint32_t)&_c_int00);
/* Delay 1us sec */
for (i=0; i<1000; i++)
asm (" NOP 5");
}
for (core = 1; core < 8; core++)
{
/* IPC interrupt other cores */
DEVICE_REG32_W(IPCGR(core), 1);
for (i=0; i<1000; i++)
asm (" NOP 5");
}
….
}
else if((coreID == 1)&&(core0_init == OK_INIT))
{…
}
这样,core0应该就可以把其他核触发了,在group多核的情况下,所有的核都可以跑起来;但是,如果不设置成group的话,在参考Thomas Yang 的方式设置了全局变量core0_init,其他核还是不会跑起来的。请问还有什么需要注意的地方呢?谢谢
gao shilin:
回复 chunlei gan:
Hi chunlei gan
我最近也在学习IPC中断启动其他核。但是我遇到了一点问题。
当我从0核的L2P SRAM利用memcpy搬移其中的代码内存到其他核的SRAM 的时候,总是提示我出现错误:A memery access has been pending for 10000 cpu cycles。要搬移的内存块有0x60000这么大。
不知道问题出在什么地方,能不能帮我分析下??
能不能把您的源代码发给我一份,感激不尽。我是初学者,看了一周文档和程序都没进展。