原文地址: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.

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样本代码:

  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. ./setpaths.sh
  8. #  Define search paths for included packages
  9. export XDCPATH="$CE_INSTALL_DIR/packages"
  10. #  Define options for execution
  11. export XDCBUILDCFG=$(pwd)"/config.bld
  12. #  Execute xdc command to make all packages
  13. /opt/DVS357/dvevm_1_20/xdc_2_94/xdc $@ -P *
  14. #! /bin/sh
  15. #  import install paths
  16. #  putting the first period before the shell invokation keeps the changes
  17. #      to environment variables set here. Otherwise, changes to environment
  18. #      are only within the context of the executed script
  19. ./setpaths.sh
  20. #  Define search paths for included packages
  21. export XDCPATH="$CE_INSTALL_DIR/packages"
  22. #  Define options for execution
  23. export XDCBUILDCFG=$(pwd)"/config.bld
  24. #  Execute xdc command to make all packages
  25. /opt/DVS357/dvevm_1_20/xdc_2_94/xdc $@ -P *

Setpaths.sh样本代码:

  1. #!/bin/sh
  2. export DVEVM_INSTALL_DIR="/opt/DVS357/dvevm_1_20/"
  3. export BIOS_INSTALL_DIR=$DVEVM_INSTALL_DIR/bios_5_31_01
  4. export CG_INSTALL_DIR=$DVEVM_INSTALL_DIR/cg6x_6_0_14
  5. export CMEM_INSTALL_DIR=$DVEVM_INSTALL_DIR/cmem_1_02
  6. export CE_INSTALL_DIR=$DVEVM_INSTALL_DIR/codec_engine_1_10_01
  7. export CS_INSTALL_DIR=$DVEVM_INSTALL_DIR/codec_servers_1_23
  8. export DSPLINK_INSTALL_DIR=$DVEVM_INSTALL_DIR/dsplink_1_30_08_02
  9. export FMWK_INSTALL_DIR=$DVEVM_INSTALL_DIR/framework_components_1_10_04
  10. export XDAIS_INSTALL_DIR=$DVEVM_INSTALL_DIR/xdais_5_10
  11. export XDC_INSTALL_DIR=$DVEVM_INSTALL_DIR/xdc_2_94
  12. export PATH=$XDC_INSTALL_DIR:$PATH
  13. #!/bin/sh
  14. export DVEVM_INSTALL_DIR="/opt/DVS357/dvevm_1_20/"
  15. export BIOS_INSTALL_DIR=$DVEVM_INSTALL_DIR/bios_5_31_01
  16. export CG_INSTALL_DIR=$DVEVM_INSTALL_DIR/cg6x_6_0_14
  17. export CMEM_INSTALL_DIR=$DVEVM_INSTALL_DIR/cmem_1_02
  18. export CE_INSTALL_DIR=$DVEVM_INSTALL_DIR/codec_engine_1_10_01
  19. export CS_INSTALL_DIR=$DVEVM_INSTALL_DIR/codec_servers_1_23
  20. export DSPLINK_INSTALL_DIR=$DVEVM_INSTALL_DIR/dsplink_1_30_08_02
  21. export FMWK_INSTALL_DIR=$DVEVM_INSTALL_DIR/framework_components_1_10_04
  22. export XDAIS_INSTALL_DIR=$DVEVM_INSTALL_DIR/xdais_5_10
  23. export XDC_INSTALL_DIR=$DVEVM_INSTALL_DIR/xdc_2_94
  24. 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. //  The build phase cycles through the arrays of build targets and profiles
  15. //       and adds an executable for each combination
  16. for (var i = 0; i < targs.length; i++) {
  17. for(var j = 0; j < profiles.length; j++){
  18. Pkg.addExecutable( basename + "_" + profiles[j], targs[i],
  19. targs[i].platform, {
  20. cfgScript: null,
  21. profile: profiles[j],
  22. }
  23. ).addObjects( csources );
  24. }
  25. }
  26. var targs = [MVArm9, Linux86];
  27. var profiles = ["debug", "release"];
  28. //  Define the base name for the executable(s) built
  29. var basename = "app";
  30. //  The following code uses the java.io.File.list() method to generate an array
  31. //      of all files in the current directory ('.') and then sorts out .c files
  32. var sources = java.io.File('.').list();
  33. var csources = [];
  34. for (var i = 0; i < sources.length; i++){
  35. if(String(sources[i]).match(/.*\.c$/))
  36. csources.push(sources[i]);
  37. }
  38. //  The build phase cycles through the arrays of build targets and profiles
  39. //       and adds an executable for each combination
  40. for (var i = 0; i < targs.length; i++) {
  41. for(var j = 0; j < profiles.length; j++){
  42. Pkg.addExecutable( basename + "_" + profiles[j], targs[i],
  43. targs[i].platform, {
  44. cfgScript: null,
  45. profile: profiles[j],
  46. }
  47. ).addObjects( csources );
  48. }
  49. }

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');
}

关于XDC工具的文章相关推荐

  1. UCF转XDC工具说明文档

    目录 1 概述 2 工具的使用说明 2.1 UCF的操作说明 2.2 XDC的操作说明 2.3 UCF与XDC位置切换的地方 3 附件 1 概述 本文用于讲解FPGA中的约束文件UCF转XDC格式工具 ...

  2. PDF阅读器开关“手型工具阅读文章”功能

    1.问题描述 PDF文档打开时,光标显示的手型工具里面有个箭头,一点击鼠标左键,就跳转到下一页了.并且会回到默认放大页面,给阅读带来很多不便. 2.原因 因为这类PDF文档中带有"文章&qu ...

  3. 电子文档翻译工具实现文章的批量翻译

    电子文档翻译工具通过对接谷歌翻译.有道词典和百度翻译等平台翻译api接口,实现电子文档的批量翻译,对于长篇分章节文档, 可以通过存放同一文件夹,实现整篇文档的批量挂机翻译.批量翻译后编辑导出本地. 电 ...

  4. 微软商业智能BI知识整合篇-五大工具产品系列文章

    在最近2个月时间里,笔者尝试将自身在企业级商业智能BI的知识及经验进行梳理,以文章的方式输送给广大读者们阅读. 笔者同样是非科班专业人员,但在过往的摸索过程中,积累的系列知识足够应付一般性地企业级商业 ...

  5. seo伪原创工具_文章伪原创工具哪个好用(伪原创工具有哪些)

    从事网站seo优化的工作基本上每天都会和文章打交道,因为网站的排名与网站的收录关系是非常大的,网站的收录又和文章息息相关,搜索引擎的胃口是比较喜欢新的内容.原创的内容,而对于一些文案功底比较没那么好的 ...

  6. seo搜索引擎优化-SEO优化教程附关键词工具以及文章采集软件

    seo搜索引擎优化,什么是SEO搜索引擎优化.简单点来说就是用户通过搜索引擎搜索想要的结果第一时间找到你的网站.那我们怎么做好搜索引擎优化呢?要做好搜索引擎优化首先我们得了解首页引擎.怎么才能快速的了 ...

  7. 批量在线伪原创工具,文章聚合采集发布工具

    AI在线伪原创工具有什么功能?目前很多站长通过在线伪原创工具文章聚合优化自己的网站,对于这个方式,博主认为只要能为用户提供优质的内容和服务就是可取的. 网站内容是我们的网站的重要组成部分,通过在线伪原 ...

  8. 免费伪原创工具,在线伪原创工具,文章采集发布伪原创工具

    伪原创工具可以帮助我们有很多站的站长收集网站资源进行网站运营和数据整合.其实从互联网开始到今天,一直有站长在从事内容采集.抓取.整合. 从早期没有工具手工复制,到现在可以使用各种采集器.爬虫脚本和伪原 ...

  9. WordPress 开发带缩略图的小工具最新文章

    在我们的wordpress边栏想显示我们发布的最新文章,并且带上缩略图,很多插件能帮我们完成这个功能,其实我们完全可以自己DIY,和wordpress原生态的小工具一样,直接拖过去就OK了,这里把流程 ...

  10. AI智能多语种翻译工具批量文章翻译发布

    AI智能多语种翻译工具适用于需要使用多种语言进行文章翻译和网站建设的小伙伴,多语种翻译工具对接了各大厂商的翻译接口,支持多种语种间的相互翻译和回译.多语种翻译工具特有的格式优化,让我们在翻译的同时保持 ...

最新文章

  1. 【GoLang】GoLang GOPATH 工程管理 最佳实践
  2. 注意 ExecuteNonQuery() 返回值
  3. 机器学习--线性回归、逻辑回归
  4. 普通进程的守护进程化
  5. ‘FactorAnalyzer‘ object has no attribute ‘analyze‘和fa.loadings改成fa.loadings报错解决
  6. 3dmax高版本转低版本插件_视频编辑干货资料:低版本打开高版本pr文件
  7. Cookie、Session 和 Token区别
  8. java版spring cloud+spring boot+redis社交电子商务平台-spring-cloud-config
  9. 关于Spring Boot 这可能是全网最好的知识点总结
  10. C# 各种常用集合类型的线程安全版本
  11. 低照度图像修复方法总结
  12. 华硕笔记本linux触摸板驱动,华硕触摸板驱动_华硕a豆笔记本触摸板驱动下载安装 v11.0.0.30 官方正式版-126g驱动网...
  13. 个人信贷不良资产成因和策略
  14. 优酷动漫押注“新国风”,能否追回被B站、腾讯赶超的那些年?
  15. 【SAP-PS笔记】基于WBS直接录入金额做结果分析的项目计划成本
  16. STM8S003引脚坑(开发过的人都知道)
  17. 如何用Python画出玫瑰曲线和蝴蝶曲线
  18. 简易社团管理系统(jsp+servlet+三件套+未完成)
  19. Hadoop 大数据生态框架--总述
  20. 功能安全是什么?FSoE是什么?Safety over EtherCAT

热门文章

  1. 科三 二十里铺(带视频)
  2. 文件夹重命名导致软件图标不显示问题解决
  3. CAD转换PDF文件失败,打开后内容是空白的
  4. uniapp开发App调用微信授权登陆
  5. php 加密解密函数 sha,使用sha1()函数进行加密-php加密技术
  6. Python安装shapely包出现WindowsError: [Error 126]解决方案
  7. Python摄氏度和华氏度的转换
  8. ps景观平面图转鸟瞰图_用ps做鸟瞰图的方法步骤
  9. 高德地图哪个语音包最好_高德语音导航怎么呼叫?高德地图语音包怎么设置
  10. android模拟器安装frida