【VC++开源代码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了VC++开源代码-【精品】DM642应用程序移植 - 网络与通信的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
DSP应用程序的移植和软件架构体系 Qianyonganqian88etang.com一.基于X86Pentium4平台的
VC应用程序如何移植到DM642平台?有哪些关键点? .c/.cpp/.asm .c/.cpp/.asm /.lib/.dll…… /.lib/…… 移植 Visual C CCS X86 Platform DM642关键点一:分析并提取
VC应用程序中与 算法相关的
代码 算法移植的第一步就是分析并提取
VC应用程序中与算法相关的
代码并参考
VC应用程序重新建立算法验证的程序框架和测试环境。
void algo_verifyvoid SetupInit AlgoEnv Algorithm CreateInit AlgoObj API while1 Dsp/bios Get InData …… Processed by Algo Output Result 1.创建CCS项目并加入 CDB/Cmd 算法和验证等
代码/库 2.描述并配置CDB验 证平台以及系统环境 Sim/Dm642关键点二:编译器平台相关的基本数据 类型之间的差别: DATA TYPE VCx86 CCSDm642 char 8-bit 8-bit short 16-bit 16-bit int 32-bit 32-bit long 32-bit 40-bit float 32-bit 32-bit double 64-bit 64-bit注:1. CCSDm642体系中,long型数据的取值范围是按40-bit来计算的,而占用的存储空间却是按照64-bit来计算的 2.VCx86体系中定义了bool数据类型它占用8-bitVC5.0 and later;而CCSD m642体系中并未定义bool数据类型,用户使用之前应该自己定义;3.CCSDSP/BIOS系统中也定义适用于不同应用场合的数据类型预定义,具体参见头文件std.h和csl_stdinc.h;关键点三:编译器平台相关的序的
问题 LittleEndian/BigEndian:1. Dm642硬件平台的序是由Dm642芯片复 70 高地址 位时管脚TOUT1/LENDIAN的电平决定 0-BigEndian/1-LittleEndian 1582. CCS编译工程之前,需要手工指定工程的 2316 一编译设置以确定输出的模式Project 3124 BuildOptions Compiler Advanced Endianness和CDB中3. X86硬件平台序的默认设置为BigEndian;
VC编译器的输出默认为BigEndian模式; 3124 2316 BigEndian 158 3124 2316 158 70 LittleEndian 70 低地址关键点四:汇编程序的处理通常在.asm类 文件中 很多被移植的
开源项目中,譬如XvidMpeg4/X264H.264,很多运算量比较集中的函数,譬如FDCT/IDCT/Quant/Dequant/SAD都是使用mmx汇编指令来优化实现的。
mmx指令是依赖于X86平台的,所以在移植的时候要用功能完全等同的C函数来替代,进而做算法的功能验证。
这些汇编函数也是我们以后进行汇编级优化的重点对象.关键点五:二进制库调用的处理.lib/.dll 如果被移植的项目中调用了二进制库.lib/.dll中的函数,那么:1.如果被调用的函数包括在随CCS提供的库中rts.lib,那么无需-修改;例如getchar/printf/fread等待;2.如果被调用的函数不包括在随CCS提供的库中那么根据该函数-的性质加以处理:直接删除/用功能完全等同的C函数来替代.关键点六:存储系统的合理配置 开发
VC应用程序时,程序员无需关心堆heap和栈stack大小的配置,因为它是由操作系统来分配管理的。
而在嵌入式系统的开发中,程序员必须根据系统的需求来合理地配置系统的存储系统。
基于DSP/BIOSA Realtime OS的系统中,程序员必须合理配置如下几个内存块的大小:1系统堆栈--用于C环境的建立、
系统的初始化、中断服务
程序;2任务堆栈--用于任务切换时上下文环境的保存、临时变量;3系统的堆--用于内存的动态分配malloc-free/MEM_alloc-free; 基于实时库main-loop的系统中,程序员必须合理配置如下两个内存块的大小:1系统堆栈--用于C环境的建立、中断服务程序;2系统的堆--用于内存的动态分配malloc-free; 在算法的移植过程中,3显得尤其需要注意,因为它比较隐蔽。
在系统的稳定性测试过程中,1和2显得尤其需要注意,因为它出现比较偶然有时也是必然和隐蔽。
二.系统性能分析:Dm642 vs Pentium4关键点一:工作频率工作频率:Dm642: 600MHZ Pentium4: 2GHZ工作功耗:Dm642: 50W Pentium4的
工作频率远远大于的Dm642工作频率这在一定程度上反应出Pentium4在性能上的强大且必然优势这也是目前很多厂商提高CPU性能的一个途径。
但是由此带来另外一个鲜明的对比-功耗如上,这一点在嵌入式系统开发中也显得至关重要由此引出很多厂商提高CPU性能的另一途径-硬件并行。
Pentium4之所以能工作在如此高的频率,还有一个重要原因是其流水线级数高达2031级,而DM642只有11级。
但由于很难保证流水线中所有的级都处于满负荷的工作状态,所以同频率下超长流水线的工作效率相对要低下一些;…………关键点二:CPU的体系结构Dm642: 多流水线体系结构--超标量体系结构8条;Pentium4:单流水线体系结构; 流水线体系结构的出现,使得CPU在每一个周期尽可能地完成一条指令执行,从而改善了CPU的运行性能。
多流水线体系结构的出现,使得CPU在每一个周期执行完尽可能多的指令8条。
从本质上来讲,超标量是因为Dm642内核集成了8个独立的功能单元,每个功能单元都能独立地进行指令译码、执行取操作数 处理 保存结果。
八个功能单元是.D1/.M1/.L1/.S1/.D2/.M2/.L2/.S2 从编程的角度来看,超标量的优势主要是通过编写出/编译出并行汇编程序来充分发挥。
但是并不所有的程序都能通过并行充分发挥超标量所带来的优势,只有那些运算比较密集、比较规则的程序才能充分,而那些控制比较密集、判断比较频繁的程序只能很有限地发挥。
所以虽然Dm642有八条流水线而Pentium4只有一条流水线,同样的程序在Dm642上运行的速度并不绝对是Pentium4上的8倍,理论计算公式为:nFdm6428p/Fpentium4由此可见p越大越好;例1基于Dm642的高度并行的汇编程序: P75例2基于Dm642的低度并行的汇编程序: P22关键点三:指令集Dm642: SIMD指令、特殊指令;Pentium4:MMX指令; Dm642指令集中包括丰富的SIMD指令和特殊指令它们对提高某些算法的性能起到非常关键的作用;尤其是特殊指令它们使得Dm642在处理某些算法时具有很大的优势:1SIMD指令仅举四个具有代表性的指令: 1 add4 同时计算4对8位无符号数的和 2 sub4 同时计算4对8位无符号数的差 3 mpyu4 同时计算4对8位无符号数的积 4 cmpeq4 同时比较4对8位有符号数的是否相等2特殊指令某些指令如dotpu4也具有SIMD特性: 1 dotpu4 计算4对8位无符号数的和的积点积 2 subabs4 计算4对8位无符号数的差的绝对值SAD 3 shlmb 跨寄存器左移分析码流、提取码字 4 gmpy4 Galois Field Multiply
通信校验关键点三:指令集续 Pentium4的MMX指令多媒体增强指令集本质上它们就是一种SIMD指令,对提高某些算法的性能起到非常关键的作用尤其图像处理算法.例如在
开源项目XvidMpeg4-Codec中就用MMX指令实现了FDCT和IDCT变换、SAD值的计算等运算集中有规律的函数。
但由于Dm642指令集中有众多专门针对图像处理算法的特殊指令,所以在这方面,相对Pentium4来说,DM642还是具有很大优势的。
Dm642和Pentium对比num为8x8块的个数: 函数 Dm642 Pentium4 sad_8x8 26num fdct_8x8 50 76 num Idct_8x8 62 92 num关键点四:定点和浮点Dm642: 定点DSP;Pentium4:浮点协处理器FPU; 由于Dm642是定点DSP所以通常情况下浮点运算是通过调用浮点运算库中的函数来实现。
譬如计算两个float型浮点的积是通过调用函数float mpyffloat a float b来计算的,该函数执行需要上百个周期,显得非常慢。
因此那些浮点运算比较频繁比较集中的算法在Dm642上实现必须加以改进优化譬如G.729的算法。
优化浮点运算的方法有两:1数的定标;2整乘移位除;两种方法适合于不同的场合。
前者适合于G729算法,后者适合于rgb yuv运算。
Pentium4处理内部集成了浮点协处理器,在做浮点运算的时候只需要简单设置浮点协处理器即可使用浮点指令进行数据运算,速度远远超过定点CPU实现浮点运算。
关键点五:存储体系Dma控制器Dm642: L1DL1P/L2SRAML2CACHE/SDRAM;Pentium4:L1DL1P/ L2CACHE/L3CACHE/DDR ;三.Dm642应用程序的
软件架构 Applications Applications Memory Memory Manager Manager MPEG4 MPEG4 Reference Reference Channel-cell Channel-cell Framework Framework Abstraction Abstraction G.729 G.729 Algorithm Algorithm Manager Manager img64x.lib img64x.lib dsp64x.lib dsp64x.lib DSP/BIOS DSP/BIOS DriverIOM DriverIOM rts.lib rts.lib Chip Support Library Chip Support Library关键点一:Chip Support LibraryCSL库关键点二:DSP/BIOS实时OS关键点三:DriverIOM-DDK底层驱动 typedef struct IOM_Fxns IOM_TmdBindDev mdBindDev IOM_TmdUnBindDev mdUnBindDev IOM_TmdControlChan mdControlChan IOM_TmdCreateChan mdCreateChan IOM_TmdDeleteChan mdDeleteChan IOM_TmdSubmitChan mdSubmitChan IOM_Fxns关键点四:TMS320 DSPAlgorithm Standard XDAIS-算法标准 XDAIS算法标准是由TI公司制定并维护的为实现算法能提供同一的接口而制定的一系列的规则和原则。
按XDAIS实现的算法由如下有点:1程序结构清晰-资源和实现分离;2便于系统级优化和算法资源的共享;3便于Ti第三方的和作和系统的集成;等等 typedef struct IALG_Fxns Void implementationId Void algActivate… Int algAlloc… Int algControl… Void algDeactivate… Int algFree… Int algInit… Void algMoved… Int algNumAlloc… IALG_Fxns