想自己验证一下6472多核引导的过程,谁知道一直没有成功,下面把思路和操作描述一下,请大神们帮忙看看哪个环节有问题
平台:EVMC6472
引导方式:boot mode配的0b'0010,即下图红色框中的引导方式
我是用“evm6472\bootloader_package\EEPROM_flash_image_gen”里边的工具把使用EMULATOR在0核上调试OK的.out转成IIC EEPROM
烧写文件之后,使用I2C_EEPROM_writer工程将文件烧写到IIC ROM中去执行的,烧写是成功的,开发板上电之后,0核执行也是没问题的。
我的疑问是:我在0核上通过软件将0核L2 SRAM中的程序copy到其他5个核的L2 SRAM上去,代码如下:
/* 为1、2、3、4、5核复制代码 */
for(uiIndex = 1; uiIndex < 5; uiIndex++)
{
memcpy((void *)(CORE0_L2SRAM_IN_OTHER_CORES + uiIndex * 0x1000000), (void *)CORE0_L2SRAM, 608 * 1024);
}
然后将其他5个核对应的引导地址寄存器DSP_BOOT_ADDRx配置为“main”,代码如下:
*DSP1_BOOT_ADDR = (UINT32)main;
*DSP2_BOOT_ADDR = (UINT32)main;
*DSP3_BOOT_ADDR = (UINT32)main;
*DSP4_BOOT_ADDR = (UINT32)main;
*DSP5_BOOT_ADDR = (UINT32)main;
这些配置完之后,通过0核将其他5个核的BOOT_COMPLETE_STAT对应位域置位,使其他5个核开始引导启动。
这样,应该6个核都能跑起来的吧,但是我在程序里边加了点LED的代码,发现只有0核点了0核对应的LED,其他5个核没有点亮LED
结论:这个过程中其他5个核的引导过程存在问题,导致其他5个核没有正常跑到main函数里边去,所以没有点亮其他5个核对应的LED
问题:这个过程中,除了0核外,其他5个核的引导过程,应该是这样的:0核置位其他5个核的BOOT_COMPLETE_STAT对应位域后,
其他5个核就开始从各自DSP_BOOT_ADDRx寄存器中配置的地址开始执行!关于这点,是我理解的有问题么?如果没问题,那其他5个核应该直接就从main开始运行了,但是通过点LED观察,发现,其他5个核没有运行main里边的函数
请大神赐教啊,多谢先
Woo Alex:
另外请教一个问题:
放在0x100000处的boot rom中的程序,在哪儿可以找到源代码啊?很想知道这个代码里边到底是干了些啥
King Wang1:
有两点意见你可以参考:
1)引导的地址不应该是main,而是_c_int00函数,main函数是无法直接启动的;
2)确定你所有的有效代码是在L2中,而且都是0x008*****的地址空间;
如果这样还不行,那么就加JTAG看看其余Core的PC指针在什么位置,如果不在ROM空间,那么肯定就是启动成功了,只是代码有些问题;如果还在ROM的地址空间,那么就去查各个核的BOOT_ADDR地址是否写入了有效值,并且确定从核的引导方式是否正确。
Woo Alex:
回复 King Wang1:
多谢King Wang1 及时回复。
有几个疑问:
问题1、emulator连接上后显示的那个boot.c(上图中红圈内的)源码在什么地方能看到?
问题2、_c_int00函数是否是做了一些硬件(比如栈指针寄存器的配置)和软件(C库初始化)上必要的配置,然后再跳到main里边来?
问题3、6472的bootloader文档里边有看到一个地方说BOOT_ADDR需要22比特对齐,没太理解
但是在datasheet里边又讲那个开始执行地址是占低22bit,而且是基于L2 RAM偏移的,如下图:
请教一下大神,这个boot_addr寄存器到底怎么使用的哦?
问题4、JTAG仿真器连接上之后,不会影响DSP的运行模式、运行状态吧?
Woo Alex:
回复 Woo Alex:
关于上面第四个问题,刚才连仿真器验证了一下,断掉emulator的连接,复位CPU,核0会执行烧写在IIC ROM里边的代码,此时在连接上JTAG
发现连上JTAG之后,核0的PC变成指向main了,这说明先让CPU运行,再连JTAG,此时CPU状态就不是连JTAG之前的状态了