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然后解压,
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 .
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
int main()
{
System_printf("Hello World
");
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
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮