最近调试6678boot,遇到一些问题,麻烦专家解答!
boot过程我的理解大致是:每个核产生一个out文件, 每个核的各个段分别分配到其本地的L2空间里,然后通过TI的转换工具将8个out转换并融合成一个.dat文件写进FLASH里面。其中,核0里面有一个二级引导程序“二级bootoader”,用汇编编写的,其放在FLASH开始的前1KB空间里,其功能是将应用程序复制到内部的RAM里面运行。当上电后,6678内部ROM里固化的“一级bootloader”完成初始化并复制FLASH前1KB的数据到内部L2的地址0处,然后“二级bootoader”完成应用代码的搬移,再跳到入口程序处开始程序的执行,整个boot过程完成。
问题:
- 上述对boot的理解过程是否正确?
- 我知道core0里面是有一个“二级bootoader”完成代码搬移工作,但是不知道其余core是否也需要这样一个“二级bootoader”完成相应核的代码搬移?
3. 我看到另外一种说法:需要在core0的待加载工程中编写引导代码,此引导代码的作用就是将core0的代码按段加载到内存中,最后跳到入口地址处开始执 行。此段引导代码用汇编语言编写,命名.bootload段,放在L2 SRAM的前1KB空间,并烧写到Nor Flash的前1KB空间,应用代码放到1KB后面。然后由core0加载其它核,具体步骤是:
1) 上电后,core0完成程序加载,并跳到入口地址开始执行程序。
2) 在core0主程序中,core0从Nor Flash中读取core1的代码,并按段加载到core1的L2 SRAM,然后将core1程序的入口地址写到core1的BOOT_MAGIC_ADDRESS,即L2 SRAM的最后4个字节地址:0x1187FFFC,最后向core1发送IPC中断,既写寄存器IPGR1=0x1,其它核的加载过程一样。
上面过程我的疑问是:2)中core0加载其他核代码到L2 SRAM,这个过程是怎么完成的?用C语言还是汇编?
Andy Yin1:
您好,
你的理解过程没有太大问题,但是注意不同芯片可能会有细微的差异。对于C6678 EMIF16 Nor flash boot而言,在ROM中存在一级boot,在core0中不存在二级boot,所以上电后的启动过程如你所述的第3点,bootload的代码用汇编写。
参考EMIF16 flash boot,其中有一个boot.asm:http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/p/16937/57036.aspx#57036