TI中文支持网
TI专业的中文技术问题搜集分享网站

关于TMDSEVM6678LE的程序问题

本人基于sys/bios编程,核0接收网口数据,核2进行算法移植。在核2接收到核0的数据后进入内层子函数时出现了这个现象:

而后进行单步,则红色的提示依次增加。根据提示将JTAG 频率由1M调低到512k和256k,几乎没有效果,依然出现这个问题。通过观察子函数地址以及传入参数地址,均为正常地址。DDR3已经初始化成功。我用的CCS版本是CCS5.5,仿真器版本是XDS100v1;请教一下各位专家,谢谢咯

Allen35065:

看情况是访问了非法地址,注意核2访问核0的数据要使用全局地址,多核下数据交互不要采用局部地址0x008xxxxx的形式

Gangping Li:

回复 Allen35065:

Allen Yin 你好!由核0的数据传输到核2:我是先通过memcpy函数将核0数据搬移到共享存储,然后将共享存储的数据搬移到核2的数组中(这部分是通过触发IPC发生寄存器来告诉核2它的数据来了;由于数据量不大,所以没有使用EDMA);而在进入核2算法处理的过程中我并没有使用局部地址0x008xxxxx的形式,全都是malloc动态分配。如下流程图:

算法第一层函数: (进入算法第一层函数没有任何问题)

算法第二层函数: (在进入attitude_solution函数内部出现刚才描述的问题)

而后我通过#pragma CODE_SECTION(attitude_solution,".mycode");将attitude_solution函数放在DDR3中,依旧会出现刚才的问题,但是仍然可以单步调试。

Gangping Li:

回复 Allen35065:

Allen Yin ,你好!

我没有理解你说的使用全局地址,能否详细说明一下,谢谢了!

Allen35065:

回复 Gangping Li:

对于核内地址,局部地址0x008xxxxx对应全局地址0x108xxxxx+DNUM*0x01000000

Gangping Li:

回复 Allen35065:

Allen Yin ,谢谢你!

我对局部地址的理解是这样的,以前在论坛上看到各个核L2地址在CCS上显示出来的是虚拟地址(都是0x008xxxxx),所以我当时就有个疑问觉得很奇怪,为什么每个核的L2地址都是一样,觉得一定会出现资源冲突(当时调试过程的确碰到了资源冲突的情况)。但是后来看了相关文档和论坛才发现每个核L2实际上的地址是全局地址0x108xxxxx+DNUM*0x01000000。

关于现在调试出现的问题,应该不是局部地址和全局地址的问题,因为我没有用到局部地址0x008xxxxx和全局地址。目前将第二层函数逐步截断来排查问题,觉得应该是我编写的代码问题。

感谢Allen Yin抽空来帮助我!希望以后多多请教你!

Allen35065:

回复 Gangping Li:

不用客气:)

你的第一篇log里面有访问0x008xxxxx报错的log,单步排查一下应该能找到问题。

Gangping Li:

回复 Allen35065:

Allen Yin,你好!

我的确没有使用过0x008xxxxx的局部地址。还有一个问题就是我在sys/bios中使用了很多malloc函数来分配动态数组和使用了很多free函数来释放内存;但是有时候DSP能跑通有时候在free函数上出错。请问一下Allen Yin 先生,在学习sys/bios时,对于新接触这个系统的我们是不是不太推荐过多使用malloc函数和free函数呢?我觉得这两个函数有时候出现的问题导致整个代码运行不稳定,而且很难排查bug。因为有时候整个代码能很顺利的跑通,有时候出现这种错误ti.sysbios.heaps.HeapMem: line 345: assertion failure: A_invalidFree: Invalid free。我目前的主要问题就是总会遇到因为free不成功导致整个代码不稳定。对于在sys/bios动态分配多维数组,你能否给一些适合新接触sys/bios人的建议呢(比如像创建链表等)?谢谢咯。

赞(0)
未经允许不得转载:TI中文支持网 » 关于TMDSEVM6678LE的程序问题
分享到: 更多 (0)