下载了源码, 不知道怎么编译,我需要从反汇编分析多核启动的过程。
BootROM_c6678_PG2.0
JinMing Hu:
回复 Shine:
core0~7上电都会执行这个Bootloader程序吗?
Shine:
回复 JinMing Hu:
只有core0会去执行,建议先看一下bootloader文档。
www.ti.com/…/sprugy5c.pdf
JinMing Hu:
回复 Shine:
我没有找到有关core1~core7相关更加详细的信息。
在多核启动中,首先由core0根据sw3~sw6的配置来确定使用什么方式启动。假设使用spi nor flash这种方式,那么bootloader会从flash读取core0的代码到Local L2 SRAM里面,并且开始执行core0的用户代码。core0就开始负责从flash搬运core1~core7的代码到各自的Local L2 SRAM里面,并且设置其它各核的BOOT_MAGIC_ADDRESS,然后发送一个IPC中断启动其它核开始执行。
我又了解到,core1~core7从一开始就默认执行IDLE指令,当它们接收到IPC中断时会跳出这个IDLE指令, 并且读取BOOT_MAGIC_ADDRESS,开始开始执行自己的用户代码。
下面是我从bootloader中看到的启动代码,不知道我的理解对不对?
所以我认为core0~core7上电的时候应该是这样的,所有的核一开始的PC地址指向0x20B00000 (bootloaderde 的启动代码), 并且开始执行bootloader的代码。
bootloader根据各核的dnum来区别core0与其他核, 如果是core0则完成上面所述的启动流程;如果是core1~core7的话, 那么就设置并使能IPC中断,并且进入IDLE指令,等待中断core0的IPC中断,当接收到core0的IPC中断后,读取BOOT_MAGIC_ADDRESS,开始执行BOOT_MAGIC_ADDRESS指向的代码,就是c_init00()。
然后多核启动完成。
/***************************************************************************************** FUNCTION PURPOSE: Boot for non-zero cores***************************************************************************************** DESCRIPTION: Secondary cores simply clear their boot address register and idle.*Once woken they branch to the address in their boot address register****************************************************************************************/ #pragma FUNC_NEVER_RETURNS(nysh_sec_core_boot) void nysh_sec_core_boot (void) {void (*fp)(void);UINT32i;magicAddr = 0;/* The ROM disabled the cache, but it can become enabled during* the boot process, so flush and invalidate are used */hwFlushCache ();do{nysh_sleep ();// core1 ~ core7 设置并使能IPC中断,并且进入IDLE指令,等待中断hwInvalidateCache ((UINT32) &magicAddr); // 读取BOOT_MAGIC_ADDRESS} while (magicAddr == 0);fp = (void (*)())magicAddr;i = 0;do{chipKickUnlock();DEVICE_REG_BOOT_COMPLETE= (1 << DNUM);/* Boot complete bit */chipKickLock();i += 1;} while ((i < DEVICE_MAX_BC_RETRY) && ((DEVICE_REG_BOOT_COMPLETE & (1 << DNUM)) == 0));/**//**/(*fp)();// 开始执行各核的代码, _c_int00();} /* nysh_sec_core_boot */