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
复制代码
然后第一步,
添加环境变量
,也就是Assigning environment variables节,我的xdc tools所在的文件夹为:/home/pheobe/davinci/xdctools_3_10_05_61/我先把这个文件导出到PATH变量中,这样我使用文件夹下的xs和xdc文件就不用打完整路径了:
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/
复制代码
然后我们要把xdcpath设成我们的examples文件夹:
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;
复制代码
按照文档上所说:xs xdc.tools.path -p得到的应该是xdctools的搜索路径,现在它包括XDCPATH中的和PATH中的.
然后是告诉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];
复制代码
到这里Lesson0就完成了,然后
进入lesson1
.
j@j-desktop:~/test/examples$ cd lesson1 j@j-desktop:~/test/examples/lesson1$ ls makefile prog.c prog.cfg
复制代码
这里有三个文件,C语言文件就是prog.c:
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; }
复制代码
另一个是prog.cfg
j@j-desktop:~/test/examples/lesson1$ cat prog.cfg /* * ======== lesson1/prog.cfg ======== */ 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:
j@j-desktop:~/test/examples/lesson1$ cat makefile ## -------- lesson1/makefile -------- ## -include ../common.mak
复制代码
它只是包含了一下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.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
然后编译:
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
复制代码
编译生成prog.ojb文件.这里面到compiler.opt做为输入之一.
然后是链接:
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
复制代码
生成了prog.out文件,输入有linker.cmd
编译选项为:
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模块,所有元程序meta-program中就要xdc.useModule('acme.utils.Bench');
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
复制代码
编译出错了,最开始的位置是
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变量中,所以现在,我们这样做:
xs xdc.tools.path -pxs: command not found
复制代码
哦,这是因为昨天做上一课时export PATH=$PATH:/home/pheobe/davinci/xdctools_3_10_05_61/这一步把$PATH加下到环境变量中只是临时的,关机重启就没了,现在我们把它加在.bashrc中:
然后把export PATH=$PATH:/home/pheobe/davinci/xdctools_3_10_05_61/加到文件结尾处。
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;
复制代码
这下刚刚的问题解决了,我们发现昨天做的另一项工作也报销了,还要重新把当前的examples路径加到$XDCPATH下面,另外,我们还得找到acme.utils包的所在位置,其实它也在我们examples目录下,省事了。
追加:export XDCPATH=/home/j/test/examples
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
复制代码
可以两次输出是同样的,要改变seed才能输出不同的内容,改变range会改变输出范围:
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");
复制代码
rgInstStatic甚到在C语言文件里都没有声明。
它是在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});
复制代码
第五课,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.前者声明这个包的名字,后者描述了这个的创建方法。
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 */ };
复制代码
去掉无用的注释,其实就是:
这有点像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"]); }
复制代码
这句话大有讲究,它针对每个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中的内容,更有助于理解:
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];
复制代码
可见这里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目录下的,应为:
/* * ======== 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];
复制代码
因为我们是在linux下的,找不到minggw,我们是纯的gcc啊。
下面编译:
j@j-desktop:~/test/examples/lesson5$ xdc clean j@j-desktop:~/test/examples/lesson5$ xdc all making package.mak (because of package.bld) ... generating interfaces for package lesson5 (because package/package.xdc.inc is older than package.xdc) ... configuring prog.x64P from package/cfg/prog_x64P.cfg ... cl64P prog.c ... cl64P package/cfg/prog_x64P.c ... lnk64P prog.x64P ... configuring prog.x86U from package/cfg/prog_x86U.cfg ... cl86U prog.c ... cl86U package/cfg/prog_x86U.c ... lnk86U prog.x86U ... all files complete.
复制代码
测试:
j@j-desktop:~/test/examples/lesson5$ xdc test running prog.x64P ... Hello World running prog.x86U ... Hello World
复制代码
第五课搞定了。
第六课: 上一节课我们讲到了包,但是我们的包里并没有什么东西,这一节课我们讲的叫模块,并且会涉及到XDC编程中的一个常用技巧,即把C语言中的常量写成可配置的模块参数。 我们的模块名字叫做Talker,它在文件夹lesson6里面,也在包lesson6里面,lesson6里面有一个文件package.xdc来描述这个模块,但这里面只是给了一个声明,但并没有说明这个模块的详细属性,详细的属性写在Talker.xdc里面。
j@j-desktop:~/test/examples/lesson5$ cd ../lesson6 j@j-desktop:~/test/examples/lesson6$ cat package.xdc /* * ======== lesson6/package.xdc ======== */ /*! Contains our first module [RTSC Module Primer] */ package lesson6 { module Talker; };
复制代码
先不谈Talker.xdc,这里先看一下客户程序怎么用这个模块:
j@j-desktop:~/test/examples/lesson6$ cat prog.c /* * ======== lesson6/prog.c ======== */ #include <lesson6/Talker.h> Int main() { Talker_print(); return 0; } j@j-desktop:~/test/examples/lesson6$ cat prog.cfg /* * ======== lesson6/prog.cfg ======== */ var Talker = xdc.useModule('lesson6.Talker'); Talker.text = "Goodnight Moon"; 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.
j@j-desktop:~/test/examples/lesson6$ xdc clean j@j-desktop:~/test/examples/lesson6$ ls lib package.xdc prog.cfg Talker.xdc package.bld prog.c Talker.c Talker.xs
复制代码
看,没有talker.h
j@j-desktop:~/test/examples/lesson6$ cat Talker.xdc /* * ======== lesson6/Talker.xdc ======== */ /*! Our first module */ module Talker { /*! What to say */ config String text = "Hello World"; /*! How many times */ config Int count = 1; /*! Say it */ Void print(); }
复制代码
看,上面对应的东西都与标准C语言头文件对应的,函数声明,常量声明并初始化,注意,这里的count和text最终都会转化为常量extern const 而config关键字则指明,对于某些优化过程,也可以将count和text视为#define来优化。
Talker.xdc仅是模块的声明,其实现部分写在Talker.c中。
j@j-desktop:~/test/examples/lesson6$ cat Talker.c /* * ======== lesson6/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); } }
复制代码
上面的代码中有两个头文件,最后一个是称为内部头文件,package/internal/Talker.xdc.h,显然不存在Talker.xdc.h文件,也没有internal文件夹,这是在编译时才产生的.
这种内部头文件必须写有所有其他头文件之后
。这里写了Talker的print函数的实现。
对应prog.c和jprog.cfg,Talker.c也有一个Talker.xs文件:
j@j-desktop:~/test/examples/lesson6$ cat Talker.xs /* * ======== lesson6/Talker.xs ======== */ function module$use() { xdc.useModule('xdc.runtime.System'); }
复制代码
大家是否还记得useModule对应着.c文件中的include指令。这里显然没包括内部头文件,除了内部头文件,Talker.c中还包含了:#include <xdc/runtime/System.h>
这里的function module$use()表明函数体的内容是某个外部函数调用useModule(lesson6.Talker)时返回的语句。
我们看prog.cfg里有一句:
j@j-desktop:~/test/examples/lesson6$ cat prog.cfg /* * ======== lesson6/prog.cfg ======== */ var Talker = xdc.useModule('lesson6.Talker'); Talker.text = "Goodnight Moon"; 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可以用来验证某个条件是否成立,不成立最终可能停止编译。
下面可以编译了:
j@j-desktop:~/test/examples/lesson6$ xdc all,64P generating interfaces for package lesson6 (because package/package.xdc.inc is older than package.xdc) ... translating Talker cl64P Talker.c ... cl64P package/package_lesson6.c ... archiving package/lib/lib/lesson6/Talker.o64P package/lib/lib/lesson6/package/package_lesson6.o64P into lib/lesson6.a64P ... configuring prog.x64P from package/cfg/prog_x64P.cfg ... cl64P prog.c ... cl64P package/cfg/prog_x64P.c ... lnk64P prog.x64P ... j@j-desktop:~/test/examples/lesson6$ xdc test,64P running prog.x64P ... Goodnight Moon Goodnight Moon Goodnight Moon
复制代码
下面我们可以看看编译前后的文件变化:
前:
j@j-desktop:~/test/examples/lesson6$ xdc clean j@j-desktop:~/test/examples/lesson6$ ls lib package.xdc prog.cfg Talker.xdc package.bld prog.c Talker.c Talker.xs
复制代码
后:
j@j-desktop:~/test/examples/lesson6$ ls lib package.bld package.xdc prog.cfg Talker.c Talker.xdc package package.mak prog.c prog.x64P Talker.h Talker.xs
复制代码
我们看到生成了Talker.h头文件,package.mak也是生成用来指导make编译的。prog.x64P是DSP的可执行文件。package是一个文件夹:
j@j-desktop:~/test/examples/lesson6$ ls package build.cfg internal lesson6.sch package.defs.h package.xdc.dep cfg lesson6.ccs lib package.doc.xml package.xdc.inc external lesson6.pjt package.bld.xml package_lesson6.c rel
复制代码
我们看到现在有internal文件夹了,下面会不会有Talker.xdc.h呢?
j@j-desktop:~/test/examples/lesson6$ ls package/internal/ Talker.xdc.h
复制代码
有。
j@j-desktop:~/test/examples/lesson6$ cat Talker.h |grep text String Talker_text; typedef xdc_String CT__lesson6_Talker_text; __extern __FAR__ const CT__lesson6_Talker_text lesson6_Talker_text__C; #define lesson6_Talker_text (lesson6_Talker_text__C) #define Talker_text lesson6_Talker_text
复制代码
我们可以看到Talker的text域的确是#define的。
我试了下去掉config,但是编译不通过了,呵呵。
好,第六课结束。