DSP

XDC工具使用示例

2019-07-13 16:33发布

[转载] http://blog.csdn.net/chenbang110/article/details/8771803
这个文章实际上是为读示例代码服务的,下面转而进入读代码系统的第四篇:codec engine代码阅读四---CE_DIR/examples/ti/sdo/ce/examles/codecs/videnc_copy


在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. 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

  6. int main()
  7. {
  8.     System_printf("Hello World ");
  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