我现在调试一个2核程序,出现了下面的情况:
- 使用仿真器调试程序运行时正常的,但是把程序烧写的SPI FLASH后,上电后0核运行正常,1核程序在运行Ipc_start();函数是程序异常退出,运行的截图:;
- 修改了程序中几个无关数组的长度后,上述错误消失,即仿真器和上电boot运行都正常;
请教一下这个问题可能是什么原因导致,解决这个问题我需要重哪方面入手?
我现在进行了以下一些调试分析,我在main函数开始使用while()语句让程序运行在此处不再往下运行,然后根据1核*.map文件中程序占用的地址空间,分别把使用仿真器load和上电boot时程序相关的地址空间的内容导出,把使用仿真器load程序导出文件记为load.dat,上电从flash boot起来的程序记为flash.dat,对比文件内容,.txet段内容是一致的,其他段是有一些不同,如.fardata、.far等段;使用仿真器把这两个.dat通过load memory…的方式load到相关区域进行测试,运行boot.dat对应程序确实会在运行Ipc_start();时异常退出,而运行load.dat能正常运行。
Shine:
请问是不是把无关的数组长度改小后就可以了?是否有参考过下面的帖子?这个帖子的问题是程序代码变长了,烧写Flash的时候,后面的数据被截断了,导致boot失败。
e2echina.ti.com/…/78355
liu_fpga:
回复 Shine:
是把一些数组变长以后好了,数组长度是2000是正常的,如果是200就是异常的。
Shine:
回复 liu_fpga:
请问如果把ipc_start去掉是不是就能加载?
liu_fpga:
回复 Shine:
对的,后把1核的某些段放到了L2RAM,烧写进去是正常的,我试着修改段的存放位置和对齐方式,调试的时候都是正常的,但是烧写进去进去后出现的问题各有不同,有的是就是执行ipc_start()后退出,有的时候执行到某句话后指针又跳到程序的开头,也不知道是不是跟我们生成烧写文件的方法有关系。
Shine:
回复 liu_fpga:
只用到核0,核1的话,看看有没有把其他核disable掉。另外,看一下cfg配置文件里有没有这句Ipc.sr0MemorySetup = true?
On some systems, the SR_0 memory may not be available at boot time. Host processor might map the memory into the slaves MMU. This
configuration flag is used to block the slave until the memory is available. Ipc_start will spin until this flag is set true by host.processors.wiki.ti.com/…/IPC_Training_2_21.pdf
具体请参考下面的帖子。
e2e.ti.com/…/768546