过去参考TI例程,均是用它的主文件,然后自己搭建平台。——-我一直不喜欢完全照抄别人的。
这次因为CPU2不工作,(就是下载到FLASH后,独立工作),所以才照搬TI的例程RAM_management,运行调试时发现了一些疑问,
(以下均以定义了_STANDALONE,及_FLASH,并以激活此模式下编译)
1、使用IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH)函数的位置、方法是否正确?
例程中,CPU1在执行了InitSysCtrl();后,就执行此函数,而此函数有一个:
do
{
bootStatus = IPCGetBootStatus() & C2_BOOTROM_BOOTSTS_SYSTEM_READY;
} while ((bootStatus != C2_BOOTROM_BOOTSTS_SYSTEM_READY));
它是需要检查IPCBOOTSTS的状态的,当C2_BOOTROM_BOOTSTS_SYSTEM_READY不满足就一直停留此处。
注意,在此之前,并没有分配存储区给CPU2.
再看CPU2,
(去掉注释后)
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
while(!( MemCfgRegs.GSxMSEL.bit.MSEL_GS0 &
MemCfgRegs.GSxMSEL.bit.MSEL_GS14 ))
{
}
此段程序,while语句要判断这两块存储区是否分配给了CPU2,如果都分配了,就往下执行,如果其中一个或两个没分配,就停留在此地。
注意,在此之前,并没有对IPC作任何操作!
在手册SPRUHM8I中,所有IPC寄存器都有是The data format is software-defined,并且看了两个CPU的这IPC寄存器,它们的复位值都是0!
也就是说,两个CPU工作时,都停留在上面各自的while指令处。
2、CMD文件,
TI给了一个isr.CMD文件,主要内容为:
SECTIONS
{
/* Allocate program areas: */
isrfunc : LOAD = RAMD0 | RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4,
RUN = RAMGS14,
LOAD_START(_isrfuncLoadStart),
LOAD_END(_isrfuncLoadEnd),
RUN_START(_isrfuncRunStart),
LOAD_SIZE(_isrfuncLoadSize),
PAGE = 0
}
不能就是说,当定义为isrfunc 时,它从RAM区装载,在GS14区运行,
编译后产生的MAP文件中:
RAMD0 0000b000 00000800 0000001d 000007e3 RWIX
RAMGS14 0001a000 00001000 0000001d 00000fe3 RWIX
可见,把程序分配到RAM中,这样,在烧写后(不在DEBUG状态下)运行,会丢掉这一段程序。
Susan Yang:
1 关于CPU2不工作:
当 CPU2 运行bootROM 之后,CPU2会进入idle 模式并等待CPU1的相关指令. 使用IPCBootCPU2, CPU1就会向CPU2发送boot to flash 命令
当连接仿真器的时候, CCS 将会使用 PC 作为应用程序的起始地址,也就是说在调试模式下,CCS负责引导CPU2,所以一般在调试模式下不会有问题。
2 关于IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH)函数的位置和方法:
手边暂时没有这个板子,我周二会详细测试一下。我认为该IPCBootCPU2最好放在下面的语句之后
// // Give Memory Access to GS0/ GS14 SARAM to CPU02 //while( !(MemCfgRegs.GSxMSEL.bit.MSEL_GS0 &MemCfgRegs.GSxMSEL.bit.MSEL_GS14)){EALLOW;MemCfgRegs.GSxMSEL.bit.MSEL_GS0 = 1;MemCfgRegs.GSxMSEL.bit.MSEL_GS14 = 1;EDIS;}
TX dong:
回复 Susan Yang:
谢谢您!
我是严格按照手册上说的去做的,才搞成这样了。手册中的第三章和第四章,反复地看,甚至把堪误的那文档也看了,一直认为IPCBootCPU2函数仅读取CPU2的状态,而IPC寄存器,——- 手册上说:软件定义!!!!这是关键,也就是说,它与CPU2的启动与否是没有关系的,
手册上并没有说,读写一下IPC就可以启动,最后我是失望了,把IPCBootCPU2加进去,也不调试,在后来的开机中,谁知道奇迹发生了:CPU2工作了!