1、Davinci 架构的 由三个部分组成,即: codecs,servers,apps( 算法,算法服务器,应用。 ) codecs是不能单独成为程序的,它是以库的形式提供给, servers,apps。 servers是 dsp可以运行的程序(包括操作系统)。 Apps是 arm端 linux操作系统下的一个应用程序。 下面分别讲解这三个部分的构成。 1.codecs 进入 jerryjerry-laptop:/dvsdk_3_00_01_42/codec_engine_2_24/examples/ti/sdo/ce/examples/codecs$ ls auddec1_copy imgde
2、c1_copy package.xdc universal_copy videnc1_copy auddec1_ires imgdec_copy scale vidanalytics_copy videnc_copy auddec_copy imgenc1_copy sphdec1_copy viddec1_copy vidtranscode_copy audenc1_copy imgenc_copy sphdec_copy viddec2_copy audenc_copy makefile sphenc1_copy viddec2split_copy g711 package sphenc_
3、copy viddec_copy 我们可以看到已经有很多算法了。 我们看其中一个: jerryjerry-laptop:/dvsdk_3_00_01_42/codec_engine_2_24/examples/ti/sdo/ce/examples/codecs/viddec_copy$ ls lib package.bld viddec_copy.c VIDDEC_COPY.xdc makefile package.xdc viddec_copy_ti.h VIDDEC_COPY.xs package package.xs viddec_copy_ti_priv.h 可以看出,一个算法有 1.
4、makefile文件,我们编译算法执行 make的时候就是使用的 makefile. 2.viddec_copy_ti_priv.h , viddec_copy_ti.h, viddec_copy_ti.h是算法的源代码。 3.Lib目录是编译后生成的库放在这个文件夹里。 jerryjerry-laptop:/dvsdk_3_00_01_42/codec_engine_2_24/examples/ti/sdo/ce/examples/codecs/viddec_copy/lib$ ls viddec_copy.a470uC viddec_copy.a64P viddec_copy.a674 v
5、iddec_copy.a86U viddec_copy.av4TCE viddec_copy.av5T 可以看到有各个平台的库文件。 4.package文件夹是存放编译过程的中间文件。 5.package.bld,package.xdc ,package.xs,VIDDEC_COPY.xs , VIDDEC_COPY.xdc 是配置文件, xdc能够识别的配置文件。 package.bld bld就是 build的意思,所以这个文件是和编译配置相关的, 比如是 debug,还是 release版本,源文 件包包含哪些,以及要编译的目标平台版本 ,x86,linux,C64P,还是 MVARM9
6、。 这个目标平台的配置来自 config.bld文件,这个文件位于 CE_INSTALL_DIR/examples下,你可以修改来达到定制,这里面默认是从 xdcpath.mak文件里配置读取的。 var SRCS = “viddec_copy“; for (var i = 0; i Build.targets.length; i+) var targ = Build.targetsi; print(“building for target “ + targ.name + “ .“); /* * Add a library to this package and add the files d
7、escribed in * SRCS to the library. */ Pkg.addLibrary(“lib/viddec_copy“, targ).addObjects(SRCS); 这个就是生成各个平台的库。 package.xdc. 就是静态属性配置文件,比如算法的名称,依赖项包和配置等文件。 requires ti.sdo.ce.video; 依赖这个包 package ti.sdo.ce.examples.codecs.viddec_copy module VIDDEC_COPY; 上面这个语句说明这个算法的包所在路径是“ti.sdo.ce.examples.codecs.vi
8、ddec_copy“ 它包含唯一的一个模块 “VIDDEC_COPY“,这个其实想当于告诉 xdc会包含 module的 xdc,xs,这里是VIDDEC_COPY.xdc,VIDDEC_COPY.xs 配置文件 . package.xs. 这个是动态属性配置文件,这些属性会根据平台,配置不一样而不一样。 比如: function getLibs(prog) var suffix = prog.build.target.findSuffix(this); if (suffix = null) return (“); var name = “lib/viddec_copy.a“ + suffix
9、; print(“ will link with “ + this.$name + “:“ + name); return (name); 这个语句返回这个算法所引出的包,比如 servers,apps就需要。 一般算法编译的时候会编译多种平台的包,故需要有一个能够获取不同包位置的配置。 VIDDEC_COPY.xdc. 具体算法的静态配置文件,这个文件名字必须匹配 package.xdc中 module的名字。 包括这个算法的接口类型,实现。 metaonly module VIDDEC_COPY inherits ti.sdo.ce.video.IVIDDEC override reado
10、nly config String ialgFxns = “VIDDECCOPY_TI_VIDDECCOPY“; inherits ti.sdo.ce.video.IVIDDEC,这个表明这个算法是一个 VSIA中的视频解码算法。 ialgFxns = “VIDDECCOPY_TI_VIDDECCOPY“; 表明这个算法的在代码的变量名称是 “VIDDECCOPY_TI_VIDDECCOPY“,用来向外面导出算法实现函数集变量。 VIDDEC_COPY.xs. 这个定义了这个算法 的一些动态属性,必须实现 .xdc中接口的方法。比如堆栈的大小。 function getStackSize(pr
11、og) if (verbose) print(“getting stack size for “ + this.$name + “ built for the target “ + prog.build.target.$name + “, running on platform “ + prog.platformName); return (1024); /* * = getDaramScratchSize = */ function getDaramScratchSize(prog) if (verbose) print(“getting DARAM scratch size for “ +
12、 this.$name + “ built for the target “ + prog.build.target.$name + “, running on platform “ + prog.platformName); return (0); 再看 servers: jerryjerry-laptop:/dvsdk_3_00_01_42/codec_engine_2_24/examples/ti/sdo/ce/examples/servers/all_codecs$ ls all.cfg all_evm3530.tci all_evmDM6446.tci all_evmOMAPL137
13、.tci all.tcf link.cmd makefile package.bld package.xdc all_evm2530.tci all_evmDM357.tci all_evmDM6467.tci all_sdp3430.tci bin main.c package makefile package.bld,package.xdc 和上面没有本质区别。 var serverName = “my_server“; /这个要匹配 .xdc中定义的 package name Pkg.attrs.profile = “release“; Link.cmd是链接配置 文件 。 Bin是编译
14、后的程序所在的目录 . Package也是编译过程中的中间中间 ,比如根据配置生成的 all_x64p.c,all_x64p.js main.c是算法执行前要执行的程序 . 各个平台的 DSP/BIOS内存配置文件 x.tci. 在这里大家可以配置 DDR,SHRMM,resetvec等内存区域的地址和大小 : 比如 all_evm3530.tci 中 var mem_ext = comment: “DDRALGHEAP: off-chip memory for dynamic algmem allocation“, name: “DDRALGHEAP“, base: 0x86000000,
15、len: 0x01800000, / 24 MB space: “code/data“ , comment: “DDR2: off-chip memory for application code and data“, name: “DDR2“, base: 0x87800000, len: 0x00600000, / 6 MB space: “code/data“ , comment: “DSPLINK: off-chip memory reserved for DSPLINK code and data“, name: “DSPLINKMEM“, base: 0x87E00000, len
16、: 0x00100000, / 1 MB space: “code/data“ , comment: “RESET_VECTOR: off-chip memory for the reset vector table“, name: “RESET_VECTOR“, base: 0x87F00000, len: 0x00001000, / 4 KB space: “code/data“ , comment: “L4CORE: L4-Core Interconnect Address Space“, name: “L4CORE“, base: 0x48000000, len: 0x01000000
17、, / 16 MB space: “data“ , comment: “L4PER: L4-Peripheral Interconnect Address Space“, name: “L4PER“, base: 0x49000000, len: 0x00100000, / 1 MB space: “data“ , comment: “IVA Memory Management Unit“, name: “IVAMMU“, base: 0x5D000000, len: 0x00001000, / 4 KB space: “data“ ; servername.cfg. The Codec Se
18、rver configuration script. 这个是服务器的配置文件 ,比如这个算法服务器会包含哪些算法 ,其算法线程的堆栈 ,优先级等属性 . Server.threadAttrs.stackSize = 4096; /堆栈 /* The servers execution priority */ Server.threadAttrs.priority = Server.MINPRI; /优先级 Server.algs = name: “viddec_copy“, mod: VIDDEC_COPY, threadAttrs: stackMemId: 0, priority: Serv
19、er.MINPRI + 2, groupId : 0, , name: “videnc_copy“, mod: VIDENC_COPY, threadAttrs: stackMemId: 0, priority: Server.MINPRI + 2, groupId : 0, , name: “imgdec_copy“, mod: IMGDEC_COPY, threadAttrs: stackMemId: 0, priority: Server.MINPRI + 3 , /包含的算法 . servername.tcf. The DSP/BIOS configuration script. 上面
20、的 all.cfg文件 , DSP/BIOS配置文件 ,它配置 dsp端的操作系统 ,时钟频率 ,内核 ,动态堆配置 ,内存块配置 (大小 ,位置 ). 主要静态配置如下方面 The base DSP/BIOS kernel Memory section names, sizes, and locations 这个由其包含的一个平台的 tci 文件配置 ,.tci 会创建 mem_ext变量。 Platform-specific attributes such as clock rates 平台属性 时钟频率 Enables the task manager and dynamic heap
21、allocation 这个编译后会在 bin文件夹下生成两个文件 : jerryjerry-laptop:/dvsdk_3_00_01_42/codec_engine_2_24/examples/ti/sdo/ce/examples/servers/all_codecs$ ls bin/ti_platforms_evm3530/ all_pm.x64P all.x64P app端 : jerryjerry-laptop:/dvsdk_3_00_01_42/codec_engine_2_24/examples/ti/sdo/ce/examples/apps/video_copy$ ls app.
22、c local.tcf main_BIOS.c makefile package.xdc smain.h local.cfg main_native.c package.bld remote.cfg Main_bios.c是 dsp端初始程序 (dsp_local时 ). main_native.c是 arm端初始的程序 . Package.xdc一样 . Package.bld也一样 . Remote.cfg是配置算法远程模式时的配置文件 : 配置使用哪个算法服务器 . var serverName = “bin/“ + / replace all : and . with _ in platform name platform.replace(/:/g, “_“).replace(/./g, “_“) + /all.x + remoteSuffix; var Engine = xdc.useModule(ti.sdo.ce.Engine); var myEngine = Engine.createFromServer( “video_copy“, / Engine name (as referred to in the C app) / path to server exe, relative to its package dir serverName,