基于网络的嵌入式IP可视电话设计方案
64算法比H.263算法码流降低了5O ;但同时H.264算法比H.263算法复杂得多,需要更强的处理能力,以及做更多的软件优化工作。H.264算法在DM643上的实现和优化是整个系统软件设计的难点和重点。下面以它为例说明软件的开发、优化工作。
DM643上的软件开发过程可分为3个阶段:
第1阶段是开发C代码,然后使用profiling工具确定代码可能存在的低效率段。为进一步改进代码性能,需进入第2阶段。
第2阶段是优化C代码。利用内联函数、编译器的外壳选项等方法进一步优化C代码。再次使用profiling工具检查其性能,如果代码仍达不到所期望的效果,须进入第3阶段。
第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 次
- 蓝牙无线电调制解调器Siw1701原理与应用(02-19)
- 嵌入式移动数据库的关键技术(03-20)
- 在嵌入式SQL中怎样使用游标(08-12)
- 嵌入式Linux系统软件开发学习思路详细介绍 (08-20)
- 基于AVR单片机的嵌入式“瘦服务器”系统设计思想(03-11)
- 嵌入式系统设计中的存储碎片收集策略(05-04)