CCS+C6678LE开发记录10:(图像)数据处理与传输框架

探索了这么久也该上一点料,本文关注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处理过程中,发回数据出现问题。

关于这个问题,稍后会进一步分析。


关于博文开头提到的处理框架,通过这个测试用例可以看出来,基本可行。


本文原创,博文原始地址

http://blog.csdn.net/fengyhack/article/details/43529379

猜你喜欢

转载自blog.csdn.net/von_Ryan_Hack/article/details/43529379
今日推荐