TI中文支持网
TI专业的中文技术问题搜集分享网站

关于例程RAM_management的困惑 ————F28377D

       过去参考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工作了!

赞(0)
未经允许不得转载:TI中文支持网 » 关于例程RAM_management的困惑 ————F28377D
分享到: 更多 (0)