探索了这么久也该上一点料,本文关注PC<-->DSP数据处理与传输的简单框架。
这个框架其实也很简单,具体描述如下:
1.PC端通过ETH0发送(图像)数据到DSP
2.DSP收到完整数据后进行处理(Image Processing...)
3.DSP端数据处理完毕后将数据发回给PC
4.PC端收到发回的处理结果,然后保存
下面是一段代码,数据处理执行的操作很简单:对图像像素值取补
newValue=255-oldValue
int udpTransferTask( SOCKET s, UINT32 unused )
{
printf("TASK execution %d\n",++task_counter);
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
setsockopt(s,SOL_SOCKET,SO_SNDTIMEO,&tv,sizeof(tv));
setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv));
struct sockaddr_in sin1;
int sz=sizeof(sin1);
int hlen=strlen(reply);
int nr,total=0;
HANDLE hBuffer=NULL;
unsigned char* pBuf=NULL;
int width,height,size;
int i,n=sizeof(int);
unsigned char* ptr=NULL;
// Image width
recvncfrom( s, (void**)&pBuf, 0, (PSA)&sin1, &sz, &hBuffer );
recvncfree( hBuffer );
ptr=(unsigned char*)&width;
for(i=0;i<n;++i) ptr[i]=pBuf[i];
// Image height
recvncfrom( s, (void**)&pBuf, 0, (PSA)&sin1, &sz, &hBuffer );
recvncfree( hBuffer );
ptr=(unsigned char*)&height;
for(i=0;i<n;++i) ptr[i]=pBuf[i];
// Image data size
size=width*height;
printf("Image Size: %d * %d\n",width,height);
// Data buffer
unsigned char* data=(unsigned char*)malloc(size);
if(data==NULL)
{
printf("Failed to allocate memory!\n");
return 2;
}
ptr=data;
while(1)
{
nr=recvncfrom( s, (void**)&pBuf, 0, (PSA)&sin1, &sz, &hBuffer );
if(nr<=0) break;
total+=nr;
for(i=0;i<nr;++i)
{
ptr[i]=pBuf[i];
}
ptr+=nr;
sendto( s, reply, hlen, 0, (PSA)&sin1, sz );
recvncfree( hBuffer );
}
if(total!=size)
{
free(data);
size=0;
printf("Data transfer is imcomplete!\n");
return 1;
}
processDataFrame(data,width,height);
total=0;
int unit=64;
int loop=size/unit;
int residue=size-loop*unit;
pBuf=data;
for(i=1;i<=loop;++i)
{
nr=sendto(s,pBuf,unit,0,(PSA)&sin1, sz);
pBuf+=unit;
total+=nr;
}
if(residue>0)
{
nr=sendto(s,pBuf,residue,0,(PSA)&sin1, sz);
total+=nr;
}
printf("Finished sending back %dB.\n",total);
free(data);
return 1;
}
void processDataFrame(unsigned char* data,int width,int height)
{
printf("Processing data...");
int i, size=width*height;
unsigned char tmp;
for(i=0;i<size;++i)
{
tmp=data[i];
data[i]=255-tmp;
}
printf("Finished.\n");
}
发回数据时建议设置更小的分片大小,这里设置为64字节,实测效果尚可。
可能是因为C6678发送数据的机制不同,发送数据块不能太大,否则接收端不能正常接收。
经过几次测试发现这个示例尚存一些bug,例如发回的数据中明显存在数据失真问题
(原图1920*1080 RGB彩色,处理后为灰度图,下面的截图都缩放至800*450了)
原图(缩小)
结果(缩小)
可以看到很多“条带”,这些都是数据失真,初步估计是DSP处理过程中,发回数据出现问题。
关于这个问题,稍后会进一步分析。
关于博文开头提到的处理框架,通过这个测试用例可以看出来,基本可行。
本文原创,博文原始地址