davinc架构--软件构成篇

来源:互联网 发布:日语 知乎 编辑:程序博客网 时间:2024/06/05 14:40

-------------------------------------------
本文系本站原创,欢迎转载!
转载请注明出处:
http://sjj0412.cublog.cn
-------------------------------------------

    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 

原创粉丝点击