1,开发环境 DM8168, DVRRDK3.5,Ubuntu10.04,板子为公司自己制作的。
2.,运行程序创建的link流程为:
cap(两路)-> merge-> sclr-> nsf-> dup
-> dup [0]-> swms0->display0(HDMI)
-> dup[1] -> swms1->display1(VGA)
-> dup[2] -> ipcFramesOutVpss-> IpcFramesInDsp-> AlgLink(在这里对每一帧图像进行识别处理)
-> dup[3] -> ipcFramesOutVpssToHost-> ipcFramesInHostFrmVpss-> CB(在此回调函数中进行存图处理)
。上述link运行起来是正常的,但是我在ARM端向DSP端发送控制命令时,有时候会出现System_linkControl 被阻塞几十秒钟。当发生阻塞时,如果我拔掉SDI视频源,这时就会跳出阻塞。
以下是我调用此函数的代码:
ret = System_linkControl(SYSTEM_LINK_ID_DSP, SYSTEM_DSP_CMD_ASK_FRAME_DATA, (void *)&buf, sizeof(struct AskData), TRUE);
请朋友们看一下,是否能提供一些建议。
Chris Meng:
你好,
请问是否是你的DSP loading过大,来不及反应ARM的消息?
peng cheng2:
回复 Chris Meng:
非常感谢你的回复。下面是我link创建的代码。ipcFramesOutVpssPrm1.baseCreateParams.inQueParams.prevLinkId = dupId1;ipcFramesOutVpssPrm1.baseCreateParams.inQueParams.prevLinkQueId = 2;ipcFramesOutVpssPrm1.baseCreateParams.inputFrameRate = 25;ipcFramesOutVpssPrm1.baseCreateParams.outputFrameRate = 3; //3ipcFramesOutVpssPrm1.baseCreateParams.notifyPrevLink = TRUE;ipcFramesOutVpssPrm1.baseCreateParams.numOutQue = 1;ipcFramesOutVpssPrm1.baseCreateParams.outQueParams[0].nextLink = ipcFramesInDspId1;ipcFramesOutVpssPrm1.baseCreateParams.notifyNextLink = TRUE;ipcFramesOutVpssPrm1.baseCreateParams.processLink = SYSTEM_LINK_ID_INVALID;ipcFramesOutVpssPrm1.baseCreateParams.notifyProcessLink = FALSE;ipcFramesOutVpssPrm1.baseCreateParams.noNotifyMode = FALSE;ipcFramesInDspPrm1.baseCreateParams.inQueParams.prevLinkId = ipcFramesOutVpssId1;ipcFramesInDspPrm1.baseCreateParams.inQueParams.prevLinkQueId = 0;ipcFramesInDspPrm1.baseCreateParams.numOutQue = 1;ipcFramesInDspPrm1.baseCreateParams.outQueParams[0].nextLink = helloWorldId1;ipcFramesInDspPrm1.baseCreateParams.inputFrameRate = 25;ipcFramesInDspPrm1.baseCreateParams.outputFrameRate = 3;这个是我往dsp里面送的帧率,平均下来,没帧处理时间达到100ms左右。这样来算,应该不会特别卡吧。
Chris Meng:
回复 peng cheng2:
你好,
你是否有具体统计过每次DSP处理的时间?是否有时候时间特别长?
或者你能否把DSP处理修改为什么都不做,看看是否还有类似的问题?
peng cheng2:
回复 Chris Meng:
Meng 专家你好,情况是这样的,我把图像送入dsp处理,有时候单帧的处理时间会达到200-300ms,并且这时会感到display这边视频也会稍微有些卡顿。大多数时候单帧的处理时间是70-90ms,视觉上看不出来display卡顿。
我不往dsp送数据,或者不让dsp对帧进行处理,这样不会产生类似 阻塞 linkControl函数的问题。
dsp高负荷运行时,不会响应arm核心送发送的消息么?
Chris Meng:
回复 peng cheng2:
你好,
你的use case里面一个buffer的数据dup了多份,这个buffer需要在所有dup后面的4个link的处理都完成以后,这个buffer才能还回去。如果DSP某帧处理时间过长,buffer就还不回去了。整个chain就阻塞了。
peng cheng2:
回复 Chris Meng:
chain阻塞这个我了解了。但是chain阻塞会导致 下面函数阻塞么? 如果会阻塞,那么有没有其他办法能即时将消息从arm送到dsp中?谢谢。
ret = System_linkControl(SYSTEM_LINK_ID_DSP, SYSTEM_DSP_CMD_ASK_FRAME_DATA, (void *)&buf, sizeof(struct AskData), TRUE);
Chris Meng:
回复 peng cheng2:
你好,
我理解是消息发出了,但DSP来不及相应,而你的调用的System_linkControl的waitAck=TRUE,你一定需要DSP给ARM相应么?如果不是,能否配置为False?
Hu Yan:
回复 Chris Meng:
您好,Chris 孟,
能否看一下这个关于DM388的问题,非常感谢
http://www.deyisupport.com/question_answer/dsp_arm/davinci_digital_media_processors/f/39/t/99000.aspx
peng cheng2:
回复 Chris Meng:
Meng专家你好,我今天将TRUE改为FALSE测试了一下,程序运行时报了错误:
287023: Assertion @ Line: 465 in links_common/system/system_ipc_msgq.c: FALSE : failed !!
修改成TRUE后就可以正常运行。
有没有办法解决?
Chris Meng:
回复 peng cheng2:
你好,
请问你的这个命令是ARM向DSP拿数据么?
如果是,能否换成DSP向ARM发送new data消息,ARM再去拿数据?