1、第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.1 图像格式介绍图像格式介绍6.2 RGB与与YCrCb颜色模型颜色模型6.3 RGB2YCrCb算法设计实验算法设计实验6.4 DCT算法设计实验算法设计实验6.5 单核执行图像处理算法以及时间测量单核执行图像处理算法以及时间测量6.6 多核执行图像处理算法以及时间测量多核执行图像处理算法以及时间测量6.7 本章小结本章小结 第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.1.1 BMP图片格式图片格式BMP(Bitmap)是Windows操作系统中的标准图像文件格式,能被多种Windows应用程序支持。其特点在于包
2、含的图像信息较为丰富,几乎不进行任何压缩,这点恰为后期的软件算法开发所充分利用。图6.1.1是名为“image01.bmp”的图片使用UltraEdit软件打开后的效果图。6.1 图像格式介绍图像格式介绍第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.1.1 image01.bmp采用UltraEdit打开后的效果图第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.1.2 JPEG图片格式图片格式JPEG(Joint Photographic Experts Group,联合图像专家组),是最常用的图像文件格式,也是一种有损压缩格式,能够将图像压缩在很小的存储空间,
3、图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。如果使用过高的压缩比例,将使最终解压缩后恢复的图像质量明显降低,如果追求高品质图像,就不宜采用过高压缩比例。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.2.1 RGB颜色模型颜色模型RGB(Red,Green,Blue)模型也称为加色法混色模型,它是以RGB三色光互相叠加来实现混色的方法,颜色模型如图6.2.1所示,适合于显示器等发光体的显示。其配色方程可以描述为F(物体颜色)=R(红色的百分比)+G(绿色的百分比)+B(蓝色的百分比)6.2 RGB与与YCrCb颜色模型颜色模型第第6章章 多核嵌入式系统软件开发多
4、核嵌入式系统软件开发 图6.2.1 RGB混色原理第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.2.2 YCrCb颜色模型颜色模型YCrCb模型与YIQ、YUV模型同为视频显示设备中常用的三种彩色空间。尤其分量视频的国际标准ITU-R BT.601-4使用的是YCrCb彩色空间,用于JPEG图像和MPEG视频压缩,也用于传输高质量的彩色视频信号。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.3.1 在双核通信系统上添加软件应用在双核通信系统上添加软件应用在双核通信系统上添加软件应用的具体步骤如下:(1)利用Software Add Software Applic
5、ation Project为基于Shared Memory机制的通信系统添加应用程序,也可以直接修改原工程上的shm.c文件,援用之前在MB0与MB1上的shm_on0和shm1工程。(2)援用原工程的方案,双击Project:shm_on0的Sources下的shm.c文件,如图6.3.1所示,直接对源文件做出设计和修改。6.3 RGB2YCrCb算法设计实验算法设计实验第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.3.1 双击Sources下的shm.c源文件第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.3.2 重要宏定义、数据结构设计重要宏定义、数据结构
6、设计重要宏定义、数据结构设计的具体步骤如下:(1)在RGB2YCrCb处理中,涉及到对很多内存地址的操作,下面对这些内存地址进行了预先的宏定义,以便在后续的代码中对内存进行相应的操作。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发(2)在RGB2YCrCb处理中,为了数据处理的中间结果存放,还需要定义很多数组,目的在于作为缓存区存放中间数据,设计如下:signed char pixelmatrixMACRO_BLOCK_SIZEMACRO_BLOCK_SIZE*3;/该二维数组用于存放划分的宏块,其中MACRO_BLOCK_SIZE在头/文件ejpgl.h中定义,如图6.3.2所示。
7、第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.3.2 ejpgl.h头文件的定义第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发(3)为了能够进行RGB2YCrCb处理,需要事先了解读入的BMP格式图片的信息头,故需要设计有关BMP图片信息头的数据结构以及其信息获取函数getbmpheader(),设计如下:int getbmpheader(FILE*file,INFOHEADER*header);/该函数用于读取BMP格式图片的文件头,在第6.1.1节中已经介绍了BMP格式/中前54个字节的意义,分别对应的是14字节的文件头信息块,40字节的图像描/述信息块。第第6
8、章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 Void get_MB(int mb_row,int mb_col,signed char pixelmatrixMICRO_BLOCK_SIZEMICRO_BLOCK_SIZE*3)/每次处理均以宏块作为一个单位,而函数get_MB则主要根据get_bmpheader函/数按行、按列将宏块数据存放于pixelmatrix二维数组中。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 typedef struct unsigned int size;/以字节表示的文件头大小 int width,height;/图像的宽度和高度 unsi
9、gned short int planes;/彩色平面个数 unsigned short int bits;/每像素占用的比特数 unsigned int compression;/压缩类型 unsigned int imagesize;/以字节数表示的图形大小 int xresolution,yresolution;/每米像素数,即水平与垂直分辨率 unsigned int ncolours;/颜色种类个数 unsigned int importantcolours;/重要的颜色数 unsigned char palette1024;/palette 的存储空间 INFOHEADER;第第6
10、章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 typedef struct unsigned int row;/宏块中图像的高度 unsigned int col;/宏块中图像的宽度 BLOCKINFO;第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.3.3 算法设计、编译与部署算法设计、编译与部署算法设计、编译与部署的具体步骤如下:(1)设计RGB2YCrCb的核心代码以及相关辅助函数。shm_write_ycrcb与shm_read_ycrcb函数设计。在介绍核心算法之前,这里先给出shm_write_ycrcb()函数,如图6.3.3所示。该函数主要用来将CPU0进行
11、RGB2YCrCb处理之后的数据写入共享区域中。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.3.3 shm_write_ycrcb函数设计第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 同理,如果有CPU0上的shm_write_ycrcb()函数,就该有对应的CPU1上的shm_read_ycrcb()函数,其定义和设计与写函数类似,如图6.3.4所示。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.3.4 shm_read_ycrcb函数设计第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 shm_clear_core0_to_core
12、1与shm_dump_core0_to_core1函数设计。每一个宏块处理其实分为6个区域,分别为4个Y分量区域、1个Cr分量区域以及1个Cb分量区域。在这里另外构造两个函数shm_clear_core0_to_core1()和shm_dump_core0_to_core1(),分别用于每次宏块处理前后清空6个区域块和每次RGB2YCrCb处理完之后打印出处理后的结果。函数定义如图6.3.5所示。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.3.5 用于清空和显示6块分量区域数据的函数设计第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 RGB2YCrCb核心代码设计
13、。RGB2YCrCb算法的核心部分如图6.3.6所示,主要是基于对一个宏块的处理。对于每个Y、Cr、Cb分量进行对应的RGB2Y、RGB2Cr、RGB2Cb操作,处理完成之后将结果存储至YMatrix、CrMatrix和CbMatrix二维数组中。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.3.6 RGB2YCrCb的函数定义和设计第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 (2)保存修改后的shm.c文件,并对其进行编译,点击按钮。编译中提示的错误可以依赖于本书附带光盘中给出的shm.c工程文件来修改,注意:该源文件用到的诸多头文件,光盘中同样给出了,读者只
14、需要双击Project:shm_on0下的header头文件进行添加,如图6.3.7所示。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.3.7 头文件的添加第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.3.4 下载比特流,配置下载比特流,配置FPGA下载比特流,配置FPGA的具体步骤如下:(1)正确连接好Virtex2Pro开发板,并给板子上电。(2)打开一个超级终端或是PuTTY工具,注意设置匹配的波特率、奇偶校验位以及流控制位等。(3)对于需要运行的应用程序,右键单击选中以初始化内存块。(4)在Device Configuration中点击下载比特流,配置
15、FPGA。(5)终端中显示CPU0处理后的打印结果,如图6.3.8所示。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.3.9所示为CPU1将数据从共享内存中读取出来之后的打印结果。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.3.8 CPU0在将处理结果写入共享内存之前的数据打印第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.3.9 CPU1在将数据从共享区域读出后并打印的结果第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 DCT(Discrete Cosine Transform)变换是视频压缩编解码器中很重要的一部分,被广泛应用
16、于各种视频格式的编码算法中,例如:JPEG、MPEG1、MPEG2、H.264等。DCT变换虽然不能直接降低数据量,但是它可以利用图像的统计特性使得各种降低数据量的方法更为有效。它能把图像的能量集中到少数的几个数据上,在很大程度上消除了数据间的冗余性和相关性。6.4 DCT算法设计实验算法设计实验第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.4.1 在双核通信系统上添加软件应用在双核通信系统上添加软件应用在这里我们不再利用Software Add Software Application Project为MB0和MB1添加新的工程应用,而是直接修改原工程下的shm.c文件。第第
17、6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.4.2 重要宏定义、数据结构设计重要宏定义、数据结构设计在DCT变换中,同样需要对诸多地址进行相应的内存操作,预设如下的宏定义。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.4.3 算法设计、编译与部署算法设计、编译与部署(1)构造相关辅助函数。和RGB2YCrCb算法类似,先构造了两类函数:shm_write_dct、shm_read_dct以及shm_clear_core1_to_core0、shm_dump_core1_to_core0,分别用于读写内存区域中的DCT处理结果,以及清空和打印6块存储区域中的数据信息
18、。函数设计与之前RGB2YCrCb中的类似。其中shm_write_dct函数如图6.4.1所示,其他函数读者可以自行设计,也可以参考RGB2YCrCb中的设计。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.4.1 shm_write_dct算法设计第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发(2)构造DCT核心算法。DCT算法的核心部分如图6.4.2所示。从DCT函数的参数来看,pixels88与主函数调用dct函数时的参数是一致的,分别为YMatrix88、CrMatrix88、CbMatrix88。其中weightsk为权重表,它在mb-weights.h头
19、文件中定义,如图6.4.3所示。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.4.2 DCT核心算法第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.4.3 mb-weights.h头文件第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.4.4 下载比特流,配置下载比特流,配置FPGA下载比特流,配置FPGA的具体步骤如下:(1)正确连接好Virtex2Pro开发板,并给板子上电。(2)打开一个超级终端或是Putty工具,注意设置匹配的波特率、奇偶校验位以及流控制位等。(3)对于需要运行的应用程序,右键单击选中以初始化内存块。(4)在Device C
20、onfiguration中点击,配置FPGA。(5)终端中显示CPU1做DCT处理后的打印结果(未写入共享之前),如图6.4.4所示。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.4.4 CPU1写入共享区域中的DCT处理数据第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.4.5 CPU0从共享区域中读出的DCT处理数据第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.5.1 解析算法执行的流程解析算法执行的流程算法在单核上的执行流程是一个串行过程,描述如下:(1)算法按照宏块顺序往下处理,先处理第一个宏块。(2)对第一个宏块的前4个Y分量进行RG
21、B2YCrCb处理,完成后对YCrCb结果做DCT(YMatrix,color)变换。(3)对第一个宏块的Cr分量进行RGB2YCrCb处理,完成后对YCrCb结果做DCT(CrMatrix,color)变换。6.5 单核执行图像处理算法以及时间测量单核执行图像处理算法以及时间测量 第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发(4)对第一个宏块的Cb分量进行RGB2YCrCb处理,完成后对YCrCb结果做DCT(CbMatrix,color)变换。(5)返回到步骤(1)进行第二个宏块的处理。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.5.2 修改修改shm.c文件
22、文件利用单核系统进行RGB2YCrCb与DCT变换处理时,需要将我们介绍的这两个算法进行整合和移植。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.5.1 单核上执行的C程序代码(1)第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.5.1 单核上执行的C程序代码(2)第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.5.1 单核上执行的C程序代码(3)第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 有兴趣的读者也可以不采用条件编译的方案,重新添加一个软件应用项目或者重新创建一个单核系统。如果是后者的话,建议读者考虑将共享内存换成外部内存D
23、DR,内存控制器换成MPMC试试。本书仅为测试单、双核效率的简单对比,设计之初并未考虑图像处理对内存大小的要求,事实上,从器件表(如图6.5.2所示)可以看出Virtex-II Pro上32bit总线机制中的xps_bram_if_cntlr的大小最大只能设置为64 K。实验中所用到的图像大小也不过是一张8 K的BMP格式图片。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.5.2 各器件上针对BRAM Size的详细设置表第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.5.3 下载比特流,配置下载比特流,配置FPGA下载比特流,配置FPGA的具体步骤如下:(1)
24、正确连接好Virtex2Pro开发板,并给板子上电。(2)打开一个超级终端或是Putty工具,注意设置匹配的波特率、奇偶校验位以及流控制位等。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发(3)对于需要运行的应用程序,右键单击选中以初始化内存块。(4)在Device Configuration中点击下载比特流,配置FPGA。若下载配置过程中遇到错误,则打开etc/download.cmd命令文件,如图6.5.3所示,查看其中的参数设置是否正确,正确的命令行如图6.5.4所示。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.5.3 etc/download.cmd文件位
25、置第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.5.4 etc/download.cmd文件参数修改第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发(5)修改shm.c文件中Trycount值(该值为一幅8 K大小图片进行循环处理的次数),然后重新编译、下载并配置FPGA,统计每次处理完成的时间,填写表6.5.1。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 表表6.5.1 单核处理时间的统计单核处理时间的统计Trycount 10 50 200 1000 单核体系 第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.6.1 解析算法执行的流程解
26、析算法执行的流程其流程图如图6.6.1所示。6.6 多核执行图像处理算法以及时间测量多核执行图像处理算法以及时间测量第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.6.1 双核上算法执行的流程图第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.6.2 修改修改shm.c文件文件shm.c的代码与6.3实验和6.4实验中的代码基本一致,只是多了以trycount为循环处理次数的变量,这里直接给出核心代码,如图6.6.2所示。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.6.2 双核上运行的核心代码(1)第第6章章 多核嵌入式系统软件开发多核嵌入式系统
27、软件开发 图6.6.2 双核上运行的核心代码(2)第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.6.2 双核上运行的核心代码(3)第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 图6.6.2 双核上运行的核心代码(4)第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 6.6.3 下载比特流,配置下载比特流,配置FPGA下载比特流,配置FPGA的具体步骤如下:(1)正确连接好Virtex2Pro开发板,并给板子上电。(2)打开一个超级终端或是Putty工具,注意设置匹配的波特率、奇偶校验位以及流控制位等。(3)对于需要运行的应用程序,右键单击选中以初始化内存块
28、。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发(4)在Device Configuration中点击下载比特流,配置FPGA。(5)修改shm.c文件中的trycount值(该值为一幅8 K大小图片进行循环处理的次数),然后重新编译、下载并配置FPGA,统计每次处理完成的时间,填写表6.6.1。第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 表表6.6.1 多核处理时间的统计多核处理时间的统计Trycount 10 50 200 1000 多核体系 第第6章章 多核嵌入式系统软件开发多核嵌入式系统软件开发 本章在基于Xilinx FPGA的多核嵌入式硬件系统上进行了简单图像处理算法的多核移植,对算法在单核与多核硬件系统上的实现进行了设计和测试。6.7 本本 章章 小小 结结