This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6678程序切换



背景:自己开发的带一片C6678的电路板,6678外挂128MSPI NOR flash,通过SPI 启动。程序1使用TI转化工具链生成BIN文件烧写存储在FLASH block0(带SPI参数表,格式为大端),程序2使用TI转化工具生成BIN文件烧写存储在FLASH block1(小端模式,仅存储了BOOT TABLE,格式应该是类似EMIF加载启动的格式,没有BOOT代码)。已通过SPI 从FLASH加载启动程序1,在L2 0x10800000起始,程序1大小不到100K。

程序1运行后,从BLOCK1读取程序2,并按段加载到L2 0x10820000起始。

现在希望跳转到L2 入口运行,但是不知道如何触发运行。尝试了将程序2入口地址更新到MAGIC_ADDRESS,并设置IPCGR0 =1,但是程序2没有启动运行。

由于项目进度压得紧,C6678也是第一次接触,希望TI专家对程序切换再触发运行给予解答帮助,谢谢。

  • 1、这两个程序都放在核0运行?

    2、可以尝试定义一个指针函数:void *entry(); 加载完程序2的代码后,将entry= 程序2的入口地址。

    我上面写的可能不完全正确,可以参考IBL 中I2cinit.c   main()中的代码跳转方法。

  • Wu Feng,你好:

    1 是要两个程序都在核0运行,先跑起程序1,再加载程序2运行;

    2 IBL中,有个跳出语句,

                    exit = (void (*)())entry;

                    (*exit)();

    之前在调试过程中,程序1将程序2按段加载后,将程序2入口地址赋给entry,然后运行上面两句代码,程序并没有跳转到程序2。不知道在运行上面两句前还有没有别的操作。或者还有没有其他方法。

  • 你的程序入口地址是0x10820000 还是map文件中的入口地址?

  • Wu Feng  你好:

    是map文件中的入口地址,转化工具生成的是BIN文件,格式为BOOT TABLE,开始4个字节为入口地址。

    调试时,程序1将程序2加载后,从flash读取的入口地址也正确,确实是map中的入口地址。代码段也没问题,至少跟烧入的bin文件一样。

    因为看多核启动流程,core0加载其他核后,更新MAGIC ADDRESS,然后发送IPCGRx产生IPC中断。

    不知道core0自己能否给自己发送IPC中断,使程序切换。

  • 0x10820000起始段为csl_vec段,也尝试了直接跳转过去,未能成功。

    以前C6000单核,用过直接跳中断向量表的方法来切换。

  • 给自己发ipc中断实现跳转没试过。还是求专家点拨吧