3. VxWorks源码树与BSP目录结构
在VxWorks BSP移植工程中,源码树与BSP目录结构是理解整个移植工作的起点。VxWorks的源码树并非简单的文件堆叠,而是按照“内核—组件—BSP—驱动”的层次组织,每一层都有明确的职责边界。BSP目录位于源码树的target/config/路径下,每个目标板对应一个独立子目录,例如target/config/myvxbsp/。这个目录中的文件共同决定了目标板如何启动、如何初始化硬件、如何挂接内核。理解这些文件的职责,是后续修改和适配的基础。
BSP目录的组织逻辑
一个典型的VxWorks BSP目录包含以下关键文件:config.h、Makefile、sysALib.s、sysLib.c、romInit.s,以及可选的sysSerial.c、sysNet.c、hwconf.c等。这些文件并非随意放置,而是按照“启动—初始化—配置—构建”的职责链组织。其中,romInit.s和sysALib.s属于汇编层,负责最底层的CPU和内存初始化;sysLib.c是C语言层的板级支持库,负责外设驱动和系统资源管理;config.h是配置头文件,定义编译选项和硬件参数;Makefile则负责将上述文件编译链接成可引导的VxWorks镜像。
从启动流程看,上电后CPU首先执行romInit.s中的入口代码,完成栈指针设置、内存控制器初始化、时钟配置等最基础的工作,然后跳转到sysALib.s中的sysInit函数。sysInit进一步初始化中断向量表、调用sysHwInit,最终进入内核启动流程。这一顺序决定了文件之间的依赖关系:romInit.s依赖硬件寄存器地址,sysALib.s依赖romInit.s建立的运行环境,sysLib.c则依赖前两者完成的基础初始化。
关键文件职责详解
romInit.s是BSP中最先执行的代码,通常用汇编编写。它的核心任务包括:设置CPU初始栈指针、关闭看门狗、初始化内存控制器(如DDR控制器)、配置系统时钟和总线时序、将自身从ROM拷贝到RAM(如果采用ROM引导方式)。在移植时,这个文件需要根据目标板的CPU型号、内存颗粒参数和时钟频率进行修改。例如,若目标板使用DDR3-1600,则需在romInit.s中正确设置DDR控制器的时序寄存器,否则系统无法正常启动。
sysALib.s承接romInit.s,提供sysInit汇编入口。它主要负责建立C语言运行环境,包括初始化中断向量表基址、设置MMU页表(若启用MMU)、初始化缓存等。在ARM架构中,sysALib.s通常还包含sysInByte、sysOutByte等底层I/O操作的汇编实现。移植时需关注中断控制器的基地址和向量表偏移量是否与目标板一致。
sysLib.c是BSP中代码量最大、修改最频繁的文件。它实现了sysHwInit、sysHwInit2、sysClkConnect、sysClkRateSet等标准接口,并包含内存映射表sysPhysMemDesc[]和sysMemTop等关键数据结构。在移植过程中,工程师需要根据目标板的实际硬件填写内存映射表,注册中断服务程序,初始化串口、定时器、以太网等外设。例如,若目标板使用NS16550兼容串口,则需在sysLib.c中配置正确的寄存器偏移和波特率分频值。
config.h是BSP的配置中心,定义了大量的编译宏,如CPU、TOOL、ROM_TEXT_ADRS、RAM_LOW_ADRS、RAM_HIGH_ADRS、INCLUDE_*系列组件宏等。这些宏直接影响内核裁剪和内存布局。例如,ROM_TEXT_ADRS指定了引导ROM的起始地址,RAM_LOW_ADRS指定了VxWorks镜像加载到RAM后的起始地址。若这两个地址设置错误,系统将无法正确跳转到内核入口。
Makefile负责将上述源文件编译链接为可引导的VxWorks镜像。它通常包含MACH_EXTRA、BSP_NAME、VXWORKS_IMAGE等变量定义,并调用target/config/comps/下的通用规则。移植时,若新增了自定义驱动文件,需要在Makefile的MACH_EXTRA中追加对应的目标文件,否则链接时会报未定义符号错误。
移植中的常见问题与判断依据
在实际移植中,最常见的错误是启动阶段“卡死”在romInit.s或sysALib.s中。判断依据可以通过串口输出或JTAG调试器观察PC指针位置。若PC停留在romInit.s的内存初始化循环中,通常说明DDR时序参数配置有误;若PC已进入sysInit但无串口输出,则需检查sysLib.c中串口初始化代码和config.h中的INCLUDE_SERIAL宏是否使能。另一个常见问题是内存映射冲突,表现为系统启动后访问外设时产生异常,此时应核对sysPhysMemDesc[]中的虚拟地址与物理地址映射关系是否与MMU配置一致。
config.h中的地址宏后,务必同步检查Makefile中的链接地址和romInit.s中的拷贝目标地址,三者必须一致。建议在首次移植时,先用最小配置(仅串口和定时器)验证启动链路,再逐步添加网络、存储等驱动。
综上所述,VxWorks BSP目录中的每个文件都承担着明确的职责,它们通过启动调用链和编译构建链紧密耦合。移植工作的核心,就是根据目标板的硬件手册,逐项核对和修改这些文件中的参数与代码,使系统能够从复位向量开始,一步步完成硬件初始化,最终稳定进入VxWorks内核。理解这一结构,后续的驱动适配和系统调试才能有的放矢。