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.

dm6446中dsp端计算出来的数据如何反馈给arm端



想请教一个问题。dm6446一般是在arm端开辟一块共享内存,然后传到dsp端进行数据交换。现在想知道,如果在dsp端开辟一块内存,并且在这块内存内放了一堆数据,如何将这些数据反馈给arm端啊。arm端无法事先知道dsp端这块内存的大小,所以无法在arm端先开辟好,然后传到dsp,让dsp填数据。有没有什么法子?在dsp端是否也可以开辟一块共享buf,然后传回给arm,如果可以的话,用什么函数啊?急盼回复,谢谢!

  • 你好,

    现在ARM侧开一块小buffer A,和DSP共享,当DSP这里的buffer B信息确定后,DSP在buffer A里面填入buffer B的大小和起始地址,然后中断ARM。ARM收到中断后从buffer A里面读取相关信息。

    注意DSP侧DDR地址是物理地址,ARM侧是虚拟地址,需要转换。

  •  谢谢您的回复!!

    我还是有点不太明白,按照你的文字,我写了如下一段说明程序,具体:

     

    1. 在arm端定义buffA的大小,以及开辟一块小内存

    buffA_size = 2; //很小的一块buff,2个int型,其中第一个用于装DSP端的开辟buffB 的size大小,第二个装buffB的地址

    buffA = (int *)Memory_contigAlloc(buffA_size, Memory_DEFAULTALIGNMENT);

     

    2. 把开辟的buffA赋给ARM端的另一个函数,这个函数与DSP端函数对接。

     

    //定义输入和输出变量

    XDM_BufDesc      encodedBufDesc;

    XDM_BufDesc      outBufDesc;

     

    XDAS_Int8*       encodedBufs    [ XDM_MAX_IO_BUFFERS ];

    XDAS_Int32       encodedBufSizes[ XDM_MAX_IO_BUFFERS ];

    XDAS_Int8*       outBufs        [ XDM_MAX_IO_BUFFERS ];

    XDAS_Int32       outBufSizes    [ XDM_MAX_IO_BUFFERS ];

     

     

     

    encodedBufs[0]      = encodedBuf; //此处的encodedBuf在别处开辟的,作为dsp端的视频输入

    encodedBufSizes[0]  = encodedBufSize;

    encodedBufs[1]      = buffA;//刚才开辟的buffA

    encodedBufSizes[1]  = buffA_size;//刚开辟buffA的size大小

     

    outBufs[0]          = outBuf;//此处outBuf在别处开辟,作为视频输出buff,作为显示用

    outBufSizes[0]      = outBufSize;

     .....

     

     

    //赋值给encodedBufDesc和outBufDesc

    encodedBufDesc.numBufs  = 2;   //2块buff,其中一块是刚才开辟的

    encodedBufDesc.bufs     = encodedBufs;

    encodedBufDesc.bufSizes = encodedBufSizes;

     

    outBufDesc.numBufs      = 1;

    outBufDesc.bufs         = outBufs;

    outBufDesc.bufSizes     = outBufSizes;

     

     

    //dsp端的接口函数,我的理解通过这个函数,arm端开辟的内存传递到dsp端。

    status = VIDDEC_process(decHandle, &encodedBufDesc, &outBufDesc,&decoderInArgs, &decoderOutArgs);

     

     

    3. dsp端开辟buffB

     

    //与arm端VIDDEC_process对接的函数

     

    XDAS_Int32 MYDEC_process(IVIDDEC_Handle h, XDM_BufDesc *inBufs, XDM_BufDesc *outBufs, IVIDDEC_InArgs *inArgs, IVIDDEC_OutArgs *outArgs)

    {

     

       //开辟一块内存

        int buffB_size;

        int *pBuff;

        unsigned char *buffB = NULL;

     

        //计算buffB_size,

        buffB_size = CalcuMemorySize();

        // 按照这个计算的buffB_size,开辟buffB

        buffB = (unsigned char*) malloc(buffB_size * sizeof(unsigned char));

        // buffB传给计算数据函数,并存放计算结果

        CalculateProcessingData((unsigned char*)inBufs->buf[0], buffB);

     

     

        //根据你的意思,我的理解是:把buffB_size和buffB付给arm端传过来的inBufs->bufs[1]

        pBuff = (int*) inBufs->bufs[1];//把inBufs->bufs[1]强制转换成int*型,因为arm分配的buffA是int型

        // 赋值

        pBuff[0] = buffB_size; // arm端传过来的buffA,buffA[0]存放buffB的大小,即buffA[0] = buffB_size

        pBuff[1] = (int)&buffB[0]; // arm端传过来的buffA,buffA[1]存放buffB的初始地址,即buffA[1] = &buffB[0]

     

    }

     

    4. arm端拿取dsp端buffB的数据

     

    //以下代码与步骤2中类似

     

     

    //定义输入和输出变量

    XDM_BufDesc      encodedBufDesc;

    XDM_BufDesc      outBufDesc;

     

    XDAS_Int8*       encodedBufs    [ XDM_MAX_IO_BUFFERS ];

    XDAS_Int32       encodedBufSizes[ XDM_MAX_IO_BUFFERS ];

    XDAS_Int8*       outBufs        [ XDM_MAX_IO_BUFFERS ];

    XDAS_Int32       outBufSizes    [ XDM_MAX_IO_BUFFERS ];

     

    unsigned char *pBuff;//用与读取buffA中数据,其中buffA[1]装载dsp端buffB的首地址。

     

    encodedBufs[0]      = encodedBuf; //此处的encodedBuf在别处开辟的,作为dsp端的视频输入

    encodedBufSizes[0]  = encodedBufSize;

    encodedBufs[1]      = buffA;//刚才开辟的buffA

    encodedBufSizes[1]  = buffA_size;//刚开辟buffA的size大小

     

    outBufs[0]          = outBuf;//此处outBuf在别处开辟,作为视频输出buff,作为显示用

    outBufSizes[0]      = outBufSize;

     .....

     

     

    //赋值给encodedBufDesc和outBufDesc

    encodedBufDesc.numBufs  = 2;   //2块buff,其中一块是刚才开辟的

    encodedBufDesc.bufs     = encodedBufs;

    encodedBufDesc.bufSizes = encodedBufSizes;

     

    outBufDesc.numBufs      = 1;

    outBufDesc.bufs         = outBufs;

    outBufDesc.bufSizes     = outBufSizes;

     

     

    // VIDDEC_process调用前,状态和步骤2一样

    status = VIDDEC_process(decHandle, &encodedBufDesc, &outBufDesc,&decoderInArgs, &decoderOutArgs);

    // VIDDEC_process调用后,是否通过如下方式就可以读取buffA中的数据,即DSP端传过来的buffB数据。你的说的地址转换,是怎么转换的啊?知道一个Memory_getPhysicalAddress函数,但是不知用在哪里

    pBuff = (unsigned char*) buffA[1]; //把buffA[1]中的地址取出并付给pBuff指针,即用pBuff指向buffA[1]中的地址。

    // 在ARM端处理pBuff[0],......,pBuff[buffA[0]-1].的数据,即buffB中的数据


    以上红色的字体大致是我想咨询的。不知道的这个理解思路是否正确,麻烦再帮忙看看,万分感谢!

  • 期待解惑啊!

  • andrew1大

    請問您是否已經解決了呢?

    感謝您的分享,謝謝~

    我的QQ是2561605317

  • 不知道这个问题解决了没有,怎么解决的可以说说啊