前言:这篇学习笔记记录了在DSP上实现简单图像处理算法的image_processing例程。该例程在CCS安装时安装在目录下,主要实现了对图像的分割、灰度处理以及边缘检测。学会了调用和修改DSP例程以及图像处理基本程序框架。
1)打开CCS,import工程,目录为MCSDK\demos\image_processing,导入CCS中。注意目录下有好几个工程,我们选择serial版本的,只在一个核上实现bmp图像读取和简单处理。其他版本以后慢慢研究。
2)首先要检查include文件链接是否正确,所有文件是否都读取成功,读取失败会灰色显示。这里需要特别说明一下,图像处理工程用到了C6678的image.lib,所以必须要添加进来。添加include链接的方法为:选中工程,右键properties-build-C6000 compiler-include options,点加号就可以添加目录了。
3)images文件夹里放需要处理的图片,以及存放处理完成以后的结果图片。inc是用户自定义的.h文件,用来定义变量和函数。src文件夹里是用户写的函数,包括main函数。后面附各函数的简要说明。
4)添加目标文件,如helloworld一样,添加一个目标文件ccxml。
5)修改cmd文件,由于例程自带的cmd文件是用DDR3的,要针对自己的板卡做相应修改,我的板卡只有板上内存可以用,于是修改cmd文件。cmd文件修改见hello world。
6)关于内存使用特别说明:例程自带图片为618K,测试2M以下内存处理图片时会报错,显示无法为图片处理过程中的某些环节数据创建内存。修改section左右字段都在SHRAM(4M)后,问题依然存在,后研究发现分配内存是在heap内分配的(malloc函数在heap上分配连续的内存),故必须用-heap关键字分配出2M以上内存以供使用,故本例中用了3M。
7)程序读取和处理BMP图片格式有严格要求,必须为8bit或者24bit。我用美图秀秀处理之后的图片格式为32bit,无法处理。最后发现PS和画图制作的图片均为标准24bit的,可以应用,但由于本例仿真时是通过JTAG读写图像数据的,速度极慢,所以原则上图像大小不要太大,500K以下为好。
8)debug时选择一个核即可,我选了C6678_6第7个核,没有为什么,我愿意而已。处理结果如下图所示:
9)部分代码分析:
main函数里主要完成打开图片文件(fopen),读取图像数据(fread),调用图像处理函数(mc_process_bmp(edge_detection,&raw_image, &out_raw_image, 8, &processing_time);),将处理完的图像出具写入新文件(fwrite)。处理完的数据存放在raw_image.data中。
mc_process_bmp 图像处理
bmp_read_header 读取图像header程序,用以得到图像数据帧头
mc_fill_slice_info 将图像分割为8片处理
process_rgb_image 处理rgb图像算法
convert_rgb_to_Y rgb转YUV函数
write_gray_bmpfile 得到一个灰度图像数据
10)get的其他调试技巧
读取程序运行时间有两种办法:
a.直接在CCS里看:ccs-run-clock-show,可以在正下方显示当前clock数,enable之后开始计数,disable之后停止,可以看到一共有多少个clock,在知道DSP工作时钟的前提下可以得到运行的时间:time = clockNUM/f(频率)。
b.编程实现:应用DSP的定时器,向工程里添加tsc_h.asm文件,在程序里定义和调用相关函数即可实现计时。
void TSC_enable();
unsigned long long TSC_read();
double processingTime;
unsigned long long timer0, timer1;
TSC_enable();
timer0 =TSC_read();
timer1= TSC_read();
processingTime += (double)(timer1 - timer0)/1000000.0;
printf("Processingtime: size: %f ms\n", processingTime);