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

DM8168中,ARM通过System_linkControl函数发送命令到DSP中,有时候会发生阻塞。

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再去拿数据?

赞(0)
未经允许不得转载:TI中文支持网 » DM8168中,ARM通过System_linkControl函数发送命令到DSP中,有时候会发生阻塞。
分享到: 更多 (0)