




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验基于ESL设计方法的Motion-JPEG视频解码器设计 本实验是在SoCLib仿真平台上完成的。 SoCLib是一个由法国TIMA Lab、Lip6等研究机构与ST Microelectronics等知名企业联合开发的,用于多核SoC系统架构设计的ESL建模仿真平台。SoCLib仿真平台所包含的全部IP模型、工具以及各种文档均遵循GNU Lesser General Public License(LGPL)开源协议,可免费下载使用。本实验参考了法国TIMA Lab用于研究生SoC设计课程的大作业“Integration of a Motion-JPEG Video Decodera practical study”。实验总体目标: 以Motion-JPEG(MJPEG)视频解码算法为应用范例,借助SoCLib建模仿真平台1,通过ESL设计方法,使学生了解并掌握多核SoC(Multi-processor SoC,MPSoC)的系统架构设计与及软件设计方法。实验内容与学时安排:实验分为四个部分,由浅入深,从单核到多核,从单一任务执行到多线程并行执行,涵盖完整的SoC系统架构设计及软件设计过程。实验一 构建基于SoCLib的单核SoC(4学时)l 了解SoCLib电子系统级仿真平台l 学会如何在SoCLib平台上添加新的硬件模块l 编写简单C程序验证所添加的模块的正确性l 在所构建的单核SoC上实现串行MJPEG解码应用,验证所搭建的SoC的正确性实验二 构建基于SoCLib的MPSoC(4学时)l 在单核SoC架构之上添加若干处理器构成MPSoCl 了解基于MPSoC的并行应用设计需求l 完成MJPEG解码的并行程序设计,移植到MPSoC之上,验证MPSoC的正确性l 修改MPSoC中的各种系统参数,比较在不同配置下并行MJPEG的运行性能实验三 系统软件开发 - 嵌入式操作系统及设备驱动设计(4学时)l 了解SoC的软件开发流程l 掌握简单的嵌入式操作系统的工作原理以及设备驱动设计方法l 编写帧缓存(framebuffer)的设备驱动程序l 通过MJPEG应用验证所编写的驱动程序的正确性实验四 面向MJPEG解码的MPSoC系统架构的优化(4学时)l 添加DMA模块l 编写IDCT硬件模块的ESL高抽象层次模型,集成到MPSoC之上l 编写IDCT设备驱动l 通过MJPEG应用验证所优化的MPSoC的正确性实验准备工作:实验环境:Ubuntu 9.04注:其他Linux操作系统也可,但Windows操作系统不可使用实验平台:实验平台下载地址:libtool-1.5下载地址:/software/libtool/实验平台安装与测试:1 对压缩包libtool-1.5解压缩,然后安装libtool2 对压缩包projet_soc解压缩,得到文件夹projet_soc3 设置环境变量SOCLIB_DIR=projet_soc文件夹所在的路径4 在主目录/home下创建一个工程目录,如/home/soclib_exp5 将文件夹projet/TP/TP0/HW复制到所创建的工程目录(注:该文件夹中包含了如图2所示的基于SoCLib构建的单核SoC ESL高层次抽象模型,即硬件部分)6 将文件夹projet/TP/TP0/SW/hello_world复制到所创建的工程目录(注:该文件夹中包含了在单核SoC上需要运行的helloworld测试程序,即软件部分)7 打开Shell控制台,进入projet/TP文件夹,输入source install_env.sh设置系统环境变量8 进入/home/soclib_exp/hello_world文件夹,输入source install.sh configurations/mips运行脚本,然后输入make对软件部分进行编译9 进入/home/soclib_exp/HW文件夹,输入make对硬件部分进行编译10在HW文件夹下,输入ln -s ./hello_world/APP.x11输入./simulation.x -1,若出现如图1所示情况,则表示实验平台安装测试成功注:每次重新启动一次Shell控制台,均要重新运行一下步骤7中的脚本“install_env.sh”。图1 实验平台测试结果实验平台目录结构: 本实验平台projet_soc的目录结构如图2所示。图2 实验平台projet_soc目录结构实验平台projet_soc包含两个子文件夹:PLATFORM和TP。其中PLATFORM为实验平台,TP为4个实验内容。PLATFORM文件夹包含两个子文件夹:l HW_PLATFORM:实验平台的硬件部分,又包含两个子文件夹,SoCLib和utils。SoCLib为本次实验所依赖的SoCLib ESL建模与仿真环境。utils包括了实验所需的工具,如仿真内核Systemcass、调试工具CDB。l SW_PLATFORM:实验平台的软件部分,又包含两个子文件夹,APES和Toolchains。APES包括了本次实验所使用的嵌入式操作系统DNA。Toolchains包括了实验所需的MIPS处理器交叉编译链。TP文件夹包含五个子文件夹和一个脚本文件:l TP0TP2:分别对应了实验一、二、三的相关文件和说明。l vci_idct:对应实验四所需添加的idct模块的程序代码。l docs:包含了实现所需的文档,如CDB文档,VCI协议文档。l install_env.sh:设置各种环境变量的脚本。SoCLib ESL仿真平台及MJPEG解码流程的介绍1 SoCLib平台l SoCLib是一个由法国TIMA Lab、Lip6等研究机构与STMicrelectronics等知名企业联合开发的,用于多核SoC系统架构设计的ESL建模仿真平台。l SoCLib平台提供了用于SoC开发所需的丰富硬件IP模块的高抽象层次模型库,包括:ARM、MIPS、Nios等嵌入式微处理器、总线及片上网络、Cache、主存、各种外设等。所有的硬件IP模块均采用C+以及SystemC进行建模。此外SoCLib平台还提供了多个嵌入式操作系统和用于进行系统调试、监控、设计空间探测的工具。l SoCLib平台所提供的硬件IP模块均具有两种抽象层次模型,分别是:CABA(Cycle Accurate Bit Accurate)模型和TLM-DT(Transaction Level Modeling with Distributed Time)模型。l SoCLib平台所提供的各种IP模块的高抽象层次模型均采用VISA组织(Virtual Socket Interface Alliance)的IP标准化接口VCI(Virtual Component Interface)进行封装,大大增加了IP模块的可复用性,可与任意的总线及片上网络协议进行互连。 l SoCLib平台所提供的所有模型以及工具均遵循LGPL开源协议,设计者可免费获取并根据设计需求对其进行修改、裁剪与扩充。更多关于SoCLib的细节,可浏览SoCLib主页进行了解与学习。主页地址:www. soclib.fr2 Motion-JPEG解码流程Motion-JPEG是一种视频压缩编码格式,由一组连续的采用JPEG标准进行压缩的图像组成。由于相比其他视频格式占用相对较少的存储空间,因此MJPEG目前已被数码照相机、便携式摄像机广泛采用,用于视频短片的编码。在MJPEG中,每幅视频帧被单独捕获,并采用JPEG算法进行压缩。JPEG是由联合图像专家组(Joint Photographic Experts Group)提出的有损图像压缩算法2,使用有损压缩算法压缩所得图像质量将低于原始图像质量。但采用JPEG算法压缩的图像,其质量损失使用肉眼几乎无法识别,并能获得较高压缩比。JPEG压缩算法将图像分割为以88个像素为单位的像素块,然后将每个像素块从时域转换到频域之上,采用滤波器去除高频分量,最后使用哈夫曼编码方法将像素块编码二进制码流。每个88的像素块称为宏块单元(MacroBlock Unit,MCU)。压缩的码流由一系列原始二进制数串组成,并使用标记进行分割。MJPEG的解码流程如图3所示。这个解码流程分为:哈夫曼解码(Huffman Decoding)、反锯齿扫描(Inverse Zigzag Scan)、反量化(Inverse Quantification)、块重排(Block Reordering)、反离散余弦变换(Inverse Discrete Cosine Transform,IDCT)五部分。 图3 MJPEG解码流程实验一 构建基于SoCLib的单核SoC实验目的与内容:1 了解SoCLib平台工作原理。2 掌握如何利用SoCLib定义一个单核SoC硬件平台,如何在该SoC平台之上添加其他硬件设备。3 学习如何编写简单C程序以控制各种硬件设备。4 在所定义的单核SoC上运行串行的Motion-JPEG程序。5 分析MJPEG解码每部分在单核上运行所需要的时间,思考对该算法进行并行化。实验步骤:1 首先,利用实验平台所提供的一个最基本的单核SoC熟悉SoCLib的工作原理。如图4所示,该单核SoC硬件平台由一个MIPS R3000处理器,一个存储器以及一个显示终端TTY组成。这些硬件设备通过片上网络Generic Micronetwork(GMN)进行互连。图4 基本单核SoC硬件平台2 该基本单核SoC基于SoCLib实现的顶层文件top.cpp位于/projet_soc/TP/TP0/HW下。建议学生仔细阅读该顶层文件,了解如何通过该文件利用SoCLib所提供的各种ESL模型组件搭建SoC验证平台,如何定义声明各种设备模块以及各设备模块之间如何连接。3 在熟悉SoCLib工作原理和顶层文件top.cpp的组织形式后,在图5所示的单核SoC平台之上添加定时器VCI_TIMER、文件系统VCI_FDACCESS、帧缓存VCI_FRAMEBUFFER以及同步锁VCI_LOCKS等设备模块,修改后的单核SoC平台如图3所示。图5 修改后的单核SoC硬件平台 基于SoCLib添加各个设备模块时,应重点检查以下几个方面:l 设备模块与各种信号的声明是否正确?l 设备模块的初始化及各种参数的设置是否正确?l 各设备模块与互连网络及模块间信号的连接是否正确?l 各设备模块的内存映射(Memory Mapping)地址的设置是否正确?l 与互连网络连接的主设备、从设备数目设置是否正确?注意:使用SoCLib,每添加一个设备模块都会遇到上述问题,因此应该特别注意。4 编写简单的C程序,控制所添加的各种设备模块的功能,以验证SoC系统各设备工作的正确性。如何添加各设备模块以及如何使用请参见SoCLib主页中的相关信息:VCI_TIMER:http:/www.soclib.fr/trac/dev/wiki/Component/VciMultiTimerVCI_FDACCESS:http:/www.soclib.fr/trac/dev/wiki/Component/VciFdAccessVCI_FRAMEBUFFER:http:/www.soclib.fr/trac/dev/wiki/Component/VciFrameBufferVCI_LOCKS:http:/www.soclib.fr/trac/dev/wiki/Component/VciLocks5 对位于/projet_soc/TP/TP0/SW/mjpeg_seq文件夹下的MJPEG串行程序使用MIPS交叉编译器进行编译,移植到图3所示的单核SoCLib平台之上。6 熟悉MJEPG的算法流程,思考该算法任务的并行性,通过仿真统计各子程序所用的时间,考虑如何进行架构改进及软/硬件划分。建议利用TIMER模块,统计MJPEG串行程序每部分在MIPS3000上运行所需要的时间。文件project_soc/TP/TP0_CORRECTION是第一个实验的正确结果,可参考。下面是如何在TP0框架上添加TIMER、FDACCESS、LOCKS、FRAMEBUFFER四个模块的例子,供参考。(一) 硬件部分(In your working directory:/projet_soc/TP/TP0/HW)1. top.cpp1)添加头文件:#include vci_locks.h#include vci_timer.h#include vci_fd_access.h#include vci_framebuffer.h2)设置宏定义,关于fbuffer的:#define FBUFFER_WIDTH 256 #define FBUFFER_HEIGHT 1443)修改Mapping table:可将reset excep text data 段最后一个参数改为true,将提高速度。maptab.add(Segment(reset, RESET_BASE, RESET_SIZE, IntTab(1), true); maptab.add(Segment(excep, EXCEP_BASE, EXCEP_SIZE, IntTab(1), true); maptab.add(Segment(text , TEXT_BASE , TEXT_SIZE , IntTab(1), true); maptab.add(Segment(data , DATA_BASE , DATA_SIZE , IntTab(1), true);并添加到Mapping table中,下面参数的意义分别是:名称,基地址,大小,索引,是否可缓存。maptab.add(Segment(semlocks_seg, SEMLOCKS_BASE, SEMLOCKS_SIZE, IntTab(3), false);maptab.add(Segment(timer, TIMER_BASE, TIMER_SIZE, IntTab(4), false);maptab.add(Segment(fd_access, FD_ACCESS_BASE, FD_ACCESS_SIZE, IntTab(5), false);maptab.add(Segment(frame_buffer, FBUFFER_BASE, FBUFFER_SIZE, IntTab(6), false);4)添加Components,修改参数:soclib:caba:VciVgmn vgmn(vgmn,maptab, 3, 7, 2, 8);其中3和7与总线上挂的设备有关。各个函数参数个数及意义不同,须参照函数定义,www.soclib.fr中有具体定义。soclib:caba:VciLocks semlocks(semlocks, IntTab(3), maptab);soclib:caba:VciTimer timer(timer, IntTab(4), maptab, 1);soclib:caba:VciFdAccess fd_access(fdaccess, maptab, IntTab(2), IntTab(5);soclib:caba:VciFrameBuffer fbuffer(fbuffer, IntTab(6), maptab, FBUFFER_WIDTH, FBUFFER_HEIGHT);5)声明Signals添加:sc_signal signal_mips0_it0(signal_mips0_it0);程序漏掉了。locks:soclib:caba:VciSignalssignal_vci_semlocks(signal_vci_semlocks);/声明连接lock的target端口信号timer:soclib:caba:VciSignalssignal_vci_timer(signal_vci_timer);/声明timer的target端口信号sc_signal signal_timer_it(signal_timer_it);/声明timer中断端口信号fd_access:soclib:caba:VciSignalssignal_vci_fd_access(signal_vci_fd_access;/声明连接fd_access的target端口信号soclib:caba:VciSignalssignal_vci_inv_fd_access(signal_vci_inv_fd_access);/声明连接fd_access的initiator端口信号sc_signal signal_fd_access_it(signal_fd_access_it);/声明连接fd_access中断端口信号fbuffer:soclib:caba:VciSignalssignal_vci_fbuffer(signal_vci_fbuffer);/声明fbuffer的target端口信号6)添加Net-List,实现四个组件的相关连接连接总线:vgmn.p_to_initiator2(signal_vci_inv_fd_access);/fd_access是一个控制模块,将其initiator信号一端与总线相连vgmn.p_to_target3(signal_vci_semlocks);/将lock的target信号一端与总线相连vgmn.p_to_target4(signal_vci_timer); /将timer的target信号一端与总线相连vgmn.p_to_target5(signal_vci_fd_access); /fd_access也是一个target模块,将fd_access的target信号一端与总线相连vgmn.p_to_target6(signal_vci_fbuffer); /将fbuffer的target信号一端与总线相连locks:semlocks.p_clk(signal_clk);/连接时钟信号semlocks.p_resetn(signal_resetn);/连接复位信号semlocks.p_vci(signal_vci_semlocks);/ 将lock的target信号另一端与lock模块相连timer:timer.p_clk(signal_clk); /连接时钟信号timer.p_resetn(signal_resetn); /连接复位信号timer.p_vci(signal_vci_timer);/ 将timer的target信号另一端与timer模块相连timer.p_irq0(signal_timer_it);/将timer的中断信号一端与timer模块相连,另一端是挂起的,在此实验中未用到fd_access:fd_access.p_clk(signal_clk); /连接时钟信号fd_access.p_resetn(signal_resetn); /连接复位信号fd_access.p_vci_target(signal_vci_fd_access); / 将fd_access的target信号另一端与fd_access模块相连fd_access.p_vci_initiator(signal_vci_inv_fd_access);/ 将fd_access的initiator信号另一端与fd_access模块相连fd_access.p_irq(signal_fd_access_it); /将fd_access的中断信号一端与fd_access模块相连,另一端是挂起的,在此实验中未用到fbuffer:fbuffer.p_clk(signal_clk); /连接时钟信号fbuffer.p_resetn(signal_resetn); /连接复位信号fbuffer.p_vci(signal_vci_fbuffer);/ 将fbuffer的target信号另一端与fbuffer模块相连(注:原文件中有错误,请将mips0.p_irq0(signal_tty_it)换为:mips0.p_irq0(signal_mips0_it0); )2. segmentation.h将#defineDATA_BASE0x20000000修改为#defineDATA_BASE0x20000000修改segmentation.h文件,添加四个组件的段地址和大小:#define SEMLOCKS_BASE 0xC1000000#define SEMLOCKS_SIZE 0x00000400 / 256 locks#define TIMER_BASE 0xC2000000#define TIMER_SIZE 0x00000100 / 1 seul timer#define FD_ACCESS_BASE 0xC3000000 #define FD_ACCESS_SIZE 0x00001000#define FBUFFER_BASE 0xC4000000#define FBUFFER_SIZE 0x010000003.platform_desc修改platform_desc文件,注册要用到的模块添加下面四行:Uses(vci_timer),Uses(vci_fd_access),Uses(vci_framebuffer),Uses(vci_locks),(二) 软件部分(In your working directory:/projet_soc/TP/TP0/SW)1.fetch.h文件(/SW/mjpeg_seg/headers/fetch.h)1)将movie = fopen (/fd/ - TODO YOUR PATH TO THE IMMAGE - /ice_age_256x144_444.mjpeg, r);路径修改为:movie = fopen ( / fd / home / vlsi / Programfiles / projet_soc / TP / TP0 /SW/mjpeg_seq/images/ice_age_256x144_444.mjpeg, r);2.dispath.c(/SW/mjpeg_seg/sources/dispatch.h)1) 修改timer首地址:将volatile unsigned long int * timer = (unsigned long int *)0x30000000;修改为:volatile unsigned long int * timer = (unsigned long int *)0xC2000000;(因为在segmentation.h中我们定义了timer新的首地址,首地址中存放了记录的数据)。2) 修改memcpy中的首地址:将memcpy ( - TODO HARDWARE ADDRESS OF FRAMEBUFFER -, picture, SOF_section . width * SOF_section . height * 2);修改为:memcpy (void *) 0xC4000000, picture, SOF_section . width * SOF_section . height * 2);(因为在segmentation.h中我们定义了fbuffer新的首地址)3. ldscripts中的mips文件(/SW/mjpeg_seg/ldscripts/mips)1) 将MEMORY中的data : ORIGIN = - TODO -, LENGTH = - TODO 修改为:data : ORIGIN = 0x20000000, LENGTH = 0x01000000(因为在segmentation.h中我们定义了data段的新首地址)2) 将SECTIONS中的“.semram 0x20000000 : ”修改为:“.semram 0xC1000000 : ”3) 将.sdata 0x80000000 : *(.sdata*) *(.scommon*) data :data修改为.sdata 0x20000000 : *(.sdata*) *(.scommon*) data :data。4) 将SECTIONS中的“.sdata 0x20000000 : *(.sdata*) *(.scommon*) data :data”修改为:“.sdata 0xE0000000 : *(.sdata*) *(.scommon*) data :data”。5) 将PLATFORM_CLOCK_BASE = .; LONG(- TODO -)修改为:PLATFORM_CLOCK_BASE = .; LONG(0xC2000000)/timer首地址6) 将_BRIDGEFS_DEVICES = .; LONG(- TODO -)修改为:_BRIDGEFS_DEVICES = .; LONG(0xC3000000)/fd_access基地址注:关于具体的组件函数的相关说明,可以在https:/www.soclib.fr/trac/dev/wiki/TitleIndex网址下查找。(三)修改完文件后的操作步骤:1. 打开Shell控制台,进入projet/TP文件夹,输入source install_env.sh设置系统环境变量2. 进入TP0/SW/mjpeg_seg/文件夹,输入source install.sh configurations/mips运行脚本,然后输入make对软件部分进行编译3. 进入/TP0/HW/件夹,输入make对硬件部分进行编译4. 在HW文件夹下,输入ln -s ./hello_world/APP.x5. 输入./simulation.x -1,若出现下图所示情况,则表示实验一添加模块成功注:每次重新启动一次Shell控制台,均要重新运行一下步骤7中的脚本“install_env.sh”。(四)timer的使用:在SW/mjpeg_seg/sources/dispatch.c中定义了一个函数: unsigned int ElapsedTime (void) /*static clock_t previousTicks=0;double elapsedTimeTicks=0;clock_t endTicks;*/static unsigned long int previous_time = 0;unsigned long int elapsed_time = 0;volatile unsigned long t1 = 0;volatile unsigned long int * timer = (unsigned long int *)0xC2000000;t1 = (unsigned long int ) * timer;elapsed_time = t1 - previous_time;previous_time = t1;/*endTicks=clock();elapsedTimeTicks=(double)(endTicks -previousTicks)/(double)CLOCKS_PER_SEC;printf(n start and end ticks %f; %f n, (double)previousTicks, (double) endTicks);previousTicks=endTicks;printf(elapsed time ticks %.6f n, elapsedTimeTicks);*/return (unsigned long int)elapsed_time / 1000);这就是求时间的函数,如果其它程序中要测时间,可以将次函数直接拷贝过去。其实这个函数的核心就是上面用红色标出的两句。0xC2000000是timer的基地址,它的值就是计数器的值,因此将它的值取出来即可。它记录的是cycle数,一个周期时间是1微妙。实验二 构建基于SoCLib的MPSoC实验目的与内容:1 在实验一所构建的单核SoC的基础上进行扩展,构成可同步处理的MPSoC2 了解同构MPSoC并行处理的软/硬件需求3 将串行的MJPEG程序并行化,并移植到所搭建的MPSoC之上,验证系统的正确性4 修改MPSoC中的各种体系结构参数,分析MJPEG程序的运行性能实验步骤:1 在描述如图5所示的单核SoC的顶层top.cpp文件中,参考MIPS处理器的声明定义方法,再分别添加1-5个MIPS处理器,构成MPSoC。一个双MIPS核的SoC架构如图6所示。图6 双MIPS核SoC硬件平台2 将/project_soc/TP/TP1/SW/mjpeg_mpro文件夹复制到工程目录下,该文件夹中包含了并行化后的MJPEG应用程序。MJPEG并行程序将该应用按如图7所示的方式进行任务划分,并行处理。学习该文件夹中的内容,掌握如何将一个串行的任务并行化、如何采用Posix Pthread多线程编程接口进行并行程序设计、嵌入式操作系统如何将多线程的任务划分到不同处理器进行计算。关于Posix Pthread编程接口的介绍见附录A。图7 MJPEG解码任务的并行化分3 图7中MJPEG解码应用程序被划分为FETCH、COMPUTE、DISPATCH三个子任务。其中,l FETCH主要负责完成MJPEG解码流程中的哈夫曼解码、反锯齿扫描以及反量化。l COMPUTE负责MJPEG解码流程中最为费时的计算任务反离散余弦变换(IDCT)。这部分任务可以并行处理,如图7中虚线所示。根据MPSoC所具有的处理器数目,程序将整个的IDCT计算划分为相应数目的线程,每个处理器负责其中的部分线程,从而实现MJPEG应用进行并行处理l DISPATCH负责接收从不同的COMPUTE任务接收计算完毕的宏块,并对这些宏块进行重新组织排列,最终生成图像帧并传送到帧缓存中。4 修改顶层top.cpp文件,配置不同的MIPS处理器数目。根据处理器数目修改/project_soc/TP/TP1/SW/mjpeg_mpro路径下的ldscript/mips,headers/fetch.h,sources/dispatch.c三个文件中的内容。分析随着处理器数目的变化MJPEG解码应用性能的改变趋势,并总结出现这种变化趋势的原因。上述三个文件的修改内容如下所示: ldscript/mips: 设置处理器的数目: 添加lock地址.semram - TODO : addr of the vcilock component - : PLATFORM_N_MIPSR3000 = .; LONG(- TODO : number of processors -) 设置TIMER的地址:PLATFORM_CLOCK_BASE = .; LONG(- TODO : addr of the timer -)设置TTY的数目的地址:SOCLIB_TTY_NDEV = .; LONG(- TODO : number of TTY -)设置TTY的地址SOCLIB_TTY_DEVICES = .; LONG(- TODO : Addresses must be incremented by 16 -) headers/fetch.h:注:原代码中错误: TODO absolute path to the image是注释,需要加注释符,即:/ TODO absolute path to the image设置MJPEG视频文件“ice_age_256x144_444.mjpeg”所在路径:#define INITIALIZE_MOVIE_DATAmovie = fopen (/fd/ TODO /ice_age_256x144_444.mjpeg, r);#endifHeaders/mjpeg.h修改NB_IDCT的宏定义,如果你想用的是两个线程,在多线程时的创建线程数应该为2. #define NB_IDCT2sources/dispatch.c:设置TIMER的地址:TODO : volatile unsigned long int * timer = (unsigned long int *)0xaddr of the vcitimer;设置Frambuffer的地址:if (LB_X = 0) LB_Y = (LB_Y + YV) % NB_MCU_Y; if (LB_Y = 0) memcpy (void *) TODO Framebuffer address, picture, SOF_section . width * SOF_section . height * 2);5 修改顶层top.cpp文件中GMN与Cache的配置参数。其中,对于GMN可以改变其FIFO深度和传输延迟这两个参数,对于Cache可以修改其分块数目和块大小这两个参数。GMN和Cache在top.cpp中声明及参数的设置如图8所示。根据GMN和Cache的不同配置参数,分析MJPEG解码应用随这些参数变化时性能的改变趋势,并总结出现这种变化趋势的原因。DCACHE块数目GMN: soclib:caba:VciVgmn vgmn(vgmn,maptab, 4, 8, 2, 8);soclib:caba:VciCoherentXCacheDirWt cache0(cache0, maptab, IntTab(0),IntTab(0),CACHE_N_LINE,DATA_BLOCK_SIZE, CACHE_N_LINE, DATA_BLOCK_SIZE);Cache:传输延时FIFO深度ICACHE块数目ICACHE块大小DCACHE块大小图8 GMN和Cache的参数设置实验三 系统软件开发 - 嵌入式操作系统及设备驱动设计实验目的与内容:1 了解SoC的软件开发流程2 进一步深入理解嵌入式操作系统DNA的层次结构与工作原理3 掌握基于嵌入式操作系统DNA硬件抽象层(HARDWARE ABSTRACTION LAYER,HAL)的驱动程序设计方法4 设计新的帧缓存framebuffer驱动程序,替代原驱动中使用内存复制函数memcpy传输图像数据的方法5 在单核SoC上移植MJPEG解码程序,验证所编写驱动程序的正确性实验步骤:1 设备驱动程序的框架位于/projet_soc/TP/TP2/SW/driver文件夹下,嵌入式操作系统DNA的源程序位于/projet_soc/PLATFORM/SW_PLATFOMR/APES/system/ksp/os/dna文件夹下。2 深入理解嵌入式操作系统DNA的层次结构与工作原理,DNA的层次结构如图9所示。DNA是一个四层结构,从上到下依次为:应用层、C运行库层、操作系统层、硬件抽象层。应用层使用C运行库层提供的API编写应用程序,C运行库层使用操作系统层提供的API来访问系统的功能,操作系统层通过硬件抽象层HAL提供的API直接访问处理器及其他外设模块。更多的关于嵌入式操作系统DNA的细节,请参见网址:http:/www.soclib.fr/trac/dev/wiki/Tools/Muteka。图9 嵌入式操作系统DNA层次结构3 掌握基于DNA操作系统的设备驱动程序设计方法。在DNA操作系统中,每个设备的驱动程序首先需要实现设备管理接口(Management Interface)。操作系统DNA启动时所有的设备都必须在管理接口中进行注册加载。因此每一个设备均要在管理接口中声明一个变量modul_t,该变量包含三个元素:该设备的ID、指向设备初始化函数(initialization function)的指针、指向设备清理函数(clean-up function)的指针。综上所述,实现基于DNA操作系统的设备驱动程序的管理接口时,首先需要在dna/headers/modules/modules.h,注册声明该设备,然后分别实现初始化函数init和清理函数cleanup。4 实现设备驱动的管理接口后,还需要实现基于DNA操作系统的设备控制(Control Interface)接口。该接口主要完成与系统底层硬件设备的互操作,需要完成的功能函数包括:l open:应用程序通过fopen函数调用该函数,打开设备文件l read:应用程序通过fread函数调用该函数,访问设备文件,从该设备文件中读取相关数据。l write:应用程序通过fwrite函数调用该函数,将相关数据写入到设备文件。每设计一个设备的驱动程序,均需要实现上述三个功能函数,以完成与低层设备的互操作。在DNA操作系统中,所有的设备均可看成一个文件,通过设备文件系统(device filesystem DevFS)进行管理,因此在应用程序中均可采用访问一般文件的方式访问各种设备,如上所示,大大降低了编程难度。5 复制设备驱动程序框架到工程目录下,编写帧缓存framebuffer的驱动程序,然后将对该设备引用注册到ldscript链接脚本中,将其与MJPEG应用程序一起编译得到可执行文件,验证设备驱动的正确性。注意,在编写设备驱动时,需要使用HAL原语,HAL原语可参见附录B。实验四 面向MJPEG解码的MPSoC系统优化实验目的与内容:1 根据前面实验的结果数据,分析系统的性能瓶颈,找出MJPEG解码过程中最为费时的计算任务以及数据传输任务,优化MPSoC架构,进一步提升系统并行性。2 对MJPEG解码过程中最费时的计算任务,设计硬件加速模块的高抽象层次模型,提升解码速度。3 对于MJPEG解码过程中可并行的数据传输任务,添加DMA模块模型,进一步减轻处理器负担,提升解码速度。4 设计硬件加速模块的驱动程序,并通过MJPEG解码进行验证,优化后的MPSoC是否可实时解码。实验步骤:1 通过前面实验可以注意到即使采用MPSoC仍然无法实现实时解码,分析算法可以得出如下结论:l IDCT是MJPEG解码任务的计算瓶颈,占据了大部分解码时间,是导致MJPEG无法实时解码的主要原因。l 解码完成的视频数据需要由处理器搬运到framebuffer,即处理器不但需要负责MJPEG的解码计算任务,还需负责结果数据搬运,负担过重。因此,解决办法是优化MPSoC架构。设计IDCT专用硬件模块,加快计算速度;添加DMA模块,由DMA负责结果数据的搬运,进一步减轻处理器的任务,使其专注于MJPEG的解码。优化后的MPSoC架构如图10所示:图10 优化后的MPSoC架构2 在图6所示的MPSoC的顶层文件top.cpp中添加DMA模块,该模块的高抽象模型位于实验平台的HW_PLATFORM/SoCLib/soclib/module/infrastructure_component/中,其定义和使用方法可参见网址:http:/www.soclib.fr/trac/dev/wiki/Component/VciDma。添加完成后,通过简单的C程序对DMA模块进行测试,以确保其正常工作。3 设计专用硬件模块IDCT的ESL高抽象层次模型VCI_IDCT。在MJEPG解码中,IDCT采用了Lofflers算法3,该算法仅使用14次乘法操作和26次加法操作即可完成8个点的一维IDCT计算任务,该算法如图11所示,其中的蝶形变换如图12所示。根据该算法设计IDCT专用模块,学生可参考如下论文4中提到的设计方法。图11 Lofflers算法图12 蝶形变换示意图 由于本实验基于SoCLib平台完成,在该平台中所有的IP模块使
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- ARMA-GARCH模型下基于期望分位数的尾部风险预测
- 廉江辅警考试题库2025(有答案)
- 慢性伤口护理及疗效评估查房
- 手术前后的安全护理规范
- 2025年安徽省太和县事业单位公开招聘辅警考试题带答案分析
- 疫苗的使用管理课件
- 工程资料课件
- 二零二五年度居民生活用水合同监督管理协议书
- 二零二五年度搅拌站工程招投标代理合同
- 疫情常规班会课件内容
- T-CATIS 024-2024 再保理、双保理和联合保理业务操作指引
- 2024年江苏省中考语文文言文专项练习
- 2025-2030年碳化硅密封环项目商业计划书
- 2025年专职人员考试试题及答案
- 2025届高考英语高频核心词汇表(词汇+词性)+清单(一)
- 内墙抹灰班组劳务分包合同范本
- 餐饮服务企业各项管理制度体系
- 《吸入装置使用》课件
- 急危重症护理学试题库+答案
- 课件:《科学社会主义概论(第二版)》导论
- 2025门面房购房的合同范本大全
评论
0/150
提交评论