This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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);

请朋友们看一下,是否能提供一些建议。

  • 你好,

    请问是否是你的DSP loading过大,来不及反应ARM的消息?

  • 非常感谢你的回复。下面是我link创建的代码。
    		ipcFramesOutVpssPrm1.baseCreateParams.inQueParams.prevLinkId = dupId1;
    		ipcFramesOutVpssPrm1.baseCreateParams.inQueParams.prevLinkQueId = 2;
    		ipcFramesOutVpssPrm1.baseCreateParams.inputFrameRate = 25;
    		ipcFramesOutVpssPrm1.baseCreateParams.outputFrameRate = 3; //3    	
    		ipcFramesOutVpssPrm1.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左右。这样来算,应该不会特别卡吧。

  • 你好,

    你是否有具体统计过每次DSP处理的时间?是否有时候时间特别长?

    或者你能否把DSP处理修改为什么都不做,看看是否还有类似的问题?

  • Meng 专家你好,情况是这样的,我把图像送入dsp处理,有时候单帧的处理时间会达到200-300ms,并且这时会感到display这边视频也会稍微有些卡顿。大多数时候单帧的处理时间是70-90ms,视觉上看不出来display卡顿。

    我不往dsp送数据,或者不让dsp对帧进行处理,这样不会产生类似 阻塞 linkControl函数的问题。

    dsp高负荷运行时,不会响应arm核心送发送的消息么?


  • 你好,

    你的use case里面一个buffer的数据dup了多份,这个buffer需要在所有dup后面的4个link的处理都完成以后,这个buffer才能还回去。如果DSP某帧处理时间过长,buffer就还不回去了。整个chain就阻塞了。

  • chain阻塞这个我了解了。但是chain阻塞会导致 下面函数阻塞么? 如果会阻塞,那么有没有其他办法能即时将消息从arm送到dsp中?谢谢。

    ret = System_linkControl(SYSTEM_LINK_ID_DSP,
    SYSTEM_DSP_CMD_ASK_FRAME_DATA,
    (void *)&buf,
    sizeof(struct AskData),
    TRUE);

  • 你好,

    我理解是消息发出了,但DSP来不及相应,而你的调用的System_linkControl的waitAck=TRUE,你一定需要DSP给ARM相应么?如果不是,能否配置为False?     

  • 您好,Chris 孟,

    能否看一下这个关于DM388的问题,非常感谢

    http://www.deyisupport.com/question_answer/dsp_arm/davinci_digital_media_processors/f/39/t/99000.aspx

  • Meng专家你好,我今天将TRUE改为FALSE测试了一下,程序运行时报了错误:

     287023: Assertion @ Line: 465 in links_common/system/system_ipc_msgq.c: FALSE : failed !!

    修改成TRUE后就可以正常运行。

    有没有办法解决?

  • 你好,

    请问你的这个命令是ARM向DSP拿数据么?

    如果是,能否换成DSP向ARM发送new data消息,ARM再去拿数据?

  • 专家你好,这个命令是单向的,从ARM向DSP发送图像处理命令,这个命令只是一个整形数。

    另外,我查了下整个rdk包,System_linkControl 函数几乎上都是用TRUE。我怀疑是不是我的3.5版本的包不支持FALSE参数?

  • 请问meng,dup后面的link怎么样算是处理完了,比如outvpss后进入dsp