路径:\ti\mcsdk_2_01_02_06\tools\boot_loader\examples\pcie\pcieboot_helloworld\evmc6678l下的pcie 多核boot例子相关疑问:
1. Linux下驱动程序pciedemo.c中往DSP写bootCode的程序如下:
/* Load "Hello World" demo into DSP */ pushData(bootCode, 9, &bootEntryAddr); /* Write boot entry address into MAGIC_ADDR */ writeDSPMemory(0, MAGIC_ADDR, &bootEntryAddr, 4);
是将bootCode代码写入了DDR中,而在pushData函数中调用的writeDSPMemory写入DDR的代码如下:
case 9: /* this is for DDR */ if (DSPMemAddr < DDR_START) { return 0; } else { offset = DSPMemAddr - DDR_START; ptr = (uint32_t *)ddrVirt + offset/4; } break;
那么实际中在bootCode表中有些段是分配到了L2SRAM中:
-c -heap 0x2000 -stack 0x2000 /* Memory Map 1 - the default */ MEMORY {DDR (RWX) : org = 0x80000000, len = 0x20000000 LL2 (RWX) : org = 0x00800000, len = 0x00010000 } SECTIONS {.text > DDRplatform_lib > DDR.const > DDR.neardata > LL2.fardata > DDR.switch > DDR.cinit > DDR.stack > LL2.sysmem > LL2.bss > LL2.far > LL2.cio > LL2 }
bootCode一部分的数据:
uint8_t bootCode[] = { 0x80, 0x00, 0xD0, 0x60, 0x00, 0x00, 0xD8, 0x80, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x03, 0xE2, 0x92, 0x46, 0x0C, 0x6E, 0x00, 0x8C, 0xA3, 0x62, 0x02, 0x28, 0x03, 0xE2, 0x92, 0x46, 0x0C, 0x6E, 0x00, 0x8C, 0xA3, 0x62, 0x02, 0x44, 0x03, 0xE2, 0xE2, 0x40, 0x00, 0x00, 0x92, 0x46, 0x0C, 0x6E, 0x00, 0x8C, 0xA3, 0x62, 0xDC, 0x45, 0x8C, 0xF7, 0xBC, 0x4D, 0xAC, 0x45, 0x02, 0x81, 0xC0, 0x2A, 0x02, 0x81, 0x04, 0xEA, 0x00, 0x00, 0x20, 0x00, 0xE1, 0xA0, 0x00, 0x00, 0x02, 0x14, 0x9E, 0x42, 0x6C, 0x6E, 0x10, 0x4D, 0xCC, 0x3D, 0xFC, 0x45, 0x00, 0x00, 0x60, 0x00, 0x02, 0x0C, 0x02, 0x56, ...... }
那么bootCode中究竟有没有cmd文件中分配的 .stack > LL2, .sysmem > LL2, .bss > LL2, .far > LL2, .cio > LL2等段?如果有的话,岂不是writeDSPMemory直接return了,并没有写入到core0 的 LL2?
2. bootCode中具体有数据需要写入到DSP内部的是哪些段?而哪些段是不会放入到boot table中的?
3. _c_int00函数在boot过程中做了哪些工作?比如是_c_int00函数会创建.stack段?所以上面那些分配在LL2中的段都不需要通过bootCode写入每个DSP core的LL2中,而是在调用_c_int00函数之后由_c_int00函数创建的?
非常期待得到您的帮助!
Allen35065:
你提到的第 3 点理解是正确的,这些段是动态创建,所以在cint00之前是不需要有固定值的。