2952|0

19

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

CCS+C6678LE开发记录10:(图像)数据处理与传输框架 [复制链接]

探索了这么久也该上一点料,本文关注PC<-->DSP数据处理与传输的简单框架。

这个框架其实也很简单,具体描述如下:

1.PC端通过ETH0发送(图像)数据到DSP

2.DSP收到完整数据后进行处理(Image Processing...)

3.DSP端数据处理完毕后将数据发回给PC

4.PC端收到发回的处理结果,然后保存


下面是一段代码,数据处理执行的操作很简单:对图像像素值取补

newValue=255-oldValue

  1. int udpTransferTask( SOCKET s, UINT32 unused )  
  2. {  
  3.     printf("TASK execution %d\n",++task_counter);  
  4.   
  5.     struct timeval tv;  
  6.     tv.tv_sec  = 1;  
  7.     tv.tv_usec = 0;  
  8.     setsockopt(s,SOL_SOCKET,SO_SNDTIMEO,&tv,sizeof(tv));  
  9.     setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv));  
  10.   
  11.     struct sockaddr_in sin1;  
  12.     int sz=sizeof(sin1);  
  13.     int hlen=strlen(reply);  
  14.     int nr,total=0;  
  15.     HANDLE hBuffer=NULL;  
  16.     unsigned char* pBuf=NULL;  
  17.   
  18.     int width,height,size;  
  19.     int i,n=sizeof(int);  
  20.     unsigned char* ptr=NULL;  
  21.   
  22.     // Image width  
  23.     recvncfrom( s, (void**)&pBuf, 0, (PSA)&sin1, &sz, &hBuffer );  
  24.     recvncfree( hBuffer );  
  25.     ptr=(unsigned char*)&width;  
  26.     for(i=0;i<n;++i) ptr[i]=pBuf[i];  
  27.   
  28.     // Image height  
  29.     recvncfrom( s, (void**)&pBuf, 0, (PSA)&sin1, &sz, &hBuffer );  
  30.     recvncfree( hBuffer );  
  31.     ptr=(unsigned char*)&height;  
  32.     for(i=0;i<n;++i) ptr[i]=pBuf[i];  
  33.   
  34.     // Image data size  
  35.     size=width*height;  
  36.   
  37.     printf("Image Size: %d * %d\n",width,height);  
  38.   
  39.     // Data buffer  
  40.     unsigned char* data=(unsigned char*)malloc(size);  
  41.     if(data==NULL)  
  42.     {  
  43.         printf("Failed to allocate memory!\n");  
  44.         return 2;  
  45.     }  
  46.   
  47.     ptr=data;  
  48.     while(1)  
  49.     {  
  50.         nr=recvncfrom( s, (void**)&pBuf, 0, (PSA)&sin1, &sz, &hBuffer );  
  51.         if(nr<=0) break;  
  52.         total+=nr;  
  53.         for(i=0;i<nr;++i)  
  54.         {  
  55.             ptr[i]=pBuf[i];  
  56.         }  
  57.         ptr+=nr;  
  58.         sendto( s, reply, hlen, 0, (PSA)&sin1, sz );  
  59.         recvncfree( hBuffer );  
  60.     }  
  61.   
  62.     if(total!=size)  
  63.     {  
  64.         free(data);  
  65.         size=0;  
  66.         printf("Data transfer is imcomplete!\n");  
  67.         return 1;  
  68.     }  
  69.   
  70.     processDataFrame(data,width,height);  
  71.   
  72.     total=0;  
  73.     int unit=64;  
  74.     int loop=size/unit;  
  75.     int residue=size-loop*unit;  
  76.     pBuf=data;  
  77.     for(i=1;i<=loop;++i)  
  78.     {  
  79.         nr=sendto(s,pBuf,unit,0,(PSA)&sin1, sz);  
  80.         pBuf+=unit;  
  81.         total+=nr;  
  82.     }  
  83.     if(residue>0)  
  84.     {  
  85.         nr=sendto(s,pBuf,residue,0,(PSA)&sin1, sz);  
  86.         total+=nr;  
  87.     }  
  88.     printf("Finished sending back %dB.\n",total);  
  89.   
  90.     free(data);  
  91.     return 1;  
  92. }  
  93.   
  94. void processDataFrame(unsigned char* data,int width,int height)  
  95. {  
  96.     printf("Processing data...");  
  97.     int i, size=width*height;  
  98.     unsigned char tmp;  
  99.     for(i=0;i<size;++i)  
  100.     {  
  101.         tmp=data[i];  
  102.         data[i]=255-tmp;  
  103.     }  
  104.     printf("Finished.\n");  
  105. }  
复制代码

发回数据时建议设置更小的分片大小,这里设置为64字节,实测效果尚可。


可能是因为C6678发送数据的机制不同,发送数据块不能太大,否则接收端不能正常接收。

经过几次测试发现这个示例尚存一些bug,例如发回的数据中明显存在数据失真问题

(原图1920*1080 RGB彩色,处理后为灰度图,下面的截图都缩放至800*450了)


原图(缩小)

结果(缩小)

可以看到很多“条带”,这些都是数据失真,初步估计是DSP处理过程中,发回数据出现问题。

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


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

点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表