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.

CPU2 初始化的问题。



为什么有的样例在cpu1里  需要  InitSysCtrl();   InitGpio(); 而在CPU2中就不需要。

而有的样例在cpu2中却 InitSysCtrl();  

请问: 何时需要在cpu2中也要InitSysCtrl();   InitGpio(); ?  何时不需要? 

  • 在双核架构里面,CPU1理论上还是主CPU,而CPU2是从CPU,也就是说,在上电复位以后,所有的外设和内存都是默认分配给CPU1的,因此通常默认是由CPU1外设的初始化,而不会由CPU2来完成。当某些外设(由CPU1)被分配给了CPU2时,CPU2有了ownership,就需要对它们进行初始化。

    “有的”这样的描述太笼统,所以不能直接回答你的问题,请给出具体的例子说明问题,我们就可以有针对性地为你解答。

  • 就比如 blinky_cpu01.c  blinky_cpu02.c  这个样例里。

    cpu01 里   InitSysCtrl();

    GpioCtrlRegs.GPADIR.bit.GPIO13= 1;

    GPIO_SetupPinMux(14, GPIO_MUX_CPU2, 0); 

    cpu2就做了 InitSysCtrl();

    却没有初始化GPIO;

    同样在cla_asin_cpu的样例里在CPU2 也有InitSysCtrl();

    然而

    在RAM_management_cpu ,cpu01_to_cpu02_ipcdrivers_lite_c28  这两个双核的样例中cpu2却没有InitSysCtrl();

  • 同大同 说:

    就比如 blinky_cpu01.c  blinky_cpu02.c  这个样例里。

    cpu01 里   InitSysCtrl();

    GpioCtrlRegs.GPADIR.bit.GPIO13= 1;

    GPIO_SetupPinMux(14, GPIO_MUX_CPU2, 0); 

    cpu2就做了 InitSysCtrl();

    却没有初始化GPIO;

    那是因为CPU2可能没有用到GPIO.

    同大同 说:

    同样在cla_asin_cpu的样例里在CPU2 也有InitSysCtrl();

    然而

    在RAM_management_cpu ,cpu01_to_cpu02_ipcdrivers_lite_c28  这两个双核的样例中cpu2却没有InitSysCtrl();

    CPU2没有用到任何外设,纯粹是进行软件处理和内存的处理,可以没有系统的相关初始化。

    一句话,CPU1必须进行初始化,而CPU2是否需要,取决于它是否有用到相关的外设或内存。

  • 谢谢  大哥 这么晚  还在回答我的  问题 辛苦了!!

    blinky_cpu01.c  blinky  这个样例 cpu1把 GPIO13配给了CPU1  。。。。。

    把GPIO14 配给了CPU2, CPU2中  写了GPIO_WritePin(14, 1);   

    for(;;)
    {
    //
    // 打开LED
    //
    GPIO_WritePin(14, 0);
    //
    // 延时
    //
    DELAY_US(1000 * 250);

    //
    // 关闭LED
    //
    GPIO_WritePin(14, 1);
    //
    // 延时
    //
    DELAY_US(1000 * 250);
    }


    但是  并没有 在cpu2 中初始化 gpio   ,只初始化了InitSysCtrl。    

    这个 样例比较简单  大哥 可以看下 


    我的理解是: 因为GPIO 是两cpu  共享共有的  ,所以在cpu1中既然已经初始化了gpio, 并且在cpu1中并没有用到gpio14,所以在cpu2设计到gipo14时中就无需在初始化了吧 ,因为在cpu1  已经初始化了 。



    那这个类。。InitSysCtrl?? 

  • CPU2  需要配置  pll 吗?? 时钟源与PLL的配置寄存器是两块CPU共享的吗??

  • 应该是GPIO31和GPIO34吧?

    你可能需要更仔细地看一下文档说明和函数内部本身的代码,才好理解为什么有或没有GPIO和InitSysCtrl的调用。

    有关GPIO,请查看TRM(SPRUHM8E)的Figure 2-5. Clocking System框图,可以发现GPIO的时钟是来自于PLLSYSCLK,跟哪一个CPU无关,也就是说,它并不需要分配给CPU1或CPU2,可以统一由CPU1来完成初始化,特别是控制寄存器的初始化,然后任意一个CPU都可以直接操作它的数据寄存器,比如DAT/SET/CLEAR.

    而其它外设则需要进行分配,设定操作这个外设的master,因此需要通过CPUSELx寄存器来完成这个动作。

    系统初始化函数InitSysCtrl在CPU2中确实有调用,但是你进入到函数原型去看,就会发现,其实里面的很多代码都是根据当前运行是CPU是1还是2进行了条件编译(#ifdef CPU1),因此实际上是被注释掉了,并没有真正执行的,除了关闭看门狗和打开被分配到的外设的时钟之外。

  • 不需要,这些都由CPU1单独完成,然后两个CPU是共用的,同样请参考上面提到的TRM(SPRUHM8E)的Figure 2-5. Clocking System框图。

  • 10#大哥, 我对你的InitSysCtrl回复  有两个理解:  只针对外设时钟

    1:   系统初始化函数InitSysCtrl在 cpu2中并不是可有可无  当cpu2中涉及到外设(ownership的)时, 需在CPU2中InitSysCtrl 来初始化 ownership到cpu2中的外设时钟   对的吧    

    2:那话又说回来   难道不可以先在cpu1 中  InitSysCtrl  (所有外设时钟初始化),然后再给 涉及到cpu2 的外设  ownership , 这样cpu2中的外设 在授权前 就初始化了 就不需要 在 cpu2中  InitSysCtrl    这样理解不行吗??

    这两种理解 哪个正确? 

  • 同大同 说:

    1:   系统初始化函数InitSysCtrl在 cpu2中并不是可有可无  当cpu2中涉及到外设(ownership的)时, 需在CPU2中InitSysCtrl 来初始化 ownership到cpu2中的外设时钟   对的吧    

    对的,除了外设时钟,还需要在CPU2初始化整个外设的寄存器。

    同大同 说:

    2:那话又说回来   难道不可以先在cpu1 中  InitSysCtrl  (所有外设时钟初始化),然后再给 涉及到cpu2 的外设  ownership , 这样cpu2中的外设 在授权前 就初始化了 就不需要 在 cpu2中  InitSysCtrl    这样理解不行吗??

    不可以,这样相当于在CPU2里,还是没有初始化该外设的时钟。请按照第一条执行。