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多核触发启动疑惑?



各位大侠,

     最近在调试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的呢?

 

 

  • Hi chunlei gan

    group的目的是让core0或者core1同步运行,避免出现core0运行了,而core1还没有初始化的情况

    对于实际release版本,你可以用代码的形式保证2core 同步运行,方法比较多,比如采用共享全局变量作为旗语来让2者同步

  • Hi Thomas Yang

        刚刚看bootlaoder手册,boot通过core0的BOOT_MAGIC ADDRESS来触发core0,这部分代码写在ROM里面,用户无法查看,那么想必在core1里面也有BOOT_MAGIC ADDRESS这样的一个相关地址用来使core0触发core1.想问下,我的理解正确么?

        您刚刚所说用全局变量的方式保持2core同步可以这样理解么:

        在core0触发后,给一个全局变量旗语置1,当core1发现全局变量旗语置1后启动?

        但是问题来了,那时候core1还没有初始化吧?如何知道全局变量旗语已经置1了呢?

                                                                                                                 谢谢。

  • 您好,

    每个core都有相应magic address;都是由core0写该地址并通过IPC触发其他核。

  • Hi  chunlei gan

    在core0和core1都正常启动,跳到main函数后,用软件的方法来同步2个core

    应用代码查到core0和core1的启动标志(软件定义的全局变量,core0_init = ok, core1_init =ok)后,才能继续向下执行,否则需要等待

  • 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去判断全局变量的值?

    不好意思,我现在对多核的一个流程有些模糊,或者有相应的资料我去看下。谢谢

  • Hi Thomas Yang ,

    用软件同步2个core还是不大明白,能否说的详细点呢?谢谢

  • 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,其他核还是不会跑起来的。请问还有什么需要注意的地方呢?谢谢

  • Hi chunlei gan

    我最近也在学习IPC中断启动其他核。但是我遇到了一点问题。

    当我从0核的L2P SRAM利用memcpy搬移其中的代码内存到其他核的SRAM 的时候,总是提示我出现错误:A memery access has been pending for 10000 cpu cycles。要搬移的内存块有0x60000这么大。

    不知道问题出在什么地方,能不能帮我分析下??

    能不能把您的源代码发给我一份,感激不尽。我是初学者,看了一周文档和程序都没进展。