打印
[DSP编程]

TI XDC工具入门简介

[复制链接]
1624|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangmangui|  楼主 | 2014-4-29 22:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

1.XDC(Express DSP Component)是TI提供的一个命令行工具,它可以生成并使用实时软件组件包。



2.以上两图说明了XDC的工作方式:通过相关文件设定操作指令,读入源码、库文件以及已经存在的组件包最终生成可执行文件。

3.Package------XDC工作的基本单元。包括有:源码、库文件以及元数据;元数据这包含有该包的版本信息和依赖信息,以及模块(Module)信息。

4.XDC使用方法:


5.XDC需要的文件:config.bld  package.bld  package.xdc

Package.xdc -------------描述该包的名称,版本信息,依赖文件,模块信息等

Config.bld --------------描述XDC要使用的编译工具的相关信息,如不同CPU所使用的编译工具目录,每种编译工具的编译选项,连接选项等基本信息;


Package.bld -------------------描述对于该包需要生成的平台,profile(debug,release)。通过Javascript脚本添加源码到生成执行文件的信息中。

Package.mak-------------------由XDC生成的文件,用于最终编译可执行文件。

6.XDC工作流程:

7.使用XDC所需的文件:源码、package.bld、package.xdc、config.bld。同时需要通过shell脚本将DVEVM的安装位置导出为环境变量。

各代码如下:

Config.bld样本代码:





  • var MVArm9 = xdc.useModule("gnu.targets.MVArm9");  
  • MVArm9.rootDir = "/opt/DVS357/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le";  
  • MVArm9.lnkOpts.suffix = "-lpthread " + MVArm9.lnkOpts.suffix;  
  • var Linux86=xdc.useModule("gnu.targets.Linux86");  
  • Linux86.rootDir = "/usr";  
  • Linux86.lnkOpts.suffix = "-lpthread " + Linux86.lnkOpts.suffix;  
  • Build.targets = [ Linux86,MVArm9,];  



Runxdc.sh样本代码:





  • #! /bin/sh   
  • #  import install paths  
  • #  putting the first period before the shell invokation keeps the changes  
  • #      to environment variables set here. Otherwise, changes to environment  
  • #      are only within the context of the executed script  
  •   
  • ./setpaths.sh  
  • #  Define search paths for included packages  
  • export XDCPATH="$CE_INSTALL_DIR/packages"  
  • #  Define options for execution  
  • export XDCBUILDCFG=$(pwd)"/config.bld  
  • #  Execute xdc command to make all packages  
  •   
  • /opt/DVS357/dvevm_1_20/xdc_2_94/xdc $@ -P *  

  

Setpaths.sh样本代码:





  • #!/bin/sh  
  •   
  • export DVEVM_INSTALL_DIR="/opt/DVS357/dvevm_1_20/"  
  • export BIOS_INSTALL_DIR=$DVEVM_INSTALL_DIR/bios_5_31_01  
  • export CG_INSTALL_DIR=$DVEVM_INSTALL_DIR/cg6x_6_0_14  
  • export CMEM_INSTALL_DIR=$DVEVM_INSTALL_DIR/cmem_1_02  
  • export CE_INSTALL_DIR=$DVEVM_INSTALL_DIR/codec_engine_1_10_01  
  • export CS_INSTALL_DIR=$DVEVM_INSTALL_DIR/codec_servers_1_23  
  • export DSPLINK_INSTALL_DIR=$DVEVM_INSTALL_DIR/dsplink_1_30_08_02  
  • export FMWK_INSTALL_DIR=$DVEVM_INSTALL_DIR/framework_components_1_10_04  
  • export XDAIS_INSTALL_DIR=$DVEVM_INSTALL_DIR/xdais_5_10  
  • export XDC_INSTALL_DIR=$DVEVM_INSTALL_DIR/xdc_2_94  
  •   
  • export PATH=$XDC_INSTALL_DIR:$PATH  

  

package.bld样本代码:



  • var targs = [MVArm9, Linux86];  
  • var profiles = ["debug", "release"];  
  • //  Define the base name for the executable(s) built  
  • var basename = "app";  
  • //  The following code uses the java.io.File.list() method to generate an array  
  • //      of all files in the current directory ('.') and then sorts out .c files  
  • var sources = java.io.File('.').list();  
  • var csources = [];  
  • for (var i = 0; i < sources.length; i++){  
  •        if(String(sources).match(/.*/.c$/))  
  •                 csources.push(sources);  
  • }  
  •   
  • //  The build phase cycles through the arrays of build targets and profiles  
  • //       and adds an executable for each combination  
  •   
  • for (var i = 0; i < targs.length; i++) {  
  •      for(var j = 0; j < profiles.length; j++){  
  •         Pkg.addExecutable( basename + "_" + profiles[j], targs,  
  • targs.platform, {  
  •                      cfgScript: null,  
  •                      profile: profiles[j],  
  •                 }  
  •                 ).addObjects( csources );  
  •      }  
  • }  






PS: 在 VIM中,给新的文件类型添加已知文件类型的语法高亮的方法是------在“/usr/share/vim/vimfiles/after”路径中添加一个文件“filetype.vim”(FC10系统下),在其中添加如下代码:




相关帖子

沙发
zhangmangui|  楼主 | 2014-4-29 22:05 | 只看该作者

这两天对TI的Codec Engine框架进行了进一步的学习,这里总结一下通过XDC工具创建基于Codec Engine的双核(ARM+DSP)工程的建立和生成可执行文件的过程。如有不对的地方,请不吝赐教。

1.由于工程的算法将在DSP端执行,因此需要创建DSP server可执行文件供ARM端的应用程序调用,可以采用以下文件结构。图上还写出了每个文件夹内需要包含的文件(注:runxdc.sh、setpaths.sh文件并不一定要存在,二者存在的目的在于提供XDC命令所需的搜索路径环境变量“XDCPATH”和config.bld文件所在路径环境变量“XDCBUILDCFG”。从而可知config.bld的位置不一定要在工程根目录中,只要XDC工具能找到的位置都行,通过设置XDCBUILDCFG得到)。


2.虽说是自己创建工程,有些文件是可以借用TI的例子通过修改归为己用的。这里就把setpaths.sh、runxdc.sh、config.bld以及APP文件夹中的packag.xdc、package.bld、engine.cfg还有Server文件夹从TI的workshop“lab12a_build_server”中拿来用了。

3.DSP端运行的算法是TI提供的例子videnc_copy,即将输入数据拷贝到输出。APP端通过申请到的输入输出两片连续内存空间,先将给输入输出空间存值并打印,将输入端和输出端通过调用DSP端的videnc_copy算法将输入拷贝的输出看结果。

4.设置好目录并拷贝相应的文件。

l         修改setpaths.sh使其中的环境变量全部指向现在系统中的相应位置。

l         修改config.bld设置三个平台(MVArm、C64P、Linux86)对应开发工具的个目录(rootDir),编译器包含的额外头文件includeOpts,编译器编译选项ccOpts.prefix,库链接关系.lnkOpts.suffix等等参数。最关键的是要把开发工具所在根目录设置正确!

l         修改runxdc.sh,设定正确的路径。(setpahs.sh…………)

5.由于SERVER端只需要video_encoder这个算法,因此在server.cfg中将其他三个算法去掉(只留下“var VIDENC = xdc.useModule('codecs.videnc_copy.VIDENC_COPY');”)。同理,Server对象(不知道怎么称呼JavaScript的变量,按自己理解称之为对象)中其他三个算法的线程参数也要删去。

6..在APP端编写应用程序代码需要用到以下头文件:

<xdc/std.h>

<ti/sdo/ce/Engine.h>

<ti/sdo/ce/osal/Memory.h>

<ti/sdo/ce/CERuntime.h>

<ti/sdo/cd/video/videnc.h>

算法调用一般流程为:

这里既可以直接调用Engine_open()、VIDENC_create()、VIDENC_process()等函数实现Codec Engine。也可以通过简单的封装函数实现访问。此处选择后者,将“lab12a_build_server/app”下的engine.h、engine.c、debug.h、video_encoder.c、video_encoder.h文件直接拿来使用。

7.修改app中engine.cfg文件,只保留viddec_copy相关内容。将Engine.create中该算法的local参数改为false。同时要指明arm程序执行engine_open时要打开的DSP端SERVER程序所在位置和文件名称:

demoEngine.server = "./server_release.x64P";

8.编写应用程序时需要注意的问题:

l         Memory_contigAlloc()需要在CERuntime_init()函数执行后才能执行,否则运行程序后会显示“Segment Fault;

l         出现xxx.h头文件中莫名错误要检查是否包含该文件所有数据结构声明的头文件。如果没有则该头文件不能识别该数据结构;

l         Engine_open()使用的Engine名称要和engine.cfg文件中定义的一致,同理VIDENC_create()函数打开的算法名称也要和engine.cfg中定义的一致;

9.TI代码学习收获:

l         通过initMask和对应的宏来标志程序中每一个创建和销毁必须成对出现的步骤,如果创建或打开成功,initMask中对应的位置1,在程序退出时根据initMask置1的情况进行销毁或关闭。同时由于创建有一定的先后顺序,即必须先创建A然后才能创建B这种,因此销毁是创建的倒序。类似一个压栈弹栈的过程。

l         使用status指示状态,一旦出错就将指示状态设置为EXIT_FAILD,然后使用goto转入销毁阶段;

l         使用DBG()定义,若定义了_DEBUG_则会编译时DBG等同于printf,否则为空。

l         每一个算法使用一个线程,对于线程的调度属性和优先级等通过实际调成观察运行情况。

l         CERuntime_init()每一个进程只能使用一次。因此需在main函数中执行。而engine_open可以在多个线程中使用。




l         通过线程参数传入quit标志,线程通过检查标志位决定是否退出本线程的操作,main函数线程绑定“CTL+C”消息处理函数,在处理函数中将标志位置1.


使用特权

评论回复
板凳
zhangmangui|  楼主 | 2014-4-29 22:06 | 只看该作者
资料来自收集   仅供学习使用

使用特权

评论回复
地板
zhangmangui|  楼主 | 2014-5-29 23:55 | 只看该作者
兄弟们  来接分   不多  就5分

使用特权

评论回复
5
NWPU_CHEN| | 2014-6-2 22:14 | 只看该作者
斑竹辛苦了,先顶一个,回头再看

使用特权

评论回复
6
zhangmangui|  楼主 | 2014-6-2 22:41 | 只看该作者
谢谢楼上  支持  果断结贴

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入【TI DSP 论坛】 & 【DSP 技术】           TI忠诚粉丝!

935

主题

26376

帖子

589

粉丝