Davinci架构的初衷就是要让多核程序开发容易,且独立,那davinci架构下的软件究竟由那几部分构成呢?
三个------codecs,servers,apps
算法,算法服务器,应用。
codecs是不能单独成为程序的,它是以库的形式提供给,servers,apps。
servers是dsp可以运行的程序(包括操作系统)。
Apps是arm端linux操作系统下的一个应用程序。
下面分别讲解这三个部分的构成。
1.codecs
进入
jerry@jerry-laptop:~/dvsdk_3_00_01_42/codec_engine_2_24/examples/ti/sdo/ce/examples/codecs$ ls
auddec1_copy imgdec1_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_copy viddec_copy
我们可以看到已经有很多算法了。
我们看其中一个:
jerry@jerry-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.makefile文件,我们编译算法执行make的时候就是使用的makefile.
2.viddec_copy_ti_priv.h
, viddec_copy_ti.h, viddec_copy_ti.h是算法的源代码。
3.Lib目录是编译后生成的库放在这个文件夹里。
jerry@jerry-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 viddec_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。
这个目标平台的配置来自config.bld文件,这个文件位于CE_INSTALL_DIR/examples下,你可以修改来达到定制,这里面默认是从xdcpath.mak文件里配置读取的。
var SRCS = ["viddec_copy"];
for (var i = 0; i < Build.targets.length; i++) {
var targ = Build.targets[i];
print("building for target " + targ.name + " ...");
/*
* Add a library to this package and add the files described 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.viddec_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;
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 readonly 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(prog)
{
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 " + this.$name
+ " built for the target " + prog.build.target.$name
+ ", running on platform " + prog.platformName);
}
return (0);
}
再看servers:
jerry@jerry-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.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是编译后的程序所在的目录.
❏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,
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: 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, // 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 Server 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: Server.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.
上面的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 allocation
这个编译后会在bin文件夹下生成两个文件:
jerry@jerry-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端:
jerry@jerry-laptop:~/dvsdk_3_00_01_42/codec_engine_2_24/examples/ti/sdo/ce/examples/apps/video_copy$ ls
app.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,
"ti.sdo.ce.examples.servers.all_codecs" // server package
);
local.cfg:
是算法在本地运行的配置,这个配置和server配置有点像,因为她肯定也要选择算法等等.
var decoder =
xdc.useModule('ti.sdo.ce.examples.codecs.viddec_copy.VIDDEC_COPY');
var encoder =
xdc.useModule('ti.sdo.ce.examples.codecs.videnc_copy.VIDENC_COPY');
var Engine = xdc.useModule('ti.sdo.ce.Engine');
var myEngine = Engine.create("video_copy", [
{
name : "videnc_copy",
mod : encoder,
local: true
},
{
name : "viddec_copy",
mod : decoder,
local: true
}
]);
总结:
当我们执行make,执行了makefile,然后其实是执行了xdc.
EXAMPLES_ROOTDIR := $(CURDIR)/../../../../../..
include $(EXAMPLES_ROOTDIR)/xdcpaths.mak
# add the examples directory to the list of paths to packages
XDC_PATH := $(EXAMPLES_ROOTDIR);$(XDC_PATH)
all:
$(XDC_INSTALL_DIR)/xdc release XDCPATH="$(XDC_PATH)" /
XDCOPTIONS=$(XDCOPTIONS) $@ -PD .
同时从上面可以看出,package.xdc必须在makefile的当前目录.
package.xdc指出了要编译的对象即路劲.然后就会到package指定的路径找其他文件.
package.bld是和编译相关的,比如debug,还指出了是编译app,server,codecs,同时指出要执行什么东西.
如果是codecs,xdc会加入package.xdc的module对应的xdc,xs,并执行这些.
如果是server,则package.bld中会加入servername.cfg,tcf等配置文件.同时xdc会加入servername.cfg,这个可以通过更改package.bld中的servername名而不更改cfg的名字,就会出现错误,这个就验证了.
所以其实我们只要将makefile,package.xdc拷贝出来,放到任何路径,任可以编译原来的程序.因为package.bld指定要编译的路径,当然makefile要改EXAMPLES_ROOTDIR