Vxworks5.5命令行方式编译config.rom过程中涉及到的文件的结构如下所示:
Make_5980_28_52T_configrom.bat |
tovarsPPC_2.2.1.bat |
BSP/makefile |
/mpc834x/makefile |
BaseDir.def |
Def.bsp |
Make.PPC603gnu |
Def.x86-win32 |
Board.def |
Rules.bsp |
Rules_dcn.bsp |
执行批处理文件Make_5980_28_52T_configrom.bat,首先保存当前的环境变量,然后调用tovarsPPC_2.2.1.bat为接下来的编译过程设置环境变量,这些环境变量包括:
path_save=%PATH% #保存当前的环境变量
WIND_HOST_TYPE=x86-win32 //HOST主机类型
WIND_BASE=E:/SVN_VIEW/compiler/Tornado2.2.1_ppc //wind内核
TOR221=E:/SVN_VIEW/compiler/Tornado2.2.1_ppc
GCC_VER=296 //编译器版本
DIABLIB=E:/SVN_VIEW/compiler/Tornado2.2.1_ppc/host/diab
DIAB_HOST_TYPE=WIN32
PATH=E:/SVN_VIEW/compiler/Tornado2.2.1_ppc/host/diab/WIN32/bin;E:/SVN_VIEW/compiler/Tornado2.2.1_ppc/host/x86-win32/bin;%PATH%
//以下参数需要用户配置,说明编译结果存放的目标、生成类型、编译选项等。
OBJ_BASE=E:/SVN_VIEW/code_ivy6.1/BSP/Build
SDK_BASE=E:/SVN_VIEW/code_ivy6.1/Driver_Zoma/SDK
BUILD_TYPE=ROM
配置好环境后进入BSP编译的总控Makefile,它包含了DCN的所有编译目标,包括:config.rom、boot.rom、loader.rom、nos.img、config_harddebug.o、boot_harddebug.o、sdk.img等在这里我们以config.rom的编译为例进行说明。
config.rom : config
make -C Target/config/$(ROUTER_CPU_PATH) $@ OUTER_CPU_TYPE=$(ROUTER_CPU_TYPE)
cmd /C "copy $(OBJ_DIR)/config.rom $(BIN_DIR)/$(ROUTER_BOARD_TYPE)_config.rom"
通过config.rom的编译规则,可以看出它依赖的文件是目标config,生成config.rom的方法是通过调用BSP/target/config/mpc834x/目录中的Makefile,并把生成的目标config.rom拷贝到目的目录中。
首先看一下依赖目标config:
config:
ifndef ROUTER
@echo "The *ROUTER* environment variable is not set!"
@exit 1
endif
ifeq ($(BUILD_TYPE),ROM)
@if not exist $(subst /,/,$(BIN_DIR)) mkdir $(subst /,/,$(BIN_DIR))
endif
@if not exist $(subst /,/,$(OBJ_DIR)) mkdir $(subst /,/,$(OBJ_DIR))
wtxtcl makeconfig.tcl > $(OUTPUT_DIR)/BaseDir.def
该目标主要是为后期的编译做一些准备工作。
接下来看BSP/target/config/mpc834x/目录中的Makefile,该文件中定义了mpc834x BSP的具体编译规则,而DCN特有的编译规则通过头文件的形式包含进来:
include $(TGT_DIR)/h/make/rules_dcn.bsp
其中的编译规则如下所示:
clean_all :
- @ cd $(subst /,/,$(OBJ_DIR)) && @ del /S *.o *.a *.h *.c *.dep
config.rom boot.rom : clean_all $(BSP_DEFINES_HDR_FILE) $(OBJ_DIR)/bootrom_release.rom $(BOOT_LOADER) $(CONFIG_WITH_HWCFG)
#把bootrom_release.rom重命名
-$(MV) $(OBJ_DIR)/bootrom_release.rom $(OBJ_DIR)/$@
-$(RM) $(OBJ_DIR)/bootrom_release.rom
ifneq ($(BOOT_LOADER),)
## 将rom和loader以及跳转指令合并的批处理
-$(MAKE_ROM_WITH_LOADER)
endif
ifneq ($(POST_MAKE_BOOTROM),)
## 为bootrom添加header的批处理
-$(POST_MAKE_BOOTROM)
endif
$(OBJ_DIR)/bootrom_release.rom : bootrom.hex
- @ $(RM) $@
$(HEXTOBIN) bootrom.hex -a -l $(ROM_START_ADRS) -u $(ROM_END_ADRS)
$(MAKEBOOTROM) bootrom.bin
##生成的rom默认名为nos.rom
- @ $(MV) nos.rom $@
- @ $(RM) bootrom.bin
- @ $(RM) bootrom.hex
- @ $(RM) nos.rom
至此,就完成了整个编译过程,对于上文中提到的文件的详细目录以及宏的定义见附录A。
VxWorks6.7命令行方式编译config.rom过程中涉及到的文件的结构如下所示:
# +-> defs.bsp
# | +-> defs.link
# | | +-> defs.option
# | +-> make.PPC604diab
# | | +-> defs.ppc
# | | +-> defs.diab
# | | +-> defs.common
# | +-> defs.x86-linux2
# | +-> defs.unix
# +-> rules.bsp
# +-> rules.memory
# | +-> defs.memory
# +-> rules.x86-linux2
# +-> rules.fs
对于各个文件的详细目录及宏定义见附录B。
总的来说,VxWorks6.7与VxWorks5.5的编译过程基本上相同,微小的区别有以下几点:
1. 通过D:/WindRiver_ocd/wrenv.exe -p vxworks-6.7来设置环境变量。
2. 涉及到目录操作时,要把路径中的”/”改为”/”。
3. Vxworks5.5在defs.x86-win32中定义了编译目标过程中需要的目录、文件、objdumpppc工具等信息,在vxworks6.7中这些定义都在defs.unix中。
4. 利用hex2bin.exe生成bin文件时生成的bin文件只有1k大小,存在着问题。
5. cp、cd、del等指令执行失败.
附录C中说明了在从VxWorks5.5升级到VxWorks6.7的编译过程中遇到的一些问题.
附录A
/BSP/make_5980_28_52T_configrom.bat
path_save=%PATH% #保存当前的环境变量
// 设置环境变量
/BSP/torVarsPPC_2.2.1.bat
WIND_HOST_TYPE=x86-win32 //HOST主机类型
WIND_BASE=E:/SVN_VIEW/compiler/Tornado2.2.1_ppc //wind内核
TOR221=E:/SVN_VIEW/compiler/Tornado2.2.1_ppc
GCC_VER=296 //编译器版本
DIABLIB=E:/SVN_VIEW/compiler/Tornado2.2.1_ppc/host/diab
DIAB_HOST_TYPE=WIN32
PATH=E:/SVN_VIEW/compiler/Tornado2.2.1_ppc/host/diab/WIN32/bin;E:/SVN_VIEW/compiler/Tornado2.2.1_ppc/host/x86-win32/bin;%PATH%
//以下参数需要用户配置,说明编译结果存放的目标、生成类型、编译选项等。
OBJ_BASE=E:/SVN_VIEW/code_ivy6.1/BSP/Build
SDK_BASE=E:/SVN_VIEW/code_ivy6.1/Driver_Zoma/SDK
BUILD_TYPE=ROM
ROUTER=DCRS5980 ROUTER_CPU_TYPE=PPC8347 OBJ_BASE=%OBJ_BASE%
//该Makefile是编译BSP的总控Makefile,包含DCN的所有编译目标。
/BSP/makefile
WTXTCL = wtxtcl.exe
/BSP/router_bsp.def
ROUTER_PRJ_TYPE= DCRS5980
ROUTER_BOARD_TYPE = box_hummer
ROUTER_CPU_PATH = mpc834x
OBJ_DIR = BSP/Build/DCRS5980/PPC8347/obj
OUTPUT_DIR = BSP/Build/DCRS5980/PPC8347
BIN_DIR = BSP/Build/DCRS5980/PPC8347/bin
BSP_DEFINES_HDR_FILE = BSP/Build/DCRS5980/PPC8347/obj/bsp_cfg_defines.h
调用wtxtcl makeconfig.tcl生成BSP/Build/DCRS5980/PPC8347/BaseDir.def
// mpc834x BSP的Makefile
make -C Target/config/ mpc834x $@ ROUTER_CPU_TYPE= PPC8347
BSP/TARGET/config/mpc834x/makefile
CPU = PPC603
TOOL = gnu
//make config生成该文件。(该文件时自动生成的)
BSP/Build/DCRS5980/PPC8347/BaseDir.def
BSP_BASE=E:/SVN_VIEW/code_ivy6.1/BSP
RS_DRV_DIR=E:/SVN_VIEW/code_ivy6.1/Driver_Zoma/Aladdin
PLATFORM_INCLUDE_BASE=E:/SVN_VIEW/code_ivy6.1/Systems/vxworks
WIND_PROJECT_MAKEFILE = TRUE
TGT_DIR = BSP /target
//该文件定义了BSP默认的Makefile配置。
BSP/TARGET/h/make/defs.bsp
TOOL_FAMILY = gnu
.SUFFIXES: .cpp .out .cxx
default : exe // exe target is the cannonical starting point.
DEFAULT_RULE= vxWorks// most targets will make vxWorks by default
BSP_NAME = $(TARGET_DIR)
//配置一些编译选项,包括编译器、连接器、flags
CFLAGS=$(CC_ARCH_SPEC) $(CC_COMPILER) $(CC_OPTIM) $(CC_WARNINGS) $(CC_INCLUDE) $(CC_DEFINES) $(ADDED_CFLAGS) $(CC_SOFT_FLOAT)
……….
ROM_LINK_ADRS = $(ROM_TEXT_ADRS)
// standard list of BSP modules 标准库
MACH_DEP= $(OBJ_DIR)/sysALib.o $(OBJ_DIR)/sysLib.o $(MACH_EXTRA) $(ADDED_MODULES)
RELEASE_PRJ = prj_default prj_diab
//这里的工作很多赋值跟defs.bsp中式重复的
BSP/TARGET/h/make/make.PPC603gnu
# SETUP install directory
SETUP_INSTALL_DIR = C:/Tornadoppc
//该文件包含了ppc603的默认的GNU工具链的配置信息
BSP/TARGET/h/tool/gnu/make.PPC603gnu
// 该文件包含了GNU工具链默认的编译配置信息
BSP/TARGET/h/tool/gnu/defs.gnu
//该文件中定义了主机在编译目标是的默认配置
BSP/TARGET/h/make/defs. x86-win32
TARGET_DIR = mpc834x
VENDOR = Motorola
BOARD = mpc834x
DCN_BIN_DIR = E:/SVN_VIEW/code_ivy6.1/BSP/TARGET/bin
//common目录定义以及依赖搜索路径定义
E:/SVN_VIEW/code_ivy6.1/BSP/TARGET/config/misc/ common_file_path.def
//板子相关的定义,比如:内存地址、板子特有的宏定义等。
E:/SVN_VIEW/code_ivy6.1/BSP/TARGET/config/mpc834x/box_hummer/board.def
//用来生成config.rom
MAKEBOOTROM = $(DCN_BIN_DIR)/makenoscfg_5980.exe
MAKEBOOTROM = $(DCN_BIN_DIR)/makenosrom.exe//生成boot.rom SDK
VMA_START = 0x$(ROM_TEXT_ADRS)
USR_ENTRY = usrInit
## hex2bin工具
HEXTOBIN = $(DCN_BIN_DIR)/Hex2bin.exe
//头文件搜索路径
EXTRA_INCLUDE += -I$(PLATFORM_INCLUDE_BASE)/os_ppc /
-I$(BSP_BASE)/../Platform/INCLUDE
-I$(DCN_COMMON_INCLUDE)-I$(DCN_COMMON_DIR) -I$(ROUTER_BOARD_TYPE) $(SDK_INCLUDE_FLAG)
//编译规则定义
E:/SVN_VIEW/code_ivy6.1/BSP/TARGET/h/make/rules.bsp
E:/SVN_VIEW/code_ivy6.1/BSP/TARGET/h/make/rules_dcn.bsp//DCN独有的规则
//把生成的config.rom拷贝到目标地址。
cmd /C "copy……..”
附录B
D:/WindRiver_ocd/vxworks-6.7/target/config/ads834x/Makefile
CPU = PPC32
CPU_VARIANT = _ppc603_83xx
TOOL = diab
WIND_BASE=D:/WindRiver_ocd/vxworks-6.7
WIND_HOST_TYPE=x86-win32
WIND_HOME=D:/WindRiver_ocd
TGT_DIR = D:/WindRiver_ocd/vxworks-6.7/target
TARGET_DIR = ads834x
VENDOR = Freescale
BOARD = ads834x
USR_ENTRY = usrInit
WRVX_COMPBASE=D:/WindRiver_ocd/components
COMP_IPNET2=ip_net2-6.7
//BSP Makefile文件的默认配置
D:/WindRiver_ocd/vxworks-6.7/target /h/make/defs.bsp
BSP_NAME = ads834x
//在该文件中定义了OS库文件路径VX_OS_LIBS以及要搜索的库文件路径//LD_LINK_PATH。
D:/WindRiver_ocd/vxworks-6.7/target /h/make/defs.link
// This file is included in Makefiles to establish information related to option builds
D:/WindRiver_ocd/vxworks-6.7/target /h/make/defs.option
// 用于组件的编译
D:/WindRiver_ocd/vxworks-6.7/target /h/make/defs.comps
//diab编译工具的定义和编译选项
D:/WindRiver_ocd/vxworks-6.7/target/h/tool/diab/make.PPC32diab
// host为win32主机的默认配置
D:/WindRiver_ocd/vxworks-6.7/target/h/make/defs.x86-win32
MAKESHELL = sh.exe
// 编译目标文件的默认定义。包括:目录、doc文件、工具、宏定义等。
D:/WindRiver_ocd/vxworks-6.7/target/h/make/def.unix
D:/WindRiver_ocd/setup/make/defs.resourcelist
// This file contains rules used in building targets.该文件只作用于在BSP目录下命令行方式编译,它对project或者component编译不起作用。Rule.project文件作用域project编译。
D:/WindRiver_ocd/vxworks-6.7/target/h/make/rules.bsp
// define macros that pertain to IPCOM requirements
D:/WindRiver_ocd/components/ip_net2-6.7/osconfig/vxworks/make/efs.ipcom
// For now this files only contains the adrsMacros rule which prints the list of ADRS //macros needed by the kernel files.
D:/WindRiver_ocd/vxworks-6.7/target/h/make/rules.memory
// This file contains rules used for embedding a filesystem within vxWorks image.
D:/WindRiver_ocd/vxworks-6.7/target/h/make/rules.fs
附录C
1. D:/WindRiver_ocd/vxworks-6.7/target /config/misc/rules_bsp.def
通配符和引号问题
$(BSP_DEFINES_HDR_FILE) :
@echo /* This is a auto generated file, do not modify it /*/ > $(BSP_DEFINES_HDR_FILE)
ifeq ($(BSP_CONFIG_BOOT),y)
ifeq ($(BSP_CONFIG_COMMAND_DEFAULT),y)
@echo "#define INCLUDE_CMD_DEFAULT" >> $(BSP_DEFINES_HDR_FILE)
endif
endif
2. D:/WindRiver_ocd/vxworks-6.7/target /config/all/bootconfig.c
头文件由target/h/目录到Systems/vxworks/os_ppc
3. 函数参数的个数变化:
bsp/target/src/config/usrmmuinit.c
mmuPpcLibInit()
vmBaseGlobalMapInit()
bsp/target/src/config/usrkernel.c
IMPORT Q_HEAD readyQHead;
taskLibInit()
eventLibInit ()
workQInit ()
bsp/target/config/misc/boot/bootconfigfunc.c
IMPORT char * creationDate;
bsp/target/config/all/bootconfig.c
kernelInit();//参数变为两个,把参数都封装到结构体_KERNEL_INIT_PARAMS中。
memInit();//增加了options参数,暂且设置为MEM_PART_DEFAULT_OPTIONS。
excInit ();
target/h/pciClass.h 中宏定义改变了不少导致pciConfigFuncShow()中的case语句出错。
D:/WindRiver_ocd/vxworks-6.7/target/h/end.h 中多了jobQueueLib.h头文件,该头文件变化比较大。
Bsp/target/config/mpc834x/syslib.c sysHwInit()调用vxPowerModeSet ()
vxPowerModeSet (); //函数参数的宏定义位置发生变化
4. 链接错误: 这是一个兼容性错误,这个错误出现的原因是,在glibc 2.3.2-11及其之后的C库版本,移除了__ctype_b和相关symbal的定义。(http://blog.csdn.net/noodies/archive/2009/07/28/4386280.aspx)
ldppc -o tmp.o -X -N -e usrInit /
-Ttext 02f00000 partialImage.o symTbl.o ctdt.o /
-T D:/WindRiver_ocd/vxworks-6.7/target/config/BSP/target/h/tool/gnu/ldscripts/link.RAM
partialImage.o: In function `bootCmdMain':
(.text+0x517a): undefined reference to `__ctype_tolower'
partialImage.o: In function `bootCmdMain':
(.text+0x517e): undefined reference to `__ctype_tolower'
partialImage.o: In function `BSP_do_case':
(.text+0x1416a): undefined reference to `__ctype_toupper'
5. 编译错误:这也是编译器的一个bug
(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30761)
Error: unsupported relocation against _PPC_MSR_FP
6. Target/h/make/rules.bsp中bootrom.Z.s生成过程中
$(MKSYMTBL) tmp.o symTbl.c
sysTbl.c的生成中standTbl、standTblSize出现重复的声明,手动删除解决。
7. Hex2bin.exe生成的bin文件不正确。