程序描述:ARM数据通过网口UDP给DSP核0,核1将对UDP包进行甄别并解析一部分数据,核2将各个数据进行相应的算法处理,就这样完成一次;然后核0继续接收UDP数据,但是经过单步调试,第一次完整的流程从核0接收数据,到核1解析数据,核2进行算法处理都能顺利完成,然后再将核1、核2先全力运行将进行下一次的的时候核0接收不了数据。
现象:(这是三个核全速跑起来之后变成这样)
可以看出核1是正常工作的,核0和核2直接跑飞了。最开始进行分步调试,是可以进行一次完成的流程的,但是运行一次后核0就接收不了数据。
请教一下各位,能给些建议么?还有就是我是第一次编写实时架构程序,所以肯定会有很多不足,希望大家能推荐一下我能看一下哪方面的资料呢?(基于sys/bios的工程的)谢谢了哦
Andy Yin1:
core0/2看不出来是否跑飞了,只是运行到了一个找不到对应symbol的地址,可以 确认这个地址段是否是合法的代码段,如果不是则说明跑飞了。
另外打印了很多非法报文,指示接收到的packet大小不对,check下接受报文的解析处理;另外分部执行是每个core单独执行么?如果单步执行ok,3个core同时执行有问题,可能是多核的程序中代码、数据、stack等存在共享资源冲突导致程序运行出错。
Gangping Li:
回复 Andy Yin1:
谢谢Andy的回复!
将核1、核2全速运行,本人手动向网口助手填数据向核0发送;这一整个流程都没有问题。目前根据自己的检测、调试,发现运行在核2中的算法程序有内存泄漏和指针泄漏的嫌疑。我将算法屏蔽后发现核0是能够继续接收数据的。这可能说明是因为核2对于指针,内存操作不当,干扰了核0的程序导致核0无法接收数据,同时核2自己也跑飞了;(核1一直都是正常的,全速跑也是正常的;核2我用了很多动态分配,有时候运行free函数时候会出现free invalid)。
Gangping Li:
回复 Andy Yin1:
Andy,你好;
目前经过测试,发现如下问题:
1、单独让核0去接收UDP包是没有问题的;将核1、核2全速跑起来,核0接收程序,这个整个流程只能跑通一次,跑通一次后将核2单步不全速,再让核0接收UDP就不行了,就会出现这个问题
CCS console显示:00000.000 NIMUReceivePacket: Bad Size; Payload is -2147481472 bytes00000.000 PBM_free: Invalid Packet
核0的程序直接跳出接收程序显示
三个核的状态是这样的:
我通过在map文件中查找,发现0x0C064098这个地址对应的是0c064040 00000060: trgmsg.obj (.text:writemsg);我觉得核0并没有跑飞,而是接收到了无效Packet;我认为是因为运行了核2的算法程序之后就将关于NDK的某一块给修改了,所以误让核0错误的认为是接收到了无效Pakect,所以才会出现这个情况。
Andy,对于可能是NDK中的writemsg这个,我没有见过,那个应该是比较底层的东西,你能详细的说明一下么?