我用的是C6670的EVM板。在4个core分别运行不同的.out文件,在CCS中通过仿真器依次运行core0到core3的程序,功能都是正常的。
经过很长时间的摸索,终于可以通过IBL启动SPI flash中的程序,4个core都能正常运行(通过在每个core的main函数中用uart输出信息判断)。
我的问题来了,虽然核都启动了,但是整个功能不正常!!!!
采用uart逐步输出信息调试,发现只要启动了core1或core2,core0不能正常发送以太网包,就算core1启动后进入main函数就是一个死循环,core0还是不正常。
我在想以下几种可能性:
1.自启动和仿真器运行的差别是core1和core2是core0通过IPC运行的,难道core1或core2需要清中断?
2.几个core之间通过QMSS队列传递消息,在共享内存中相同的变量,是不是其余core在启动后“没有释放”共享资源,导致core0工作不正常。(这条有点悬,确实没办法,有点胡思乱想)
3.还有个问题是,在共享内存中定了一个全局变量,core0将该变量赋值为1,正常情况下其余core后启动,判决到该全局变量为1后继续运行。但是如果是先运行其余core,后运行core0,因为是后赋值,其余core就一直判决不到1,用仿真器跟也是这样的,不知道为什么?
问题太多,不知哪位大虾帮帮忙,不甚感激呀,小弟已经焦头烂额了!
Andy Yin1:
1 仿真器下载out到4个core上,4个core能否正常起来,此时core0能否正常发包;
2 为了验证加载过程的正确,4个core分别只运行简单的helloworld程序,没有任何的核间通信同步,此时是否正常;
3 在使用共享全局变量时,注意两点,一是可以放在noncacheable memory避免cache一致性导致的问题,二是将其定义为volatile。
建议分两步定位问题:
1 加载测试先只加载简单的helloworld程序,测试加载过程的正确性;
2 你的应用工程功能首先要在仿真器加载环境下测试通过,然后再进行flash加载测试。
fei xiao1:
回复 Andy Yin1:
谢谢Andy,仿真器下载out到4个core上,每个core的功能都是正常的,此时core0能正常发包。正因为仿真器调试完成后,现在想通过flash加载完成产品过程。
1.首先我基本可以确定,通过I2C中的IBL加载过程应该是正确的,因为每个core在正常启动后都在uart有相应的输出。
2.通过调试信息跟踪,发现core0不能正确发包的原因是在执行Qmss_queuePop (gTxFreeQHnd)时,获取到空指针。只要core1启动了(通过IPC发送中断启动),哪怕是在进入main函数就死循环,啥工作后不做,也是这样。但是core0启动后不给core1发送IPC中断,core0的一切都是正常的。我猜想是不是core1启动后,core0在Qmss_Init时根本就没有成功,但是为什么呀,百思不得其解!!!
Andy Yin1:
回复 fei xiao1:
你是使用EMIF或者SPI flash boot mode么?flash boot mode RBL不会对navigator做什么处理,所以这种情况下可以排除RBL代码导致的原因。另外IPC只是写IPCGR寄存器产生中断也不会导致这种现象。
你的memory是怎么分配的,核间有共享代码及数据么,堆栈是怎么开的,看看有没有可能是这方面的原因呢。
fei xiao1:
回复 Andy Yin1:
我是通过SPI Nor Flash加载的。
我使用的Memory主要是每个core使用自己的L2 SRAM,当然有部分变量使用到共享内存,我也在看查找关于共享资源的使用问题。
还有个疑问就是,out文件中的哪些段必须要转换到btbl文件中,以便搬移到flash中?是不是我用hex6x转换btbl文件时,有些必要的数据没有转换全呢?
fei xiao1:
回复 fei xiao1:
问题还是没有解决!急呀!现在进一步定位到是core0操作共享内存出问题。
目前的环境是这样的,通过IBL将6670的4个core程序都加载,启动core0,core0通过设置IPCGR1种的IPCG位,启动core1。core1在进入main函数后执行执行死循环。core0向core1发送完IPC后正常执行(core2/core3不启动),启动BIOS任务,在任务中执行Qmss_init(),Qmss_start(),其中qmssGObj,queueFree这些在共享内存中的全局变量都是正常的,但是执行完Qmss_insertMemoryRegion()后,全局变量qmssGObj的值出现异常,变为全0!!!导致后面的过程都出错。
如果在前面的过程不启动core1,全局变量qmssGObj的值不会出现异常,最开始怀疑core1影响了core0,所以在core1启动后执行死循环,肯定不会有对共享内存中全局变量的影响,应该就不会有问题了吧,但是现象依旧!!
Qmss_insertMemoryRegion()是系统自带的程序,有些cache一致性的操作,为什么core1启动会影响core0的执行呢?它们都在自己的L2中运行程序,堆栈也是在自己的L2中开启的。
太折磨人了!!!
Andy Yin1:
回复 fei xiao1:
1. 将QMSS相关的全局变量放在core0 的LL2测试看看;
2 在core0对公共资源初始化完之后在发送IPC启动其他core试试。