过去参考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状态下)运行,会丢掉这一段程序。