大家好,
环境:C6670, CCSv5.3, SYS/BIOSv6.33.6.50, XDCToolsv3.23.4.60
我在代码中添加如下代码,
void MulticoreBoot(UInt32 Core1_main_addr, UInt32 Core2_main_addr, UInt32 Core3_main_addr)
{int *pBootMagicAddCore0;int *IpcGr0;int i;int coreId = 0;int *bootMagicAddress;Uint32 c_int00_address = 0x0;coreId = DNUM;pBootMagicAddCore0 = (int *)0x108FFFFC;c_int00_address = (*pBootMagicAddCore0);
if(coreId == 0)
{
bootMagicAddress = (int *)0x118FFFFC;
*bootMagicAddress = Core1_main_addr;IpcGr0 = (int*)0x02620244;*(IpcGr0) = (*(IpcGr0)) | 0x00000001;
}
else if(coreId == 1)
{
bootMagicAddress = (int *)0x128FFFFC;
*bootMagicAddress = Core2_main_addr;IpcGr0 = (int*)0x02620248;*(IpcGr0) = (*(IpcGr0)) | 0x00000001;
}
else if(coreId == 2)
{
bootMagicAddress = (int *)0x138FFFFC;
*bootMagicAddress = Core3_main_addr;IpcGr0 = (int*)0x0262024C;*(IpcGr0) = (*(IpcGr0)) | 0x00000001;
}
}
拟实现Core0写Core1的MagicAddress,再给Core1发IPC,从而启Core1;Core1启Core2;Core2启Core3。
遇到的问题是:
1. Core0从main函数开始执行,执行到这段代码后又跳到main函数开头从头执行;而不是向下执行,启动Core1。这是为什么呢?
2. 这段多核Boot代码在有的工程中正常,但是有个工程(Optimization Level改为3),添加这段代码后就出现了问题1。跟优化选项有关吗?优化level一般设为多少比较合适?还有这段Boot代码是放在一个Task中的,有影响吗?
Feng Lin6:
bootMagicAddress中应该写入_c_init00的值,而不是写入main函数的起始地址。
Feng Lin6:
你这个触发可以都放在core0来做
striker Qian:
核间同步最好采用别的方法,我觉得不应该在多核boot时假设时序。
Feng Jin:
回复 Feng Lin6:
你好!
pBootMagicAddCore0 = (int *)0x108FFFFC;c_int00_address = (*pBootMagicAddCore0);这两句话其实没用,我后来注释了。
每个核的c_init地址从每个核工程的map文件中获的。
Feng Jin:
回复 Feng Lin6:
回头我试试在Core0上触发Core1~Core3,而不是现在这样Core0触发Core1,然后Core1触发Core2,最后Core2触发Core3.
Feng Jin:
回复 striker Qian:
你好!
其实这些代码我都是看了你的帖子后自己做一些修改的。感谢!!
我没有打算做核间同步,我只是想这样:Core0肯定还是上电自启的,然后Core0写Core1的MagicAddress,在发个中断(也叫IPC)给Core1,从而Core1启动;Core1启动后,再如此启动Core2;Core2启动Core3
不理解你说的“假设时序”是什么意思?
striker Qian:
回复 Feng Jin:
Feng jin,
我以为你打算用IPC来控制核的启动顺序。如果不是此目的的话,核0 kick off 其他核就ok了。
striker
Feng Jin:
回复 striker Qian:
我的问题已经定位:是我将代码段等放到了DDR3上导致的。
我在JTAG下,用官方EVM的GEL配置DDR3,代码段放到DDR3,跑程序没有问题。
但是在SPI Boot时,将DDR3配置参数放到bin文件中,代码段等Load到DDR3上,代码运行有问题。
现象就是程序跑几个小时就自动复位了(有测过运行9个小时后,DSP的Core3被复位,代码又从main执行)。
SPI Boot后我看DDR3 write leveling过了,且DDR3中有代码,我SRIO写DDR3数据都没问题,但是程序长时间运行就有问题了。
我将代码段等放到L2上就没有问题了。
目前怀疑是:RBL利用DDR3 parameter table配置DDR3有误,还在测试。
jun shao1:
回复 Feng Jin:
Feng Jin
你好,请问你做SPI多核boot,是否使用了IBL引导,还是直接从SPI启动多核的?能否看一下相关的例程,目前我正在做这方面的工作,谢谢!
TI中文支持网