新闻中心

EEPW首页 > 手机与无线通信 > 设计应用 > 基于网络的嵌入式IP可视电话设计方案

基于网络的嵌入式IP可视电话设计方案

作者: 时间:2012-05-15 来源:网络 收藏

第3阶段是编写线性汇编代码 从C代码中抽出对性能影响很大的代码段,用线性汇编重新编写这段代码,然后使用汇编优化器优化该代码。

2.1 C代码的开发和优化

开发过程中要充分利用Tl公司为用户提供的功能强大的函数库,比如IMAGE.LIB库中就包含许多常用函数,可以实现DCT/IDCT变换、DCT量化、自适应滤波等功能。这些函数都是优化过的,完全能够实现软件流水,效率很高。另外,开发C语言代码还需要考虑的要点包括:① 使用适当的数据结构- - 对定点乘法,应尽可能使用short型数据;对循环计数器应使用int或者无符号int 类型。②使用查找表或常数值代替通过直接计算得到结果的语句或函数。

代码分析结果显示DCT、IDCT 、运动估计占程序总运算量的比重很大,因此这部分是程序优化的重点。优化C 代码包括使用编译器选项、使用内联函数、使用软件流水等。

(1)向编译器指明不相关的指令。

为使指令并行操作,编译器必须确定指令间的相关性,只有不相关的指令才可并行执行。若编译器不能确定两条指令是不相关的,则只能安排它们串行执行。用户可通过如下方法指明相关的指令:

①关键字cons t 表示一个变量或一个变量的存储单元保持不变,使用const 可提高代码的性能和适应性。

②使用-mt 选项向编译器说明在代码中不存在存储器相关性,即允许编译器在无存储器相关性的假设下进行优化。

(2)使用内联函数(intrinsics)。

可用内联函数快速优化C 代码。如在算术操作中,常对计算的结果做饱和(saturation)处理,使用intrinsics只须调用SADD, 一个指令周期便可得到最终结果。比花费两个嵌套的条件判断语句来判断结果是否溢出,最后得到结果效率要高得多。

(3)使用软件流水。

在编译时,使用-o2 选项和-o3 选项,编译器可对循环代码实现软件流水。为填满软件流水线,软件流水结构需要执行的最小循环迭代次数称为最小循环次数。循环总数小于最小循环次数时,执行不流水形式循环; 循环总数大于最小循环次数时,执行软件流水形式循环。可以使用-ms 选项,使编译器根据循环次数仅产生一种循环形式; 可使用-o3 和-pm 选项,使优化器访问整个程序,了解循环次数信息; 使用-nassert 内联函数,防止冗余循环产生;使用-mh 选项,消除软件流水循环的排空,从而减小代码尺寸。

由于在嵌套循环中编译器仅对最里面的循环执行软件流水,因此对于执行周期很少的内循环进行循环展开,对外循环进行软件流水。

使用软件流水应当注意的问题: 尽管软件流水循环可以包含内联函数,但不能包含函数调用; 在循环中不使用break 语句; 循环控制变量不能与循环体内的语句有关; 如果循环体内复杂的条件代码需要超过5 个条件寄存器或者32 个以上寄存器,则这个循环不可进行软件流水。

(4)片内存储器的分配及DMA技术的运用。

DM643 内部有16 KB 的一级程序缓存、16 KB 的一级数据缓存和256 KB 的程序数据共享二级缓存,远小于执行程序和待处理图像数据,不可能将程序和图像数据都在片内RAM 中缓存,因此合理地配置和使用存储空间,对系统整体效率影响很大。

提高算法程序执行速度的关键是使核心循环代码和要访问的数据在第1 次访问之后全部发生L1P 和L1D 命中。核心循环代码占的空间很小,执行过一次之后,完全可以全部在L1P 中缓存,因此,不用考虑代码如何在存储器中存放,主要问题是图像数据的存放。

由于L1D 采取LRU (Least Recently Used)分配机制,因此对于小于等于16 KB 的连续存放的数据块可完全在L1D 中命中。以解码过程为例,IDCT 和运动补偿模块都是以宏块为单位进行运算的,IDCT 数据类型为short型,运动补偿中的预测帧和当前帧的数据类型为unsignedchar 型。计算一个宏块(420 格式)的IDCT 和运动补偿要访问的数据大小共需1 536 字节,运动补偿的数据包括预测宏块和当前宏块的数据,实际解码中以6 个宏块(10 KB)作为1 次处理对象。待处理的数据要从外部存储器搬到L2 中连续的存储空间,可利用EDMA 与CPU 并行工作的特点,采取Ping??Pong 技术,使CPU 在处理Ping空间数据的同时,由EDMA 将下次要处理的数据搬到Pong 空间中; 当CPU 处理Pong 空间数据时,再由EDMA将Ping 空间已处理好的数据搬回外部存储器,并将下次要处理的数据搬到Ping 空间,这样就可达到CPU 的最大计算能力。Ping、Pong 空间各占用的大小为20 KB, 两个总共约40 KB.L2 中的剩余空间分出64 KB 留给数据空间,用于解码中常用的解码表、量化步长、输入压缩码流缓冲区和输出码流缓冲区等。64 KB 的程序空间用于存储H. 264 算法中的运动预测、运动补偿和中断服务程序等关键代码。L2 其余部分配置为Cache, 操作与L1D 类似。

2. 2 编写线性汇编代码

为了提高代码性能,对影响处理速度的关键C 代码段可以用线性汇编重新编写。线性汇编代码类似于汇编代码,不同的是线性汇编代码中不需要给出汇编代码必须指出的所有信息(如所使用的寄存器、指令的并行与否、指令的延迟周期和指令使用的功能单元等),汇编优化器会根据代码的情况确定这些信息。当然,如果能够事先确定一些信息(如循环的执行次数、存储区的地址等),则编写的线性汇编代码的效率更高。具体的优化措施如下:

①使用伪指令向汇编优化器提供较为详细的信息。

②画出指令的相关图,根据相关图合理分配逻辑单元,最大限度地保证指令的并行执行。

③充分使用C64x DSP 提供的强大包处理指令处理数据(包处理指令可同时处理2 个l6 位数据和4 个8 位数据)。本系统中使用了AVGU4、MIN2、M AX2、SPACKU4、PACK2、D0T P2、D0T PN2 和UNPKLU4 等指令。C64x DSP 还提供了STDW(STNDW)、LDDW(LDNDW)指令,可一次存取连续的64 位数据。可利用LDDW 指令,将作1 次行变换所需数据1 次取来,并将处理后的结果利用STDW 指令一次存好。这样大大缩短了代码长度,提高了代码效率。

④利用Schedule Table 确定循环的重复间隔,合理安排功能单元,进行软件的流水。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)
锁相环相关文章:锁相环原理


评论


相关推荐

技术专区

关闭