最近做C6678脱机自启动,多核的时候一直有问题。
现象就是,如果简单的多核工程,不需要核间通信那种,可以成功启动;
加了Notify核间通信的多核程序,在core0的程序里,加了发IPC中断以及写其他核Boot Magic Address的操作后即使连仿真器都没法用。原因是core0收不到其他核发过来的Notify信号,从而导致自己的任务挂起,其他核自然也收到core0回发Notify信号,然后整个程序就挂了。
所以我想问的是:
通过IPCGR这些寄存器在core0上给其他核发IPC中断去唤醒其他核会对Notify事件产生干扰嘛?要怎么消除呢?试了ICR=IFR,貌似没用。
希望TI专家帮忙!
谢谢!
Andy Yin1:
IPC notify底层使用的是写IPCGR的方式产生中断,你的过程应该是启动过程的写boot magic address及IPC中断,应该是在IPC notify之前,两者不会有冲突。你的多核现在都可以加载运行成功么,还是加载运行起来后notify中断收发不成功?如果是多核加载成功都可以跑起来,但是notify中断不ok,建议你在初始过程中调用csl函数对system event清一下,并将IPCAGR也清零,有可能是boot过程的IPC中断没有清除,如果后续初始未清的话会导致中断产生不了。
Feipng Li:
回复 Andy Yin1:
Andy你好,
我是自己做的启动程序,如果多核工程不使用Notify,是可以启动的。如果使用了Notify,就不行了,为了测试,直接在线调试,只要加了IPC中断,就会卡在Notify_sentevent上,就是不能回调。导致使用了信号量的任务被挂起。
你说的,清楚system event等,我应该是做了。
产生IPC中断试过两种方式:
CSL_IPC_genGEMInterrupt()函数和直接用寄存器地址*(volatile unsigned int *)0x02620244=1……
消除中断也进行了一下操作:
//清除IPCAR
CSL_IPC_clearGEMInterruptSource();
//消除system event以及硬件中断标志
*(volatile unsigned int *)0x01800040=0xFFFFFFFF;
*(volatile unsigned int *)0x01800040=0xFFFFFFFF;
*(volatile unsigned int *)0x01800040=0xFFFFFFFF;
*(volatile unsigned int *)0x01800040=0xFFFFFFFF;
ICR=IFR;
但是都没有产生任何效果。
所以,目前仍然卡着,没法继续啊。
那么现在,清楚IPCAR以及system event都是每个核都要执行吗?
还是有其他的可能?
Andy Yin1:
回复 Feipng Li:
我在E2E上看到如下帖子,应该是你发的,为什么是在core1写自己的magic address,应该是core0启动后向core1写magic address,要不然core0不写core1的话,core1怎么可以启动呢?连接ccs观察确认core1是否有启动。
http://e2e.ti.com/support/dsp/c6000_multi-core_dsps/f/639/t/510108
Notify send event底层实现细节为:http://e2e.ti.com/support/embedded/tirtos/f/355/p/271521/949907#949907
Feipng Li:
回复 Andy Yin1:
的确是我发的。其实我都试过,在core0里写core1的boot magic address,也是不行的。在core1里写就更不行了。当时是看的Raja说的那个SRIO工程的,然后那个工程也是很奇怪,它通过判断核号,来执行操作,也就是当核号为0 的时候,一方面写boot magic address,一方面发IPCGR中断,也没见它去清除这个中断啊,如果核号为其他的时候,就单纯的写Boot Magic address.
目前也没找到,用sys/BIOS写的多核程序的引导例程,所以一直调不通。
不知道你们有没有试过带SYS/BIOS以及Notify通信的多核工程的自启动,有的话能提供一个例程参考吗?
Yicheng Mei:
回复 Andy Yin1:
Andy Yin1 您好:
我现正通过IBL启动nand flash中应用程序。目前,可以通过IBL启动Nand Flash中的单核程序,启动之后核0能够正常工作,当通过IBL启动nand Flash中多核程序时,只有核0能够正常工作,其他7个核都没有反映。我的8个核使用的是相同的一个out文件,是在程序里面通过每个核的CoreID来决定程序执行哪个分支。现在有一下疑问:
(1) 单核启动过程中,是直接将out文件重命名为app.bin文件,通过TI提供的nand writer工程将程序烧写固化到Nand Flash中,这种情况下可正常启动。如果使用一些转换的工具,将out文件转成bin文件,在往Nand Flash 中烧写,程序不能够正常启动,这是为什么,原因何在?
(2) 如果多个核使用同一个out文件,怎么将out文件烧写如nand Flash中,我看到其他的启动方式如 SPI NorFlash启动时,需要通过一系列的工具链转换,配置参数表头等信息。那么在使用IBL Nand Boot过程中,是否也需要类似的工具,还是向处理单核烧写一样,直接将out文件重命名,然后烧写到Nand Flash中?
(3) 多核启动过程中,core0需要将其他核唤醒,从相关的资料中看到,核0给其他核的MagicAddr地址写入入口地址,并向相应核发送IPC中断,那么这个入口地址应该怎么给什么,还是直接去core0的MagicAddr地址空间,将其内容取出,赋给其他核的MagicAddr?
(4) 目前,我直接将out文件重命名成app.bin文件,并烧写。然后在核0中将核0的MagicAddr内容赋给了其他的核1,2,3。发现核0能够正常工作,但是其他核没有工作。然后我用仿真器去查看DSP各个核的PC指向位置,核0指向了代码段,但是核1,2,3的PC没有指向代码段,指向的位置很乱。核4 ,7,5, 6的PC都指向了RBL的位置。这中现象是因为在核0中没有给核1 2 3搬移程序到他的代码段,这个工作是在IBL二级启动程序中完成,还是需要用户来完成,或者是需要将out文件做转换,而不能直接重命名?
期待您的解疑,谢谢!
user5986375:
回复 Yicheng Mei:
Yicheng Mei你好:
我的问题和你差不多一样的情况,请问你的第一个问题解决了吗?我也是直接.out改.app能启动,经过工具,链转换后就不能启动了
user5805407:
回复 user5986375:
你好,我也想用ibl多核启动,请问你成功了吗?能交流一下吗?