vxworks 笔记
1 安装
Vxworks 有两张安装盘,安装有以下步骤:
1) 安装tornado 2.2.1
使用第一张盘,注意安装时必须保证当前没有安装过tornado,如果安装过必须从注册表中清空所有的tornado;选择“ManualLicense”,即License手动安装
2) 安装BSP/Drivers
第一张盘和第二张盘都用了,不知什么东西,也不懂
3) 安装License
复制license.dat文件到某个位置,然后设置“系统环境变量”,指向这个文件license.dat,注意必须是“系统环境变量”,不能是“用户环境变量”
这就是手动安装License 环节。
安装完成,tornada 被安装到D:\Tornada2.2
本次任务是完成vxworks 环境下ppc 85xx系列的SDK发布环境,因此需要将之前准备好的ppc 85xx环境复制过来。当时直接将以前开发人员的target、host目录直接复制过来覆盖即可,注意备份。
下图为目录树结构,目前我们仅关注的是host、target两个;如果获取帮助可以直接查看docs中的books.html即可。
编译vxworks 时使用gnu工具,包括make、grep等等,这些工具都是专门编译好的windows 程序,具体位置在host/x86-win32/bin/目录下,因此在使用脚本编译时必须将该目录包含到path环境变量中。
交叉编译工具链包括编译器、头文件、库文件。
1) 编译器
gcc编译器位置在host\gnu,当前使用gcc作为编译器
vxworks 提供的diab编译器,位置在host\diab
2) 头文件
可以理解为Linux 下的libc库头文件,此为vxworks头文件,位置在target/h,注意,此目录下不仅在C语言头文件,也包含vxworks的编译框架makefile头文件
3) 库文件
此为vxworks库文件,位置在target/lib
即板级支持包,位置在target/config/目录下,基本上每个目录为一个BSP,每个硬件类型都有一个BSP对应,特例如下:
目录comps,为所有BSP的基本模块描述文件
目录all,所有BSP的公共部分,当前放置在xvfi8548目录下了,由于xvfi8548的BSP中Makefile如此写,因此没有更改all的位置。
位置在target/proj/目录下,对应使用tronado集成环境下的工程,创建一个工程即生成一个目录,当前使用的工程为xvfi8548。
vxworks image分两种:
bootrom,即引导器,用于加载和启动vxworksimage,bootrom由BSP编译获得,这个东西目前是通过烧录器烧录到flash上,相当麻烦;希望可以使用uboot来代替。
vxworks,即vxworks主程序,相当于Linux内核加root文件系统,由BSP外加启动程序实现。由target/proj/xvfi854/目录下编译获得。
vxworks编译使用gnu make工具,工程之间互相独立,BSP也互相独立。目前需要编译的东西就是bootrom和vxworks两个。
下面以编译vxworks为例详细介绍整个编译过程。
当前工程下的Makefile和target/h/make 目录组成,在编译之前务必要设置环境变量,这些环境变量有:
WIND_BASE 此为vxworks安装的主目录,也即host、target目录的上一层目录
WIND_HOST_TYPE 即当前系统的架构,均为x86-win32
PATH 主要是添加工具包路径和编译工具链路径
设置好环境变量后,在需要编译的工程(或者BSP)目录下执行make即可,比如当前的vxworks工程在target/proj/xvfi8548/目录下,直接到该目录下make 即可。
vxworks的编译组成相当复杂,实在是讨厌至极啊。
工程的Makefile做了如下的事情:
1) 定义需要编译的.o文件集合,以及这些.o文件的编译方式,某些.o文件对应的.c文件来自于BSP,某些来自当前目录
2) 包含一堆其他的makefile,其中最重要的是两个,defs.project和rules.project
3) 定义编译参数CFLAGS,注意在PPC环境下务必要使用-mstrict-align确保对齐访问
4) 定义链接参数LIBS,链接其他外部模块,这里包括ezdriver的模块和SDK模块
注意这个Makefile没有指定default要做什么,这个default 目标在defs.project中定义
顾名思义,该文件主要是定义变量。
定义了default目标,它依赖于exe条件,注意,这个default是整个Makefile的第一个目标,所以make 命令会以它做为编译的目标。这个exe又在rules.project中定义。
还要注意其中的CFG_GEN变量,它用来产生依赖关系,但由于我们不会在vxworks 上做多少二次开发,不需要生成什么依赖,全部重新编译即可,因此后续可以看到将这个生成依赖的命令去年了。
同时这个文件包含了一系列的makefile文件,以下详述:
1) defs.link
定义link(链接)时的一些变量
2) defs.x86-win32
定义一堆gnu工具,包括RM、CP等等
3) defs.vxworks
定义POSTLINK_MODULES,包括生成ctdt.o这个文件,该文件以后在链接vxworks image时会用到
4) make.ppc85xxgnu
定义编译工具链
顾名思义,该文件主要定义编译规则。
终于找到exe目标的规则了,它依赖于$(default_rule),这个default_rule在工程的Makefile中就已经定义了,为vxWorks。
该文件包含了rules.vxWorks,其中定义了vxWorks的编译规则,它依赖于partialImage.o和POSTLINK_MODULES。而其中的partialImage.o 就是Makefile中定义的.o文件集合聚合生成的。
.o文件集合由Makefile定义,包含sysALib.osysLib.o usrAppInit.o linkSyms.o npclib.o mmuE500LibExt.o i2clib.o bspDebug.omotTsecEnd.o usrprjConfig.o,注意这些文件对应的源文件有些在当前工程下有些在BSP下。
该文件由如下文件生成:
1) 4.2.1编译生成的所有.o文件
2) version.o文件,其源文件位于target/config/comps/src目录下,版本号文件
3) CPU专用库文件,当前为target/lib/libPPC85XXgnuvx.a
4) 所有外部库文件,包括ezdriver编译的.a和SDK编译的.a文件
注意此处是链接过程,但链接时如果某函数没有被调用则不会链接进去。
该文件由如下文件生成:
1) 4.2.2生成的partialImage.o文件
2) ctdt.o 文件,该文件的源文件ctdt.c是由partialImage.o生成的,内容相当简单,不知道有什么用处
3) symTbl.o文件,该文件的源文件symTbl.c是由partialImage.o生成的,其中包含了所有的导出symbol,包含函数和变量,某个函数是否被编译进vxworksimage可以直接查看该文件
4) dataSegPad.o,源文件位置target/config/comps/src/,代码段保护文件
vxworks的应用程序均在usrAppInit.c 文件usrAppInit函数中启动,如果需要vxworks启动时执行自定义的任务则需要在此函数中嵌入代码。
目前调试环境是在vxworks shell中,为确保SDK和ezdriver的库文件均编译进入,在usrAppInit函数中调用AHE_root函数,但不是启动时调用,是永远不可能到达的分支中调用。
l 波特率
目前vxworks和bootrom使用的是9600的波特率,和uboot以及Linux不一样(115200),这个可以在configAll.h中修改。
l bootrom
bootrom 修改启动参数无效,当前的bootrom 写死了ftp server为192.168.6.56,本机地址为192.168.6.91,ftp用户名、密码均为w,如果要修改则必须重新刷bootrom,这个问题可以通过修改bootrom来解决,查看文件bootconfig.c,函数bootcmdloop在处理命令’c’时,会将用户输入的配置调用函数sysNvRamSet刷新入内存,但目前会失败,sysNvRamSet函数有太多的实现地方,估计正好编译了某个不支持内存写的函数。
l 文件操作
vxworks没有使用文件系统,但可以打开和关闭文件,在代码中使用fopen时,vxworks会从FTP server上下载一个文件,unlink时会在FTP server上删除一个文件。
l NP启动
NP启动时会需要打开一个EZdat.dat文件,这个文件貌似是NP的配置,必须的,否则会导致NP异常,因此必须将该文件放置到FTP server上供下载。该文件位置如下:
$(EZDRIVER_DIR)/host/tbs/lib/
l 多次调试
AHE_root函数只能执行一次,再次执行时会报NP初始化错误,但仍然可以进行多次测试。在执行完第一次的AHE_root后退出,然后再执行SDK的测试函数即可,此刻NP初始化已经完成,不需要再初始化了。