我在TMDXEVM6678LE上做用0和控制引导1核的试验,程序如下
#define IPCGR_REG ((volatile unsigned int*)0x02620240)
unsigned int magic=0x1187fffc;
if(0 == corenum)
{
memcpy((void*)(0x11800000), (void*)0x00800000, 512*1024);
// 0x1186d800 is the address of _c_int00 for core1 in .map
*((volatile unsigned int*)magic) = 0x1186d800 ;
// Initialize main Platform lib
memset(&init_config, 0, sizeof(platform_init_config));
memset(&init_flags, 1, sizeof(platform_init_flags));
if (platform_init(&init_flags, &init_config) != Platform_EOK)
{
printf ("Platform init failed!\n");
print_platform_errno();
return;
}
platform_uart_init();
platform_uart_set_baudrate(BOOT_UART_BAUDRATE);
/* sent IPC interrupt to core1 */
IPCGR_REG[1] = 1;
while(1)
{
for (i=0; i< 100000000; i++) ;
write_uart(core_msg0);
}
}
else if(1 == corenum)
{
while(1)
{
for (i=0; i< 100000000; i++) ;
write_uart(core_msg1);
}
}
现在遇到的问题是把程序用CCS通过仿真器加载到0核后0核能够运行,1核不能运行。如果把程加载到1核,1核能够运行。
(1)程序中的0x1186d800是我从.map文件中读出来的_c_int00的地址加上1核的物理地址偏移。复制到1核心L2 sram中地址就是0x1186d800,我把这个地址写入magic address对吗?
(2)当我把程序通过CCS加载运行,0核跑起来,能够通过串口打印出正确的信息,我通过0核1核除外的核去看1核的内存,发现代码已经复制到1核。
(3)0核跑起来当我通过CCS用2核去看自己的内存时,会出现如图所示的提示。是不是说明我的1核心已经被IPC触发了呢?
(4)0核跑起来我去看IPCGR_REG[1]的值时,内容是0,IPC触发过程是直接将IPCGR_REG[1]置1后,内部马上自己清零吗?
(5)没有触发1核的可能原因有那些呢?
Jane Lu:
Hi Leeen,
在您的这个测试中,DSP配置成了哪种boot 模式?
IPC REG置1后应该不会自动清0。 但不排除core1 处于运行状态并对其清0了。
另外,是否core1 每次都会出现上述错误? 如果能连接上,请尝试一下方法:
1 CCS只连接core0, 其他核没有connect
2 download *.out to core0, then run it
3 连接core1, 看看PC指针值是多少?
Jane