http://www.usr.cc/thread-52037-1-1.html
这个文章实际上是为读示例代码服务的,下面转而进入读代码系统的第四篇: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然后解压,
- j@j-desktop:~/test$ cd examples/
- j@j-desktop:~/test/examples$ ls
- acme common.mak lesson1 lesson3 lesson5
- bravo config.bld lesson2 lesson4 lesson6
- j@j-desktop:~/test/examples$ echo $PATH
- /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
- j@j-desktop:~/test/examples$ export PATH=$PATH:/home/pheobe/davinci/xdctools_3_10_05_61/
- j@j-desktop:~/test/examples$ echo $PATH
- /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/pheobe/davinci/xdctools_3_10_05_61/
- j@j-desktop:~/test/examples$ export XDCPATH=/home/pheobe/test/examples/j@j-desktop:~/test/examples$ echo $XDCPATH
- /home/pheobe/test/examples/
- j@j-desktop:~/test/examples$ xs xdc.tools.path -p /home/pheobe/test/examples/;/home/pheobe/davinci/xdctools_3_10_05_61/packages;
然后是告诉XDC你的编译器所在的路径,我手头也没有板子,就是直接编译与我的电脑用了,所以我的编译器是gcc:
- 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编辑之后为:
- j@j-desktop:~/test/examples$ cat config.bld
- /*
- * ======== config.bld ========
- */
-
- var Build = xdc.useModule('xdc.bld.BuildEnvironment');
-
- var C64P = xdc.useModule('ti.targets.C64P');
- var GCC = xdc.useModule('gnu.targets.Mingw');
-
- C64P.rootDir = /home/pheobe/davinci/cg6x_6_0_21_1; /* modify to match %c6xtools% */
- C64P.platform = 'ti.platforms.sim64Pxx';
-
- GCC.rootDir = /usr/bin; /* modify to match %gcctools% */
-
- Build.targets = [C64P, GCC];
- j@j-desktop:~/test/examples$ cd lesson1
- j@j-desktop:~/test/examples/lesson1$ ls
- makefile prog.c prog.cfg
- j@j-desktop:~/test/examples/lesson1$ cat prog.c
- /*
- * ======== lesson1/prog.c ========
- */
-
- #include <xdc/runtime/System.h>
-
- int main()
- {
- System_printf("Hello World\n");
- return 0;
- }
- j@j-desktop:~/test/examples/lesson1$ cat prog.cfg
- /*
- * ======== lesson1/prog.cfg ========
- */
-
- var System = xdc.useModule('xdc.runtime.System');
这个元程序,说整个程序要使用一个完整名字为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:
- j@j-desktop:~/test/examples/lesson1$ cat makefile
- ## -------- lesson1/makefile -------- ##
-
- -include ../common.mak
我们只要make all就可以编译了:
- j@j-desktop:~/test/examples/lesson1$ make all
- /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 ...
- /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -@cfgsite/compiler.opt -c prog.c
- /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
- j@j-desktop:~/test/examples/lesson1$ ls
- cfgsite makefile prog.c prog.cfg prog.obj prog.out
从makefile我们知道,make究竟做什么都在common.mak中指定的,我们来看all选项:
- 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
- all : prog.out
-
-
- ## -------- config-rule -------- ##
- cfgsite/linker.cmd cfgsite/compiler.opt : prog.cfg
- /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.cfgmaking 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$ lscfgsite makefile prog.c prog.cfgj@j-desktop:~/test/examples/lesson1$ ls cfgsitecompiler.opt custom.mak package package.mak package.xsconfig.bld linker.cmd package.bld package.xdc
然后编译:
- j@j-desktop:~/test/examples/lesson1$ /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -@cfgsite/compiler.opt -c prog.c
- j@j-desktop:~/test/examples/lesson1$ ls
- cfgsite makefile prog.c prog.cfg prog.obj
然后是链接:
- 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
- j@j-desktop:~/test/examples/lesson1$ ls
- cfgsite makefile prog.c prog.cfg prog.obj prog.out
编译选项为:
- j@j-desktop:~/test/examples/lesson1$ cat cfgsite/compiler.opt
- -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"
- j@j-desktop:~/test/examples/lesson1$ cat cfgsite/linker.cmd
- /*
- * Do not modify this file; it is automatically generated from the template
- * linkcmd.xdt in the ti.targets package and will be overwritten.
- */
-
- /*
- * put '"'s around paths because, without this, the linker
- * considers '-' as minus operator, not a file name character.
- */
-
-
-
- -l"/home/j/test/examples/lesson1/cfgsite/package/cfg/prog_x64P.o64P"
- -l"/home/pheobe/davinci/xdctools_3_10_05_61/packages/ti/targets/rts6000/lib/ti.targets.rts6000.a64P"
- -l"/home/pheobe/davinci/xdctools_3_10_05_61/packages/ti/targets/rts6000/lib/boot.a64P"
-
-
- --args 0x200
-
-
-
-
- -heap 0x1000
- -stack 0x1000
-
- MEMORY
- {
- IRAM (RWX) : org = 0x800000, len = 0x200000
- DDR : org = 0x80000000, len = 0x10000000
- }
-
- /*
- * Linker command file contributions from all loaded packages:
- */
- /* Content from xdc (null): */
-
- /* Content from xdc.corevers (null): */
-
- /* Content from xdc.services.global (null): */
-
- /* Content from xdc.shelf (null): */
-
- /* Content from xdc.services.spec (null): */
-
- /* Content from xdc.services.intern.xsr (null): */
-
- /* Content from xdc.services.intern.gen (null): */
-
- /* Content from xdc.services.intern.cmd (null): */
-
- /* Content from ti.catalog.c6000 (null): */
-
- /* Content from xdc.platform (null): */
-
- /* Content from xdc.cfg (null): */
-
- /* Content from ti.platforms.sim64Pxx (null): */
-
- /* Content from xdc.runtime (null): */
-
- /* Content from ti.targets.rts6000 (null): */
-
- /* Content from cfgsite (null): */
-
-
- /*
- * symbolic aliases for static instance objects
- */
- _xdc_runtime_Startup__EXECFXN__C = 1;
- _xdc_runtime_Startup__RESETFXN__C = 1;
-
- SECTIONS
- {
-
-
- .text: load >> DDR
- .switch: load >> DDR
- .stack: load > DDR
- .args: load > DDR align = 0x4 , fill = 0 { _argsize = 0x200; }
- xdc.noload: load >> DDR, type = NOLOAD
- .sysmem: load > DDR
- .far: load >> DDR
- .data: load >> DDR
- .cinit: load > DDR
- .bss: load > DDR
- .const: load >> DDR
- .pinit: load > DDR
- .cio: load >> DDR
-
- }
它的文档所在位置为: 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.
我们看看代码为:
- j@j-desktop:~/test/examples/lesson2$ cat prog.c
- /*
- * ======== lesson2/prog.c ========
- */
-
- #include <acme/utils/Bench.h>
- #include <xdc/runtime/System.h>
-
- int main()
- {
- Bench_begin("System_printf timing");
- System_printf("Hello World\n");
- Bench_end();
-
- return 0;
- }
- j@j-desktop:~/test/examples/lesson2$ cat prog.cfg
- /*
- * ======== lesson2/prog.cfg ========
- */
-
- var Bench = xdc.useModule('acme.utils.Bench');
- var System = xdc.useModule('xdc.runtime.System');
-
- Bench.enableFlag = true;
Bench模块可以用来测试,下面的代码Bench_begin表时开始测试,传入参数是一个字符串,但是这个字符串并不立刻输出,而是等Bench_end时才输出,并且最后还打印出从begin到end所经历的时间。
- j@j-desktop:~/test/examples/lesson2$ make all
- /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 ...
- 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.
- "/home/j/test/examples/lesson2/prog.cfg", line 5
- "./package/cfg/prog_x64P.cfg", line 762
- "./package/cfg/prog_x64P.cfg", line 717
- gmake: *** [package/cfg/prog_x64P.c] Error 1
- 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.
- make: *** [cfgsite/compiler.opt] Error 1
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.
- xs xdc.tools.path -pxs: command not found
哦,这是因为昨天做上一课时export PATH=$PATH:/home/pheobe/davinci/xdctools_3_10_05_61/这一步把$PATH加下到环境变量中只是临时的,关机重启就没了,现在我们把它加在.bashrc中:
- gedit ~/.bashrc
- j@j-desktop:~/test/examples/lesson2$ source ~/.bashrc
- j@j-desktop:~/test/examples/lesson2$ xs xdc.tools.path -p
- /home/pheobe/davinci/xdctools_3_10_05_61/packages;
- gedit ~/.bashrc
- j@j-desktop:~/test/examples/lesson2$ make clean
- rm -rf cfgsite *.obj *.out
- j@j-desktop:~/test/examples/lesson2$ make all
- /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 ...
- /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -@cfgsite/compiler.opt -c prog.c
- /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
- j@j-desktop:~/test/examples/lesson2$ make test
- /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.loader prog.out
- Hello World
- System_printf timing [2159]
xdctools_3_10_05_61/docs/docs/rtscpedia/RTSC_Module_Primer/RTSC_Module_Primer__Lesson_3.html
这里又是一个新模块: bravo.math.RandGen RandGen管理的是一个产生随机数序列的实例对象。实际的创建需要一组单独的参数。RandGen_create分配并初始化一个实例对象。它接收一个参数,类型为 RandGen_Params rgParams;它有一组默认值,你可以根据需要修改它的单个域,如:
- rgParams.range = 15;
- rgParams.seed = 3;
RandGen_next获得下一个随机数。
- j@j-desktop:~/test/examples/lesson3$ make all
- /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 ...
- /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -@cfgsite/compiler.opt -c prog.c
- /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
- j@j-desktop:~/test/examples/lesson3$ make test
- /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.loader prog.out
- 6 7 10 1 12 8 10 14 1 15
- j@j-desktop:~/test/examples/lesson3$ make test
- /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.loader prog.out
- 6 7 10 1 12 8 10 14 1 15
- j@j-desktop:~/test/examples/lesson3$ cat prog.c
- /*
- * ======== lesson3/prog.c ========
- */
-
- #include <bravo/math/RandGen.h>
- #include <xdc/runtime/System.h>
-
- #define COUNT 10
-
- Int main()
- {
- RandGen_Handle rgInst;
- RandGen_Params rgParams;
- Int i;
-
- RandGen_Params_init(&rgParams);
-
- rgParams.range = 150;
- rgParams.seed = 8;
- rgInst = RandGen_create(&rgParams, NULL);
-
- for (i = 0; i < COUNT; i++) {
- System_printf("%d ", RandGen_next(rgInst));
- }
- System_printf("\n");
-
- return 0;
- }
- j@j-desktop:~/test/examples/lesson3$ make clean
- rm -rf cfgsite *.obj *.out
- j@j-desktop:~/test/examples/lesson3$ make all
- /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 ...
- /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -@cfgsite/compiler.opt -c prog.c
- /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
- j@j-desktop:~/test/examples/lesson3$ make test
- /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.loader prog.out
- 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
依旧是楼上的那个模块,这里主要讲静态实例,实例的销毁。
先执行程序:
- j@j-desktop:~/test/examples/lesson3$ cd ../lesson4
- j@j-desktop:~/test/examples/lesson4$ make all
- /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 ...
- /home/pheobe/davinci/cg6x_6_0_21_1/bin/cl6x -q -@cfgsite/compiler.opt -c prog.c
- /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
- j@j-desktop:~/test/examples/lesson4$ make test
- /home/pheobe/davinci/xdctools_3_10_05_61/xs xdc.tools.loader prog.out
- dynamically-created instance:
- 6 7 10 1 12 8 10 14 1 15
-
- dynamically-constructed instance:
- 13 2 1 22 12 5 10 19 17 12
-
- statically-created instance:
- 12 5 3 11 11 19 5 1 15 0
- j@j-desktop:~/test/examples/lesson4$ cat prog.c
- /*
- * ======== lesson4/prog.c ========
- */
-
- #include <bravo/math/RandGen.h>
- #include <xdc/runtime/System.h>
-
- #include <xdc/cfg/global.h>
-
- #define COUNT 10
-
- Void printNums(RandGen_Handle rgInst, String label)
- {
- Int i;
-
- System_printf("%s:\n\t", label);
- for (i = 0; i < COUNT; i++) {
- System_printf("%d ", RandGen_next(rgInst));
- }
- System_printf("\n\n");
- }
-
- Int main()
- {
- RandGen_Handle rgInstHandle;
- RandGen_Struct rgInstStruct;
- RandGen_Params rgParams;
-
- RandGen_Params_init(&rgParams);
-
- rgParams.range = 15;
- rgParams.seed = 3;
- rgInstHandle = RandGen_create(&rgParams, NULL);
-
- rgParams.range = 25;
- rgParams.seed = 2;
- RandGen_construct(&rgInstStruct, &rgParams);
-
- printNums(rgInstHandle, "dynamically-created instance");
- printNums(RandGen_handle(&rgInstStruct), "dynamically-constructed instance");
- printNums(rgInstStatic, "statically-created instance");
-
- RandGen_delete(&rgInstHandle);
- RandGen_destruct(&rgInstStruct);
-
- return 0;
- }
代码很容易看,有三个对象,
动态创建对象的方法 :
- RandGen_Handle rgInstHandle;
- rgInstHandle = RandGen_create(&rgParams, NULL);
- RandGen_Struct rgInstStruct;
- RandGen_construct(&rgInstStruct, &rgParams);
- RandGen_handle(&rgInstStruct)//最后这里是从struct获得handle
- printNums(rgInstStatic, "statically-created instance");
它是在prog.cfg里声明的:
- j@j-desktop:~/test/examples/lesson4$ cat prog.cfg
- /*
- * ======== lesson4/prog.cfg ========
- */
-
- var Program = xdc.useModule('xdc.cfg.Program');
-
- var RandGen = xdc.useModule('bravo.math.RandGen');
- var System = xdc.useModule('xdc.runtime.System');
-
- Program.global["rgInstStatic"] = RandGen.create({range: 20, seed: 4});
- Program.global["rgInstStatic"] = RandGen.create({range: 20, seed: 4});
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.前者声明这个包的名字,后者描述了这个的创建方法。
- j@j-desktop:~/test/examples/lesson5$ ls
- package package.bld package.mak package.xdc prog.c prog.cfg
在 package.xdc 中,可以这样声明一个包:
- j@j-desktop:~/test/examples/lesson5$ cat package.xdc
- /*
- * ======== lesson5/package.xdc ========
- */
-
- /*! Our first package [RTSC Module Primer] */
- package lesson5 {
- /* module declarations normally go here */
- };
去掉无用的注释,其实就是:
- package lesson5{};
这有点像C语言的给构体,然而却不是,它是用 XDCspec 语言来写的。这里我们应该得到一个结论,examples下的Lesson5文件夹,对应一个包称为lessen5,但同样的文件夹lesson4却不是一个包,因为它下面没有package.xdc。]
另一个文件是package.bld ,它是用 XDCscript 写的。它的功能与makefile差不多。也用于控制程序的编译流程。
另外,lesson0中的config.bld也是XDCscript写的。config.bld通常放在XDCPATH指定的各个目录下,
- for each (var targ in Build.targets) {
- Pkg.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中的内容,更有助于理解:
- j@j-desktop:~/test/examples/lesson5$ cat ../config.bld
- /*
- * ======== config.bld ========
- */
-
- var Build = xdc.useModule('xdc.bld.BuildEnvironment');
-
- var C64P = xdc.useModule('ti.targets.C64P');
- var GCC = xdc.useModule('gnu.targets.Mingw');
-
- C64P.rootDir = /home/pheobe/davinci/cg6x_6_0_21_1; /* modify to match %c6xtools% */
- C64P.platform = 'ti.platforms.sim64Pxx';
-
- GCC.rootDir = /usr/bin; /* modify to match %gcctools% */
-
- Build.targets = [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目录下的,应为:
- /*
- * ======== config.bld ========
- */
-
- var Build = xdc.useModule('xdc.bld.BuildEnvironment');
-
- var C64P = xdc.useModule('ti.targets.C64P');
- var GCC = xdc.useModule('gnu.targets.Linux86');
-
- C64P.rootDir ='/home/pheobe/davinci/cg6x_6_0_21_1'; /* modify to match %c6xtools% */
- C64P.platform = 'ti.platforms.sim64Pxx';
-
- GCC.rootDir ='/usr'; /* modify to match %gcctools% */
-
- Build.targets = [C64P, GCC];
下面编译:
- j@j-desktop:~/test/examples/lesson5$ xdc clean
- j@j-desktop:~/test/examples/lesson5$ xdc all
- making package.mak (because of package.bld) ...