想请教一个问题。dm6446一般是在arm端开辟一块共享内存,然后传到dsp端进行数据交换。现在想知道,如果在dsp端开辟一块内存,并且在这块内存内放了一堆数据,如何将这些数据反馈给arm端啊。arm端无法事先知道dsp端这块内存的大小,所以无法在arm端先开辟好,然后传到dsp,让dsp填数据。有没有什么法子?在dsp端是否也可以开辟一块共享buf,然后传回给arm,如果可以的话,用什么函数啊?急盼回复,谢谢!
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.
你好,
现在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中的数据
以上红色的字体大致是我想咨询的。不知道的这个理解思路是否正确,麻烦再帮忙看看,万分感谢!