当前位置:首页 > 单片机 > 单片机
[导读]本文主要讨论基于TI公司C64系列DSP的视频解码算法在系统优化过程中需要考虑的若干因素。

近年来,对数字视频产品的需求增长迅速。数字视频产品的主流应用包括视频通信、视频监控与工业自动化,最热门的则为娱乐应用,如 DVD、HDTV、卫星电视、标清(SD)或高清(HD)机顶盒、数码相机与HD摄像机、高端显示器(LCD、等离子显示器、DLP)以及个人摄像机等。这些应用对高质量的视频编解码算法及其标准提出更高要求。目前的主流压缩标准主要有MPEG2、MPEG4和H.264/AVC,而针对这些编解码标准有各种各样的实现方案。本文主要讨论基于TI公司C64系列DSP的视频解码算法在系统优化过程中需要考虑的若干因素。

TI的C64系列DSP以其强大的处理能力被广泛用于视频处理领域,但由于使用者对C64系列DSP的结构、指令的理解程度不一样,造成算法的实现效果有许多差异。具体体现在实现算法时所占用的CPU资源上,例如实现H.264 MP@D1解码时所占用CPU的资源将有所差异;或者体现在所包含的算法工具子集上,例如实现H.264 MP@D1解码时使用CAVLC而不是CABAC。

造成这些差异的主要原因有:算法关键模块的优化;算法系统集成时内存的管理;算法系统集成时EDMA的资源分配管理。本文将从这三方面探讨算法优化集成过程中需要考虑的因素。

算法关键模块的优化

一般而言,针对目前主流视频解压缩标准都有非常消耗DSP CPU资源的模块,如H.264/AVC、MPEG4、AVS等编码中的运动矢量搜索就非常占用资源,而且这些模块在整个系统实现过程中还被频繁调用,因此我们应首先找出这些模块。TI的CCS提供了工程剖析工具(Profile),可以很快找到整个工程中占用DSP CPU资源最多的模块,然后对这些模块进行优化。

对这些关键算法模块的优化可以分三步进行。如图1所示,先认真分析这部分代码,并进行相应的调整,例如尽量减少有判断跳转的代码,特别是在for循环中,因为判断跳转会打断软件流水。可以用查表或者用_cmpgtu4、_cmpeq4等Intrinsics来代替比较判断指令,从而巧妙地替代判断跳转语句。同时还可以采用TI的CCS中所提供的#pragma,为编译器提供尽量多的信息。这些信息包括for循环的次数信息、数据对齐信息等。如果经过这部分优化后还无法满足系统要求,则对这部分模块使用线性汇编来实现。

线性汇编是介于C和汇编之间的一种语言实现形式,可以控制指令的使用,而不必特别关心寄存器和功能单元(S、D、M、L)的分配和使用。使用线性汇编一般会比使用C语言具有更高的执行效率。如果线性汇编无法满足要求,则使用汇编实现。为编写高并行、深软件流水的汇编,需要经过创建相关图、时序表(Scheduling table)等步骤,由于篇幅所限,这里就不再讨论。

当运动搜索中需要计算16×16宏块的SAD值时,在不同方式下消耗的DSP CPU的周期数:使用C+Intrinsics需要83个周期,使用线性汇编需要74个周期,而使用汇编只需要57个周期。由此可见,汇编实现所消耗的CPU周期数最少,但前提是要充分了解DSP CPU的结构、指令以及算法模块的结构,以编写出高并行、深软件流水的汇编,否则所写出的汇编有可能还没有线性汇编或者C的效率高。一个行之有效的方法是,充分利用TI所提供的算法库中的函数,因为算法库中的函数都是已经充分优化过的算法模块,而且大都提供对应的C、线性汇编和汇编源代码,并有文档进行API介绍。

点击放大
图1:基于TI DSP的视频算法关键模块的优化步骤(左);图2:基于TI DSP的视频算法的优化集成过程(右)。

算法系统集成时内存的管理

由于在基于DSP的嵌入式系统开发中,存储资源特别是片内高速存储资源有限。在算法系统集成时内存的管理对于整个系统的优化非常重要,它一方面将影响数据的读取、搬移速度;另一方面还将影响缓存的命中率。下面从程序和数据两方面进行分析。

程序区:最大原则是将经常调度使用的算法模块放片内。为达到这一目标,TI的CCS中提供了#pragma CODE_SECTION,可以把需要单独控制存放的函数段从.text段中独立出来,从而在.cmd文件中对这些函数段进行单独物理地址映射。还可以使用动态控制的方式,将需要运行的代码段先调度到片内内存中。例如,H.264/AVC中CAVLC和CABAC两个算法模块具有互斥性,可以将这两个算法模块放在片外,且对应于片内同一块运行区,在运行其中某一个算法模块之前,先将其调入片内,从而充分利用片内有限的高速存储区。

对于程序区的管理,考虑到一级程序缓存(L1 P)的命中率,最好将具有先后执行顺序的函数按地址先后顺序配置在程序空间中,同时将代码量比较大的处理函数拆分成小函数。

数据区:在视频标准编解码中,由于数据块都很大,比如一帧D1 4:2:0的图像有622KB,而且在编解码中都需要3~5帧甚至更多的缓冲帧,所以数据基本上无法在片内存放。因此,在系统的内存优化管理中,需要用到C64系列DSP的二级缓存(对TMS320DM642来说,用于视频编解码的二级缓存采用64KB的情况比较多)。此外,最好将放在片外、被缓存所映射的视频缓冲区的数据以128字节对齐,这是因为C64系列DSP的二级缓存的每行大小为128字节,以128字节对齐有利于缓存的刷新和一致性维护。

系统使用EDMA的情况以及需占用EDMA物理总线的时间。

算法系统集成时EDMA的资源分配管理

由于在视频处理中,经常有块数据的搬移,而且C64系列DSP提供了EDMA,逻辑上有64个通道,因此对EDMA的配置使用对优化系统是非常重要的。可以使用下述步骤充分配置系统的EDMA资源。

1. 统计系统中需要使用EDMA的各种情况及其需要占用EDMA物理总线的大概时间,如表所示。该表给出的数据适合以下条件:视频通过视频端口(720×480,4:2:0,30帧/秒),音频通过McBSP(采样率为44k)进入DSP,压缩后的数据数率在2Mbps左右,数据通过PCI每488us输出一个128字节的包(PCI口工作频率为33MHz),外置SDRAM的时钟频率为133MHz。

2. 统计好这些信息后,需要根据系统对各种码流实时性及其传输数据块大小,对各个被使用的EDMA通道进行优先级分配。一般而言,音频流传输块小,占用EDMA总线的时间短,而视频传输块比较大,在占用EDMA总线的时间较长,因此将输入音频所对应的EDMA通道的优先级设定为Q0(紧急),视频所对应的优先级设定为Q2(中等),输出码流所对应的优先级设定为Q1(高),音视频算法处理中所调度的QDMA的优先级设定为Q3(低)。当然,在真正的系统应用中,可能还需要调节这些设置。

实际上,基于TI DSP的视频算法的优化集成过程,将根据图2所示的步骤进行。首先初步配置内存,并选择相应编译优化选项,如果编译的结果已经可以达到实时性要求就结束后面的优化,否则开始优化内存和EDMA的配置,从而提高对缓存和内部总线的利用率。如果还无法达到要求,则通过剖析整个工程确定消耗CPU资源最高的代码段或者函数,对这些关键模块进行优化,并采用线性汇编、甚至汇编直到整个系统满足要求为止。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭