关于XDC工具的文章

原文地址:http://alphamailpost.blog.163.com/blog/static/20111808120127261018264/

1.TI XDC工具入门简介
http://www.usr.cc/thread-52028-1-3.html
2.XDC工具使用示例
http://www.usr.cc/thread-52037-1-2.html
3.codec engine代码阅读四---CE_DIR/examples/ti/sdo/ce/examles/codecs/videnc_copy
http://alphamailpost.blog.163.com/blog/static/20111808120127219241667/
4.XDC工具手册(在xdc安装目录下的docs文件夹里也有,这个是在线网页)
http://rtsc.eclipse.org/docs-tip/XDCtools_User%27s_Guide


1.TI XDC工具入门简介
1.XDC(Express DSP Component)是TI提供的一个命令行工具,它可以生成并使用实时软件组件包,它包括一系列工具,这些工具可以允许你将你的C语言代码组织成类似于 java的包管理方式,具有面向对象的特性,因为它还有一个名字,叫做eXpanDed C.

关于XDC工具的文章 - α邮差 - α邮差的博客



关于XDC工具的文章 - α邮差 - α邮差的博客



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

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

4.XDC使用方法:

关于XDC工具的文章 - α邮差 - α邮差的博客



关于XDC工具的文章 - α邮差 - α邮差的博客




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

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

关于XDC工具的文章 - α邮差 - α邮差的博客




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

关于XDC工具的文章 - α邮差 - α邮差的博客




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

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

6.XDC工作流程:

关于XDC工具的文章 - α邮差 - α邮差的博客



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

各代码如下:

Config.bld样本代码:
  1. + expand sourceview plaincopy to clipboardprint?
  2. var MVArm9 = xdc.useModule("gnu.targets.MVArm9");   
  3. MVArm9.rootDir = "/opt/DVS357/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le";   
  4. MVArm9.lnkOpts.suffix = "-lpthread " + MVArm9.lnkOpts.suffix;   
  5. var Linux86=xdc.useModule("gnu.targets.Linux86");   
  6. Linux86.rootDir = "/usr";   
  7. Linux86.lnkOpts.suffix = "-lpthread " + Linux86.lnkOpts.suffix;   
  8. Build.targets = [ Linux86,MVArm9,];  
  9. var MVArm9 = xdc.useModule("gnu.targets.MVArm9");
  10. MVArm9.rootDir = "/opt/DVS357/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le";
  11. MVArm9.lnkOpts.suffix = "-lpthread " + MVArm9.lnkOpts.suffix;
  12. var Linux86=xdc.useModule("gnu.targets.Linux86");
  13. Linux86.rootDir = "/usr";
  14. Linux86.lnkOpts.suffix = "-lpthread " + Linux86.lnkOpts.suffix;
  15. Build.targets = [ Linux86,MVArm9,];
Runxdc.sh样本代码:
  1. view plaincopy to clipboardprint?
  2. #! /bin/sh   
  3. #  import install paths  

  4. #  putting the first period before the shell invokation keeps the changes  

  5. #      to environment variables set here. Otherwise, changes to environment  

  6. #      are only within the context of the executed script   
  7.   
  8. ./setpaths.sh  
  9. #  Define search paths for included packages   
  10. export XDCPATH="$CE_INSTALL_DIR/packages"
  11. #  Define options for execution   
  12. export XDCBUILDCFG=$(pwd)"/config.bld  

  13. #  Execute xdc command to make all packages   
  14.   
  15. /opt/DVS357/dvevm_1_20/xdc_2_94/xdc $@ -P *  
  16. #! /bin/sh
  17. #  import install paths

  18. #  putting the first period before the shell invokation keeps the changes

  19. #      to environment variables set here. Otherwise, changes to environment

  20. #      are only within the context of the executed script

  21. ./setpaths.sh
  22. #  Define search paths for included packages
  23. export XDCPATH="$CE_INSTALL_DIR/packages"
  24. #  Define options for execution
  25. export XDCBUILDCFG=$(pwd)"/config.bld

  26. #  Execute xdc command to make all packages

  27. /opt/DVS357/dvevm_1_20/xdc_2_94/xdc $@ -P *
Setpaths.sh样本代码:
  1. #!/bin/sh   
  2.   
  3. export DVEVM_INSTALL_DIR="/opt/DVS357/dvevm_1_20/"  
  4. export BIOS_INSTALL_DIR=$DVEVM_INSTALL_DIR/bios_5_31_01   
  5. export CG_INSTALL_DIR=$DVEVM_INSTALL_DIR/cg6x_6_0_14   
  6. export CMEM_INSTALL_DIR=$DVEVM_INSTALL_DIR/cmem_1_02   
  7. export CE_INSTALL_DIR=$DVEVM_INSTALL_DIR/codec_engine_1_10_01   
  8. export CS_INSTALL_DIR=$DVEVM_INSTALL_DIR/codec_servers_1_23   
  9. export DSPLINK_INSTALL_DIR=$DVEVM_INSTALL_DIR/dsplink_1_30_08_02   
  10. export FMWK_INSTALL_DIR=$DVEVM_INSTALL_DIR/framework_components_1_10_04   
  11. export XDAIS_INSTALL_DIR=$DVEVM_INSTALL_DIR/xdais_5_10   
  12. export XDC_INSTALL_DIR=$DVEVM_INSTALL_DIR/xdc_2_94   
  13.   
  14. export PATH=$XDC_INSTALL_DIR:$PATH  
  15. #!/bin/sh

  16. export DVEVM_INSTALL_DIR="/opt/DVS357/dvevm_1_20/"
  17. export BIOS_INSTALL_DIR=$DVEVM_INSTALL_DIR/bios_5_31_01
  18. export CG_INSTALL_DIR=$DVEVM_INSTALL_DIR/cg6x_6_0_14
  19. export CMEM_INSTALL_DIR=$DVEVM_INSTALL_DIR/cmem_1_02
  20. export CE_INSTALL_DIR=$DVEVM_INSTALL_DIR/codec_engine_1_10_01
  21. export CS_INSTALL_DIR=$DVEVM_INSTALL_DIR/codec_servers_1_23
  22. export DSPLINK_INSTALL_DIR=$DVEVM_INSTALL_DIR/dsplink_1_30_08_02
  23. export FMWK_INSTALL_DIR=$DVEVM_INSTALL_DIR/framework_components_1_10_04
  24. export XDAIS_INSTALL_DIR=$DVEVM_INSTALL_DIR/xdais_5_10
  25. export XDC_INSTALL_DIR=$DVEVM_INSTALL_DIR/xdc_2_94

  26. export PATH=$XDC_INSTALL_DIR:$PATH
package.bld样本代码:
  1. + expand sourceview plaincopy to clipboardprint?
  2. var targs = [MVArm9, Linux86];   
  3. var profiles = ["debug", "release"];   
  4. //  Define the base name for the executable(s) built   
  5. var basename = "app";   
  6. //  The following code uses the java.io.File.list() method to generate an array   
  7. //      of all files in the current directory ('.') and then sorts out .c files   
  8. var sources = java.io.File('.').list();   
  9. var csources = [];   
  10. for (var i = 0; i < sources.length; i++){   
  11.        if(String(sources[i]).match(/.*\.c$/))   
  12.                 csources.push(sources[i]);   
  13. }   
  14.   
  15. //  The build phase cycles through the arrays of build targets and profiles   
  16. //       and adds an executable for each combination   
  17.   
  18. for (var i = 0; i < targs.length; i++) {   
  19.      for(var j = 0; j < profiles.length; j++){   
  20.         Pkg.addExecutable( basename + "_" + profiles[j], targs[i],   
  21. targs[i].platform, {   
  22.                      cfgScript: null,   
  23.                      profile: profiles[j],   
  24.                 }   
  25.                 ).addObjects( csources );   
  26.      }   
  27. }  
  28. var targs = [MVArm9, Linux86];
  29. var profiles = ["debug", "release"];
  30. //  Define the base name for the executable(s) built
  31. var basename = "app";
  32. //  The following code uses the java.io.File.list() method to generate an array
  33. //      of all files in the current directory ('.') and then sorts out .c files
  34. var sources = java.io.File('.').list();
  35. var csources = [];
  36. for (var i = 0; i < sources.length; i++){
  37.        if(String(sources[i]).match(/.*\.c$/))
  38.                 csources.push(sources[i]);
  39. }

  40. //  The build phase cycles through the arrays of build targets and profiles
  41. //       and adds an executable for each combination

  42. for (var i = 0; i < targs.length; i++) {
  43.      for(var j = 0; j < profiles.length; j++){
  44.         Pkg.addExecutable( basename + "_" + profiles[j], targs[i],
  45. targs[i].platform, {
  46.                      cfgScript: null,
  47.                      profile: profiles[j],
  48.                 }
  49.                 ).addObjects( csources );
  50.      }
  51. }
2.XDC工具使用示例

在xdc工具的文档里,有一个chm文件,我们跟着这个文件做一些简单的利用xdc的程序编译.
j@j-desktop:/home/pheobe/davinci/xdctools_3_10_05_61/docs$ ls
docs.zip  README.txt        tilogo.gif     xdctools.chm
icons     relnotes_archive  titagline.gif

RTSC programming-->Primers-->RTSC Primers-->what we'll cover下面我们从lesson0开始做,为方便你找到这个文件,下面的 网址上是一个截图,标示了目录层次.
但是发现chm上的示例代码下载不下来,于是解压了docs.zip,lessen0的所在是:
xdctools_3_10_05_61/docs/docs/rtscpedia/RTSC_Module_Primer/RTSC_Module_Primer__Lesson_0.html

下载代码:
我在我的home文件夹下新建了一个test文件夹,然后复制了lesson0所涉及到的文件:Mod-primer-examples.zip然后解压,
  1. j@j-desktop:~/test$ cd examples/
  2. j@j-desktop:~/test/examples$ ls
  3. acme   common.mak  lesson1  lesson3  lesson5
  4. bravo  config.bld  lesson2  lesson4  lesson6

复制代码
然后第一步, 添加环境变量, 也就是Assigning environment variables节,我的xdc tools所在的文件夹为:/home/pheobe/davinci/xdctools_3_10_05_61/我先把这个文件导出到PATH变量中, 这样我使用文件夹下的xs和xdc文件就不用打完整路径了:
  1. j@j-desktop:~/test/examples$ echo $PATH
  2. /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
  3. j@j-desktop:~/test/examples$ export PATH=$PATH:/home/pheobe/davinci/xdctools_3_10_05_61/
  4. j@j-desktop:~/test/examples$ echo $PATH
  5. /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/pheobe/davinci/xdctools_3_10_05_61/

复制代码
然后我们要把xdcpath设成我们的examples文件夹:
  1. j@j-desktop:~/test/examples$ export XDCPATH=/home/pheobe/test/examples/j@j-desktop:~/test/examples$ echo $XDCPATH
  2. /home/pheobe/test/examples/
  3. j@j-desktop:~/test/examples$ xs xdc.tools.path -p /home/pheobe/test/examples/;/home/pheobe/davinci/xdctools_3_10_05_61/packages;

复制代码
按照文档上所说:xs xdc.tools.path -p得到的应该是xdctools的搜索路径,现在它包括XDCPATH中的和PATH中的.
然后是告诉XDC你的编译器所在的路径,我手头也没有板子,就是直接编译与我的电脑用了,所以我的编译器是gcc:
  1. j@j-desktop:~/test/examples$ cat common.mak
复制代码
## -------- common makefile -------- ##


## -------- host-specific paths -------- ##
                                         ## MODIFY THESE PATHS PER YOUR INSTALLATION
                                         ## WINDOWS HOST -- SURROUND THESE PATHS WITH "" "" IF THEY CONTAIN SPACES  
XDCROOT = /home/pheobe/davinci/xdctools_3_10_05_61
C6XTOOLS = /home/pheobe/davinci/cg6x_6_0_21_1

## -------- remove command -------- ##
                                    ## LINUX HOSTS -- REPLACE $(XDCROOT)/bin/rm WITH rm
RMCMD = rm


## --------build tools -------- ##
CONFIGURO = $(XDCROOT)/xs xdc.tools.configuro
LOADER = $(XDCROOT)/xs xdc.tools.loader
CC = $(C6XTOOLS)/bin/cl6x -q

## -------- build parameters -------- ##
CONFIG = cfgsite
TARGET = ti.targets.C64P
PLATFORM = ti.platforms.sim64Pxx
PROGNAME = prog


## -------- all-rule -------- ##
all : $(PROGNAME).out


## -------- config-rule -------- ##
$(CONFIG)/linker.cmd $(CONFIG)/compiler.opt : $(PROGNAME).cfg
        $(CONFIGURO) -c $(C6XTOOLS) -t $(TARGET) -p $(PLATFORM) -o $(CONFIG) $(PROGNAME).cfg

## -------- compile-rule -------- ##
$(PROGNAME).obj : $(PROGNAME).c $(CONFIG)/compiler.opt
        $(CC) -@$(CONFIG)/compiler.opt -c $(PROGNAME).c

## -------- link-rule -------- ##
$(PROGNAME).out : $(PROGNAME).obj $(CONFIG)/linker.cmd
        $(CC) -z -c $^ -o $(PROGNAME).out -l $(C6XTOOLS)/lib/rts64plus.lib


## -------- test-rule -------- ##
test : $(PROGNAME).out
        $(LOADER) $(PROGNAME).out

## -------- clean-rule -------- ##
clean :
        rm -rf $(CONFIG) *.obj *.out

config.bld编辑之后为:
  1. j@j-desktop:~/test/examples$ cat config.bld
  2. /*
  3. *  ======== config.bld ========
  4. */

  5. var Build = xdc.useModule('xdc.bld.BuildEnvironment');

  6. var C64P = xdc.useModule('ti.targets.C64P');
  7. var GCC = xdc.useModule('gnu.targets.Mingw');

  8. C64P.rootDir = /home/pheobe/davinci/cg6x_6_0_21_1;  /* modify to match %c6xtools% */
  9. C64P.platform = 'ti.platforms.sim64Pxx';

  10. GCC.rootDir = /usr/bin;   /* modify to match %gcctools% */

  11. Build.targets = [C64P, GCC];

复制代码
到这里Lesson0就完成了,然后 进入lesson1.
  1. j@j-desktop:~/test/examples$ cd lesson1
  2. j@j-desktop:~/test/examples/lesson1$ ls
  3. makefile  prog.c  prog.cfg

复制代码
这里有三个文件,C语言文件就是prog.c:
  1. j@j-desktop:~/test/examples/lesson1$ cat prog.c
  2. /*
  3. *  ======== lesson1/prog.c ========
  4. */

  5. #include <xdc/runtime/System.h>

  6. int main()
  7. {
  8.     System_printf("Hello World\n");
  9.     return 0;
  10. }

复制代码
另一个是prog.cfg
  1. j@j-desktop:~/test/examples/lesson1$ cat prog.cfg
  2. /*
  3. *  ======== lesson1/prog.cfg ========
  4. */

  5. var System = xdc.useModule('xdc.runtime.System');

复制代码
这个 prog.cfg文件称为 元程序meta-program,它是用于配置C语言程序的,
这个元程序,说整个程序要使用一个完整名字为xdc.runtime.System的RTSC模块.简单的说,一个RTSC模块定义了一个客户与实现提供者之间编程边界,它包括:
1)一组特定的常量,类型和函数.
2)上面的这些东西的实现只有在提供者才可见,而对客户是隐藏的.
每个模块必须存在一个包中,包在这里即是一个物理的概念也是一个逻辑的概念.
比如在这个例子中xdc.runtime.System这个模块包含于一个逻辑上的xdc.runtime包里,同时也存在于一个xdc/runtime文件夹下.
与它同级的还有Memory,Error,Startup等.System里包含了一组函数printf, atexit, abort等,这些函数与C标准库中的函数同名,功能也差不多,但却有自己的实现.
这于这方面的概念不多说了,与java是类似的,一句话,你也可以这样调用printf而不用include .h文件: xdc_runtime_System_printf

说某一个程序都有一个main入口点,比如说System也有,xdc.useModule(System),会启动程序的生命进程,也就是说会调用到它的main函数.
有一个规则,就是这个元程序的useModule要映像include语句,意思是prog.c中有一个include,prog.cfg就要useModule那个模块.
除了这个元程序,还有一个 xdc脚本XDCscript,用来配置程序的,这个脚本是javascript的一个超集,但是没有会把它称为javascript.

配置RTSC程序:
元程序是服务于预编译阶段的,也就是编译和链接prog.c之前的.我们需要一个configuro程序来执行这个配置过程,configuro会把 prog.cfg做为输入,输出两个文件,compiler.opt和linker.cmd,这两个文件一个做为编译器的输入,一个做为链接器的输入,来 控制整个编译链接的流程.
除了这个prog.cfg文件外,configuro的输入还要有一个target和一个platform,这两个东西是在XDCscript中的. target指定的是核心级信息,所以编译器知道芯片是什么指令级,用什么编译器,它指导程序的编译.
platform指定的是芯片级信息,有外设之类的信息,指导链接器进行链接.

好了,可以 编译运行程序了:
文件夹里有一个makefile:
  1. j@j-desktop:~/test/examples/lesson1$ cat makefile
  2. ## -------- lesson1/makefile -------- ##

  3. -include ../common.mak

复制代码
它只是包含了一下common.mak.
我们只要make all就可以编译了:
  1. j@j-desktop:~/test/examples/lesson1$ make all
  2. /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.configuro -c /home/pheobe/davinci/cg6x_6_0_21_1 -t ti.targets.C64P -p ti.platforms.sim64Pxx -o cfgsite prog.cfg
  3. making package.mak (because of package.bld) ...
  4. generating interfaces for package cfgsite (because package/package.xdc.inc is older than package.xdc) ...
  5. configuring prog.x64P from package/cfg/prog_x64P.cfg ...
  6. cl64P package/cfg/prog_x64P.c ...
  7. /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -@cfgsite/compiler.opt -c prog.c
  8. /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -z -c prog.obj cfgsite/linker.cmd -o prog.out -l /home/pheobe/davinci/cg6x_6_0_21_1/lib/rts64plus.lib
  9. j@j-desktop:~/test/examples/lesson1$ ls
  10. cfgsite  makefile  prog.c  prog.cfg  prog.obj  prog.out

复制代码
但是在这里,我们还是不明白整个编译链接过程,下面我们重来:
从makefile我们知道,make究竟做什么都在common.mak中指定的,我们来看all选项:
  1. all : $(PROGNAME).out


  2. ## -------- config-rule -------- ##
  3. $(CONFIG)/linker.cmd $(CONFIG)/compiler.opt : $(PROGNAME).cfg
  4.         $(CONFIGURO) -c $(C6XTOOLS) -t $(TARGET) -p $(PLATFORM) -o $(CONFIG) $(PROGNAME).cfg

  5. ## -------- compile-rule -------- ##
  6. $(PROGNAME).obj : $(PROGNAME).c $(CONFIG)/compiler.opt
  7.         $(CC) -@$(CONFIG)/compiler.opt -c $(PROGNAME).c

  8. ## -------- link-rule -------- ##
  9. $(PROGNAME).out : $(PROGNAME).obj $(CONFIG)/linker.cmd
  10.         $(CC) -z -c $^ -o $(PROGNAME).out -l $(C6XTOOLS)/lib/rts64plus.lib
复制代码
把其中的变量替换完之后就是三条指令:第一条,配置:
  1. all : prog.out


  2. ## -------- config-rule -------- ##
  3. cfgsite/linker.cmd cfgsite/compiler.opt : prog.cfg
  4. /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.configuro -c /home/pheobe/davinci/cg6x_6_0_21_1 -t ti.targets.C64P -p ti.platforms.sim64Pxx -o cfgsite prog.cfg
复制代码
j@j-desktop:~/test/examples/lesson1$ /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.configuro -c /home/pheobe/davinci/cg6x_6_0_21_1 -t ti.targets.C64P -p ti.platforms.sim64Pxx -o cfgsite prog.cfg
making package.mak (because of package.bld) ...
generating interfaces for package cfgsite (because package/package.xdc.inc is older than package.xdc) ...
configuring prog.x64P from package/cfg/prog_x64P.cfg ...
cl64P package/cfg/prog_x64P.c ...
j@j-desktop:~/test/examples/lesson1$ ls
cfgsite  makefile  prog.c  prog.cfg
j@j-desktop:~/test/examples/lesson1$ ls cfgsite
compiler.opt  custom.mak  package      package.mak  package.xs
config.bld    linker.cmd  package.bld  package.xdc

然后编译:
  1. j@j-desktop:~/test/examples/lesson1$ /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -@cfgsite/compiler.opt -c prog.c
  2. j@j-desktop:~/test/examples/lesson1$ ls
  3. cfgsite  makefile  prog.c  prog.cfg  prog.obj

复制代码
编译生成prog.ojb文件.这里面到compiler.opt做为输入之一.


然后是链接:
  1. j@j-desktop:~/test/examples/lesson1$ /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -z -c prog.obj cfgsite/linker.cmd -o prog.out -l /home/pheobe/davinci/cg6x_6_0_21_1/lib/rts64plus.lib
  2. j@j-desktop:~/test/examples/lesson1$ ls
  3. cfgsite  makefile  prog.c  prog.cfg  prog.obj  prog.out

复制代码
生成了prog.out文件,输入有linker.cmd

编译选项为:
  1. j@j-desktop:~/test/examples/lesson1$ cat cfgsite/compiler.opt
  2. -mv64p -I"/home/pheobe/test/examples" -I"/home/pheobe/davinci/xdctools_3_10_05_61/packages" -I"/home/j/test/examples/lesson1/cfgsite/.." -I/home/pheobe/davinci/cg6x_6_0_21_1/include -Dxdc_target_types__="ti/targets/std.h" -Dxdc_target_name__=C64P -Dxdc_cfg__header__="/home/j/test/examples/lesson1/cfgsite/package/cfg/prog_x64P.h"

复制代码
链接命令为:
  1. j@j-desktop:~/test/examples/lesson1$ cat cfgsite/linker.cmd
  2. /*
  3. * Do not modify this file; it is automatically generated from the template
  4. * linkcmd.xdt in the ti.targets package and will be overwritten.
  5. */

  6. /*
  7. * put '"'s around paths because, without this, the linker
  8. * considers '-' as minus operator, not a file name character.
  9. */



  10. -l"/home/j/test/examples/lesson1/cfgsite/package/cfg/prog_x64P.o64P"
  11. -l"/home/pheobe/davinci/xdctools_3_10_05_61/packages/ti/targets/rts6000/lib/ti.targets.rts6000.a64P"
  12. -l"/home/pheobe/davinci/xdctools_3_10_05_61/packages/ti/targets/rts6000/lib/boot.a64P"


  13. --args 0x200




  14. -heap  0x1000
  15. -stack 0x1000

  16. MEMORY
  17. {
  18.     IRAM (RWX) : org = 0x800000, len = 0x200000
  19.     DDR : org = 0x80000000, len = 0x10000000
  20. }

  21. /*
  22. * Linker command file contributions from all loaded packages:
  23. */
  24. /* Content from xdc (null): */

  25. /* Content from xdc.corevers (null): */

  26. /* Content from xdc.services.global (null): */

  27. /* Content from xdc.shelf (null): */

  28. /* Content from xdc.services.spec (null): */

  29. /* Content from xdc.services.intern.xsr (null): */

  30. /* Content from xdc.services.intern.gen (null): */

  31. /* Content from xdc.services.intern.cmd (null): */

  32. /* Content from ti.catalog.c6000 (null): */

  33. /* Content from xdc.platform (null): */

  34. /* Content from xdc.cfg (null): */

  35. /* Content from ti.platforms.sim64Pxx (null): */

  36. /* Content from xdc.runtime (null): */

  37. /* Content from ti.targets.rts6000 (null): */

  38. /* Content from cfgsite (null): */


  39. /*
  40. * symbolic aliases for static instance objects
  41. */
  42. _xdc_runtime_Startup__EXECFXN__C = 1;
  43. _xdc_runtime_Startup__RESETFXN__C = 1;

  44. SECTIONS
  45. {


  46.     .text: load >> DDR
  47.     .switch: load >> DDR
  48.     .stack: load > DDR
  49.     .args: load > DDR align = 0x4 , fill = 0 { _argsize = 0x200; }
  50.     xdc.noload: load >> DDR, type = NOLOAD
  51.     .sysmem: load > DDR
  52.     .far: load >> DDR
  53.     .data: load >> DDR
  54.     .cinit: load > DDR
  55.     .bss: load > DDR
  56.     .const: load >> DDR
  57.     .pinit: load > DDR
  58.     .cio: load >> DDR

  59. }

复制代码

二楼这里从第二课开始看起:
它的文档所在位置为: xdctools_3_10_05_61/docs/docs/rtscpedia/RTSC_Module_Primer/RTSC_Module_Primer__Lesson_2.html这一节主要是讲Bench模块,上一节我们己经讲了System模块。
Bench模块全名为
#include
<acme/utils/Bench.h>或acme.utils.Bench.

我们看看代码为:

  1. j@j-desktop:~/test/examples/lesson2$ cat prog.c
  2. /*
  3. *  ======== lesson2/prog.c ========
  4. */

  5. #include <acme/utils/Bench.h>
  6. #include <xdc/runtime/System.h>

  7. int main()
  8. {
  9.     Bench_begin("System_printf timing");
  10.     System_printf("Hello World\n");
  11.     Bench_end();

  12.     return 0;
  13. }
  14. j@j-desktop:~/test/examples/lesson2$ cat prog.cfg
  15. /*
  16. *  ======== lesson2/prog.cfg ========
  17. */

  18. var Bench = xdc.useModule('acme.utils.Bench');
  19. var System = xdc.useModule('xdc.runtime.System');

  20. Bench.enableFlag = true;

复制代码
由于程序中使用了Bench模块,所有元程序meta-program中就要xdc.useModule('acme.utils.Bench');

Bench模块可以用来测试,下面的代码Bench_begin表时开始测试,传入参数是一个字符串,但是这个字符串并不立刻输出,而是等Bench_end时才输出,并且最后还打印出从begin到end所经历的时间。

  1. j@j-desktop:~/test/examples/lesson2$ make all
  2. /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.configuro -c /home/pheobe/davinci/cg6x_6_0_21_1 -t ti.targets.C64P -p ti.platforms.sim64Pxx -o cfgsite prog.cfg
  3. making package.mak (because of package.bld) ...
  4. generating interfaces for package cfgsite (because package/package.xdc.inc is older than package.xdc) ...
  5. configuring prog.x64P from package/cfg/prog_x64P.cfg ...
  6. js: "/home/pheobe/davinci/xdctools_3_10_05_61/packages/xdc/xdc.tci", line 299: xdc.services.global.XDCException: xdc.PACKAGE_NOT_FOUND: can't locate the package 'acme.utils' along the path: '/home/pheobe/davinci/xdctools_3_10_05_61/packages;..;'. Ensure that the package path is set correctly.
  7.     "/home/j/test/examples/lesson2/prog.cfg", line 5
  8.     "./package/cfg/prog_x64P.cfg", line 762
  9.     "./package/cfg/prog_x64P.cfg", line 717
  10. gmake: *** [package/cfg/prog_x64P.c] Error 1
  11. js: "/home/pheobe/davinci/xdctools_3_10_05_61/packages/xdc/tools/Cmdr.xs", line 40: Error: xdc.tools.configuro: configuration failed due to earlier errors (status = 2); 'linker.cmd' deleted.
  12. make: *** [cfgsite/compiler.opt] Error 1

复制代码
编译出错了,最开始的位置是 js: "/home/pheobe/davinci/xdctools_3_10_05_61/packages/xdc/xdc.tci", line 299: 出错信息是:

PACKAGE_NOT_FOUND: can't locate the package 'acme.utils' along the path: '/home/pheobe/davinci/xdctools_3_10_05_61/packages;..;'. Ensure that the package path is set correctly.
意思是:包未找到,无法在/home /pheobe/davinci/xdctools_3_10_05_61/packages文件夹下找到acme.utils包,确保包路径设置正确。 如果我们在用一个包的话,必须把包的位置包含在$XDCPATH变量中,所以现在,我们这样做:

  1. xs xdc.tools.path -pxs: command not found
复制代码

哦,这是因为昨天做上一课时export PATH=$PATH:/home/pheobe/davinci/xdctools_3_10_05_61/这一步把$PATH加下到环境变量中只是临时的,关机重启就没了,现在我们把它加在.bashrc中:
  1. gedit ~/.bashrc

复制代码
然后把export PATH=$PATH:/home/pheobe/davinci/xdctools_3_10_05_61/加到文件结尾处。
  1. j@j-desktop:~/test/examples/lesson2$ source ~/.bashrc
  2. j@j-desktop:~/test/examples/lesson2$ xs xdc.tools.path -p
  3. /home/pheobe/davinci/xdctools_3_10_05_61/packages;

复制代码
这下刚刚的问题解决了,我们发现昨天做的另一项工作也报销了,还要重新把当前的examples路径加到$XDCPATH下面,另外,我们还得找到acme.utils包的所在位置,其实它也在我们examples目录下,省事了。
  1. gedit ~/.bashrc

复制代码
追加:export XDCPATH=/home/j/test/examples
  1. j@j-desktop:~/test/examples/lesson2$ make clean
  2. rm -rf cfgsite *.obj *.out
  3. j@j-desktop:~/test/examples/lesson2$ make all
  4. /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.configuro -c /home/pheobe/davinci/cg6x_6_0_21_1 -t ti.targets.C64P -p ti.platforms.sim64Pxx -o cfgsite prog.cfg
  5. making package.mak (because of package.bld) ...
  6. generating interfaces for package cfgsite (because package/package.xdc.inc is older than package.xdc) ...
  7. configuring prog.x64P from package/cfg/prog_x64P.cfg ...
  8. cl64P package/cfg/prog_x64P.c ...
  9. /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -@cfgsite/compiler.opt -c prog.c
  10. /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -z -c prog.obj cfgsite/linker.cmd -o prog.out -l /home/pheobe/davinci/cg6x_6_0_21_1/lib/rts64plus.lib

复制代码
然后运行一下:
  1. j@j-desktop:~/test/examples/lesson2$ make test
  2. /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.loader prog.out
  3. Hello World
  4. System_printf timing [2159]

复制代码

下面进入第三课,实例对象:
xdctools_3_10_05_61/docs/docs/rtscpedia/RTSC_Module_Primer/RTSC_Module_Primer__Lesson_3.html
这里又是一个新模块: bravo.math.RandGenRandGen 管理的是一个产生随机数序列的实例对象。实际的创建需要一组单独的参数。RandGen_create分配并初始化一个实例对象。它接收一个参数,类型为 RandGen_Params rgParams;它有一组默认值,你可以根据需要修改它的单个域,如:
  1. rgParams.range = 15;
  2.     rgParams.seed = 3;
复制代码
一个是值的范围,一个是种子。
RandGen_next获得下一个随机数。
  1. j@j-desktop:~/test/examples/lesson3$ make all
  2. /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.configuro -c /home/pheobe/davinci/cg6x_6_0_21_1 -t ti.targets.C64P -p ti.platforms.sim64Pxx -o cfgsite prog.cfg
  3. making package.mak (because of package.bld) ...
  4. generating interfaces for package cfgsite (because package/package.xdc.inc is older than package.xdc) ...
  5. configuring prog.x64P from package/cfg/prog_x64P.cfg ...
  6. cl64P package/cfg/prog_x64P.c ...
  7. /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -@cfgsite/compiler.opt -c prog.c
  8. /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -z -c prog.obj cfgsite/linker.cmd -o prog.out -l /home/pheobe/davinci/cg6x_6_0_21_1/lib/rts64plus.lib
  9. j@j-desktop:~/test/examples/lesson3$ make test
  10. /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.loader prog.out
  11. 6 7 10 1 12 8 10 14 1 15
  12. j@j-desktop:~/test/examples/lesson3$ make test
  13. /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.loader prog.out
  14. 6 7 10 1 12 8 10 14 1 15

复制代码
可以两次输出是同样的,要改变seed才能输出不同的内容,改变range会改变输出范围:
  1. j@j-desktop:~/test/examples/lesson3$ cat prog.c
  2. /*
  3. *  ======== lesson3/prog.c ========
  4. */

  5. #include <bravo/math/RandGen.h>
  6. #include <xdc/runtime/System.h>

  7. #define COUNT 10

  8. Int main()
  9. {
  10.     RandGen_Handle rgInst;
  11.     RandGen_Params rgParams;
  12.     Int i;

  13.     RandGen_Params_init(&rgParams);

  14.     rgParams.range = 150;
  15.     rgParams.seed = 8;
  16.     rgInst = RandGen_create(&rgParams, NULL);

  17.     for (i = 0; i < COUNT; i++) {
  18.         System_printf("%d ", RandGen_next(rgInst));
  19.     }
  20.     System_printf("\n");

  21.     return 0;
  22. }

复制代码
再编译试下:
  1. j@j-desktop:~/test/examples/lesson3$ make clean
  2. rm -rf cfgsite *.obj *.out
  3. j@j-desktop:~/test/examples/lesson3$ make all
  4. /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.configuro -c /home/pheobe/davinci/cg6x_6_0_21_1 -t ti.targets.C64P -p ti.platforms.sim64Pxx -o cfgsite prog.cfg
  5. making package.mak (because of package.bld) ...
  6. generating interfaces for package cfgsite (because package/package.xdc.inc is older than package.xdc) ...
  7. configuring prog.x64P from package/cfg/prog_x64P.cfg ...
  8. cl64P package/cfg/prog_x64P.c ...
  9. /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -@cfgsite/compiler.opt -c prog.c
  10. /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -z -c prog.obj cfgsite/linker.cmd -o prog.out -l /home/pheobe/davinci/cg6x_6_0_21_1/lib/rts64plus.lib
  11. j@j-desktop:~/test/examples/lesson3$ make test
  12. /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.loader prog.out
  13. 29 1 53 10 27 133 95 32 114 81

复制代码


进入lesson4:
xdctools_3_10_05_61/docs/docs/rtscpedia/RTSC_Module_Primer/RTSC_Module_Primer__Lesson_4.html
依旧是楼上的那个模块,这里主要讲静态实例,实例的销毁。
先执行程序:
  1. j@j-desktop:~/test/examples/lesson3$ cd ../lesson4
  2. j@j-desktop:~/test/examples/lesson4$ make all
  3. /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.configuro -c /home/pheobe/davinci/cg6x_6_0_21_1 -t ti.targets.C64P -p ti.platforms.sim64Pxx -o cfgsite prog.cfg
  4. making package.mak (because of package.bld) ...
  5. generating interfaces for package cfgsite (because package/package.xdc.inc is older than package.xdc) ...
  6. configuring prog.x64P from package/cfg/prog_x64P.cfg ...
  7. cl64P package/cfg/prog_x64P.c ...
  8. /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -@cfgsite/compiler.opt -c prog.c
  9. /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -z -c prog.obj cfgsite/linker.cmd -o prog.out -l /home/pheobe/davinci/cg6x_6_0_21_1/lib/rts64plus.lib
  10. j@j-desktop:~/test/examples/lesson4$ make test
  11. /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.loader prog.out
  12. dynamically-created instance:
  13.         6 7 10 1 12 8 10 14 1 15

  14. dynamically-constructed instance:
  15.         13 2 1 22 12 5 10 19 17 12

  16. statically-created instance:
  17.         12 5 3 11 11 19 5 1 15 0

复制代码
这里打印了三种实际,动态创建的实际,动态构造 的实例,静态创建的实例。
  1. j@j-desktop:~/test/examples/lesson4$ cat prog.c
  2. /*
  3. *  ======== lesson4/prog.c ========
  4. */

  5. #include <bravo/math/RandGen.h>
  6. #include <xdc/runtime/System.h>

  7. #include <xdc/cfg/global.h>

  8. #define COUNT 10

  9. Void printNums(RandGen_Handle rgInst, String label)
  10. {
  11.     Int i;

  12.     System_printf("%s:\n\t", label);
  13.     for (i = 0; i < COUNT; i++) {
  14.         System_printf("%d ", RandGen_next(rgInst));
  15.     }
  16.     System_printf("\n\n");
  17. }

  18. Int main()
  19. {
  20.     RandGen_Handle rgInstHandle;
  21.     RandGen_Struct rgInstStruct;
  22.     RandGen_Params rgParams;

  23.     RandGen_Params_init(&rgParams);

  24.     rgParams.range = 15;
  25.     rgParams.seed = 3;
  26.     rgInstHandle = RandGen_create(&rgParams, NULL);

  27.     rgParams.range = 25;
  28.     rgParams.seed = 2;
  29.     RandGen_construct(&rgInstStruct, &rgParams);

  30.     printNums(rgInstHandle, "dynamically-created instance");
  31.     printNums(RandGen_handle(&rgInstStruct), "dynamically-constructed instance");
  32.     printNums(rgInstStatic, "statically-created instance");

  33.     RandGen_delete(&rgInstHandle);
  34.     RandGen_destruct(&rgInstStruct);

  35.     return 0;
  36. }

复制代码

代码很容易看,有三个对象,
动态创建对象的方法
  1. RandGen_Handle rgInstHandle;
  2. rgInstHandle = RandGen_create(&rgParams, NULL);
复制代码
动态构造对象的方法
  1. RandGen_Struct rgInstStruct;
  2. RandGen_construct(&rgInstStruct, &rgParams);
  3. RandGen_handle(&rgInstStruct)//最后这里是从struct获得handle
复制代码
静态对象是直接使用的
  1. printNums(rgInstStatic, "statically-created instance");

复制代码
rgInstStatic甚到在C语言文件里都没有声明。
它是在prog.cfg里声明的:
  1. j@j-desktop:~/test/examples/lesson4$ cat prog.cfg
  2. /*
  3. *  ======== lesson4/prog.cfg ========
  4. */

  5. var Program = xdc.useModule('xdc.cfg.Program');

  6. var RandGen = xdc.useModule('bravo.math.RandGen');
  7. var System = xdc.useModule('xdc.runtime.System');

  8. Program.global["rgInstStatic"] = RandGen.create({range: 20, seed: 4});

复制代码
注意的是最后一句:
  1. Program.global["rgInstStatic"] = RandGen.create({range: 20, seed: 4});

复制代码


第五课,lesson5:
xdctools_3_10_05_61/docs/docs/rtscpedia/RTSC_Module_Primer/RTSC_Module_Primer__Lesson_5.html
终于说到包了,这与 codec engine是很相关的了。
这里我们要创建一个非常简单的包,这个包里没有模块,只是为了介绍一些概念。
我们的examples文件夹己经被包含在XDCPATH目录下了,所以如果我们想建一个包,名字叫lesson5,我们就在examples目录下建一个目录叫做lesson5,这体现了XDC中包结构的物理,逻辑两个层次的对应。
声明lesson5下面是一个包,它下面就要有丙个文件,一个是package.xdc,另一个就是package.bld.前者声明这个包的名字,后者描述了这个的创建方法。
  1. j@j-desktop:~/test/examples/lesson5$ ls
  2. package  package.bld  package.mak  package.xdc  prog.c  prog.cfg

复制代码


package.xdc中,可以这样声明一个包:
  1. j@j-desktop:~/test/examples/lesson5$ cat package.xdc
  2. /*
  3. *  ======== lesson5/package.xdc ========
  4. */

  5. /*! Our first package [RTSC Module Primer] */
  6. package lesson5 {
  7.     /* module declarations normally go here */
  8. };

复制代码

去掉无用的注释,其实就是:
  1. package lesson5{};
复制代码

这有点像C语言的给构体,然而却不是,它是用 XDCspec语言来写的。这里我们应该得到一个结论,examples下的Lesson5文件夹,对应一个包称为lessen5,但同样的文件夹lesson4却不是一个包,因为它下面没有package.xdc。]
另一个文件是package.bld,它是用 XDCscript写的。它的功能与makefile差不多。也用于控制程序的编译流程。
另外,lesson0中的config.bld也是XDCscript写的。config.bld通常放在XDCPATH指定的各个目录下,
  1. for each (var targ in Build.targets) {
  2.     Pkg.addExecutable("prog", targ, targ.platform).addObjects(["prog.c"]);
  3. }
复制代码
这句话大有讲究,它针对每个Build.targets对象中的每一个target,用targ范指,都执行同一个操作,addExecutable("prog",targ,targ.platform).addObjects([“prog.c"]);
Package模块有很多函数,其中addExecutabe执行了添加构建模块所谓的所有信息。"prog"是可执行文件的名字也是.cfg文件的名 字。targ是编译的目标,targ.platform是目标所在的平台,target有一个platform属性,它有默认值,可以在 config.bld中配置。addexecutable根据不同的target返回一个不同类型XDCscript类型,不同的XDCscript调用 的addObject自然也就一样。addObject函数枚举需要进行编译的文件。我们看一下config.bld中的内容,更有助于理解:
  1. j@j-desktop:~/test/examples/lesson5$ cat ../config.bld
  2. /*
  3. *  ======== config.bld ========
  4. */

  5. var Build = xdc.useModule('xdc.bld.BuildEnvironment');

  6. var C64P = xdc.useModule('ti.targets.C64P');
  7. var GCC = xdc.useModule('gnu.targets.Mingw');

  8. C64P.rootDir = /home/pheobe/davinci/cg6x_6_0_21_1;  /* modify to match %c6xtools% */
  9. C64P.platform = 'ti.platforms.sim64Pxx';

  10. GCC.rootDir = /usr/bin;   /* modify to match %gcctools% */

  11. Build.targets = [C64P, GCC];

复制代码
可见这里Build.targets里有两个target,一个是C64P,另一个是GCC.
C64P的platform域被指定为'ti.platforms.sim64Pxx,GCC则使用默认的。
现在一切都明了了,可以进行编译了:

xdc工具集中有两个最常用的命令,其他的基本用不到:
xs和xdc.其中xs己经用过了,它是用于启动xdcscript写的代码的。而xdc基本等价于make,用于package.bld之类的XDCscript写的代码的。
常用的xdc命令是xdc clean和xdc all,前者清楚上次编译出来的东西,后者按照package.bld编译全部。
嗯,编译时发现config.bld配置错了,examples目录下的,应为:
  1. /*
  2. *  ======== config.bld ========
  3. */

  4. var Build = xdc.useModule('xdc.bld.BuildEnvironment');

  5. var C64P = xdc.useModule('ti.targets.C64P');
  6. var GCC = xdc.useModule('gnu.targets.Linux86');

  7. C64P.rootDir ='/home/pheobe/davinci/cg6x_6_0_21_1';  /* modify to match %c6xtools% */
  8. C64P.platform = 'ti.platforms.sim64Pxx';

  9. GCC.rootDir ='/usr';   /* modify to match %gcctools% */

  10. Build.targets = [C64P, GCC];
复制代码
因为我们是在linux下的,找不到minggw,我们是纯的gcc啊。
下面编译:
  1. j@j-desktop:~/test/examples/lesson5$ xdc clean
  2. j@j-desktop:~/test/examples/lesson5$ xdc all
  3. making package.mak (because of package.bld) ...
  4. generating interfaces for package lesson5 (because package/package.xdc.inc is older than package.xdc) ...
  5. configuring prog.x64P from package/cfg/prog_x64P.cfg ...
  6. cl64P prog.c ...
  7. cl64P package/cfg/prog_x64P.c ...
  8. lnk64P prog.x64P ...
  9. configuring prog.x86U from package/cfg/prog_x86U.cfg ...
  10. cl86U prog.c ...
  11. cl86U package/cfg/prog_x86U.c ...
  12. lnk86U prog.x86U ...
  13. all files complete.
复制代码
测试:
  1. j@j-desktop:~/test/examples/lesson5$ xdc test
  2. running prog.x64P ...
  3. Hello World
  4. running prog.x86U ...
  5. Hello World

复制代码


第五课搞定了。


第六课:
上一节课我们讲到了包,但是我们的包里并没有什么东西,这一节课我们讲的叫模块,并且会涉及到XDC编程中的一个常用技巧,即把C语言中的常量写成可配置的模块参数。
我们的模块名字叫做Talker,它在文件夹lesson6里面,也在包lesson6里面,lesson6里面有一个文件package.xdc来描述这个模块,但这里面只是给了一个声明,但并没有说明这个模块的详细属性,详细的属性写在Talker.xdc里面。
  1. j@j-desktop:~/test/examples/lesson5$ cd ../lesson6
  2. j@j-desktop:~/test/examples/lesson6$ cat package.xdc
  3. /*
  4. *  ======== lesson6/package.xdc ========
  5. */

  6. /*! Contains our first module [RTSC Module Primer] */
  7. package lesson6 {
  8.     module Talker;
  9. };

复制代码
先不谈Talker.xdc,这里先看一下客户程序怎么用这个模块:
  1. j@j-desktop:~/test/examples/lesson6$ cat prog.c
  2. /*
  3. *  ======== lesson6/prog.c ========
  4. */

  5. #include <lesson6/Talker.h>

  6. Int main()
  7. {
  8.     Talker_print();
  9.     return 0;
  10. }

  11. j@j-desktop:~/test/examples/lesson6$ cat prog.cfg
  12. /*
  13. *  ======== lesson6/prog.cfg ========
  14. */

  15. var Talker = xdc.useModule('lesson6.Talker');

  16. Talker.text = "Goodnight Moon";
  17. Talker.count = 3;


复制代码
prog.c中调用了Talker的print函数,而prog.cfg中对Talker.text和.count属性进行了配置。

现在我们可以看Talker.xdc了,这个文件定义了Talker模块的详细属性。它是由XDCspec,一种与C差不多的语言写的。我们注意到 prog.c中include了lesson6/Talker.h,这个文件是不用手写的,XDC会自动根据Talker.xdc生成talker.h.
  1. j@j-desktop:~/test/examples/lesson6$ xdc clean
  2. j@j-desktop:~/test/examples/lesson6$ ls
  3. lib          package.xdc  prog.cfg  Talker.xdc
  4. package.bld  prog.c       Talker.c  Talker.xs

复制代码
看,没有talker.h
  1. j@j-desktop:~/test/examples/lesson6$ cat Talker.xdc
  2. /*
  3. *  ======== lesson6/Talker.xdc ========
  4. */

  5. /*! Our first module */
  6. module Talker {

  7.     /*! What to say */
  8.     config String text = "Hello World";
  9.     /*! How many times */
  10.     config Int count = 1;

  11.     /*! Say it */
  12.     Void print();
  13. }

复制代码
看,上面对应的东西都与标准C语言头文件对应的,函数声明,常量声明并初始化,注意,这里的count和text最终都会转化为常量extern const  而config关键字则指明,对于某些优化过程,也可以将count和text视为#define来优化。
Talker.xdc仅是模块的声明,其实现部分写在Talker.c中。
  1. j@j-desktop:~/test/examples/lesson6$ cat Talker.c
  2. /*
  3. *  ======== lesson6/Talker.c ========
  4. */

  5. #include <xdc/runtime/System.h>
  6. #include "package/internal/Talker.xdc.h"

  7. Void Talker_print()
  8. {
  9.     Int i;
  10.     for (i = 0; i < Talker_count; i++) {
  11.         System_printf("%s\n", Talker_text);
  12.     }
  13. }

复制代码
上面的代码中有两个头文件,最后一个是称为内部头文件,package/internal/Talker.xdc.h,显然不存在Talker.xdc.h文件,也没有internal文件夹,这是在编译时才产生的. 这种内部头文件必须写有所有其他头文件之后。这里写了Talker的print函数的实现。
对应prog.c和jprog.cfg,Talker.c也有一个Talker.xs文件:
  1. j@j-desktop:~/test/examples/lesson6$ cat Talker.xs
  2. /*
  3. *  ======== lesson6/Talker.xs ========
  4. */

  5. function module$use()
  6. {
  7.     xdc.useModule('xdc.runtime.System');
  8. }

复制代码
大家是否还记得useModule对应着.c文件中的include指令。这里显然没包括内部头文件,除了内部头文件,Talker.c中还包含了:#include <xdc/runtime/System.h>
这里的function module$use()表明函数体的内容是某个外部函数调用useModule(lesson6.Talker)时返回的语句。
我们看prog.cfg里有一句:
  1. j@j-desktop:~/test/examples/lesson6$ cat prog.cfg
  2. /*
  3. *  ======== lesson6/prog.cfg ========
  4. */

  5. var Talker = xdc.useModule('lesson6.Talker');

  6. Talker.text = "Goodnight Moon";
  7. Talker.count = 3;

复制代码
这实际上做在prog.cfg中展开成xdc.useModule('xdc.runtime.System').
最终是xdc.useModule('lesson6.Talker')对应prog.c中的#include <lesson6/Talker.h>,而xdc.useModule('xdc.runtime.System')对应的是 Talker.c中的#include <xdc/runtime/System.h>。

另外还有一个函数module$validate可以用来验证某个条件是否成立,不成立最终可能停止编译。
下面可以编译了:
  1. j@j-desktop:~/test/examples/lesson6$ xdc all,64P
  2. generating interfaces for package lesson6 (because package/package.xdc.inc is older than package.xdc) ...
  3.     translating Talker
  4. cl64P Talker.c ...
  5. cl64P package/package_lesson6.c ...
  6. archiving package/lib/lib/lesson6/Talker.o64P package/lib/lib/lesson6/package/package_lesson6.o64P into lib/lesson6.a64P ...
  7. configuring prog.x64P from package/cfg/prog_x64P.cfg ...
  8. cl64P prog.c ...
  9. cl64P package/cfg/prog_x64P.c ...
  10. lnk64P prog.x64P ...
  11. j@j-desktop:~/test/examples/lesson6$ xdc test,64P
  12. running prog.x64P ...
  13. Goodnight Moon
  14. Goodnight Moon
  15. Goodnight Moon

复制代码
下面我们可以看看编译前后的文件变化:
前:
  1. j@j-desktop:~/test/examples/lesson6$ xdc clean
  2. j@j-desktop:~/test/examples/lesson6$ ls
  3. lib          package.xdc  prog.cfg  Talker.xdc
  4. package.bld  prog.c       Talker.c  Talker.xs

复制代码
后:
  1. j@j-desktop:~/test/examples/lesson6$ ls
  2. lib      package.bld  package.xdc  prog.cfg   Talker.c  Talker.xdc
  3. package  package.mak  prog.c       prog.x64P  Talker.h  Talker.xs

复制代码
我们看到生成了Talker.h头文件,package.mak也是生成用来指导make编译的。prog.x64P是DSP的可执行文件。package是一个文件夹:
  1. j@j-desktop:~/test/examples/lesson6$ ls package
  2. build.cfg  internal     lesson6.sch      package.defs.h     package.xdc.dep
  3. cfg        lesson6.ccs  lib              package.doc.xml    package.xdc.inc
  4. external   lesson6.pjt  package.bld.xml  package_lesson6.c  rel

复制代码
我们看到现在有internal文件夹了,下面会不会有Talker.xdc.h呢?
  1. j@j-desktop:~/test/examples/lesson6$ ls package/internal/
  2. Talker.xdc.h

复制代码
有。
  1. j@j-desktop:~/test/examples/lesson6$ cat Talker.h |grep text
  2.     String Talker_text;
  3. typedef xdc_String CT__lesson6_Talker_text;
  4. __extern __FAR__ const CT__lesson6_Talker_text lesson6_Talker_text__C;
  5. #define lesson6_Talker_text (lesson6_Talker_text__C)
  6. #define Talker_text lesson6_Talker_text

复制代码
我们可以看到Talker的text域的确是#define的。
我试了下去掉config,但是编译不通过了,呵呵。
好,第六课结束。

这个文章实际上是为读示例代码服务的,下面转而进入读代码系统的第四篇: codec engine代码阅读四---CE_DIR/examples/ti/sdo/ce/examles/codecs/videnc_copy(http://alphamailpost.blog.163.com/blog/static/20111808120127219241667/)


稍微总结了一下几个文件之间的关系,有不对的地方还请楼主改正:
prog.cfg中的var Talker = xdc.useModule('lesson6.Talker');对应prog.c中的#include <lesson6/Talker.h>
package.xdc:用来描述模块,一般只进行声明,
package lesson6 {

    module Talker;

};
块的详细描述在Talker.xdc中,进行了函数的声明,常量的声明和初始化。
/*! Our first module */

module Talker {



    /*! What to say */

    config String text = "Hello World"; //这里的config相当于#define

    /*! How many times */

    config Int count = 1;



    /*! Say it */

    Void print();

}
函数的实现在Talker.c中
#include <xdc/runtime/System.h>

#include "package/internal/Talker.xdc.h"(内部声明文件,可能有也可能在编译阶段生成,这种内部头文件必须写在所有其他头文件之后)



Void Talker_print()

{

    Int i;

    for (i = 0; i < Talker_count; i++) {

        System_printf("%s\n", Talker_text);

    }

}
Talker.c文件也有一个对应的文件Talker.xs。跟prog.c和prog.cfg的对应关系是一样的,只是Talker.xs中没有加Talker.c中包含的内部头文件
function module$use() //表明函数体的内容是某个外部函数调用useModule(lesson6.Talker)时返回的语句 ,这句没明白啥意思。
{
    xdc.useModule('xdc.runtime.System');
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值