为什么有的样例在cpu1里 需要 InitSysCtrl(); InitGpio(); 而在CPU2中就不需要。
而有的样例在cpu2中却 InitSysCtrl();
请问: 何时需要在cpu2中也要InitSysCtrl(); InitGpio(); ? 何时不需要?
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.
为什么有的样例在cpu1里 需要 InitSysCtrl(); InitGpio(); 而在CPU2中就不需要。
而有的样例在cpu2中却 InitSysCtrl();
请问: 何时需要在cpu2中也要InitSysCtrl(); InitGpio(); ? 何时不需要?
就比如 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??
应该是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),因此实际上是被注释掉了,并没有真正执行的,除了关闭看门狗和打开被分配到的外设的时钟之外。
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里,还是没有初始化该外设的时钟。请按照第一条执行。