2 BSP 组织结构
2.1 简介:
本章描述BSP的部件, 列出并描述了所有BSP相关的源文件和包含文件. 对于.h 文件, 本章描述了定义或取消标准符号常量所引起的后果; 对于.c 文件, 本章描述了和该文件相关的 所有必须的和可选的函数。 本章也描述了派生文件, 例如syslib.o, syslib.o 是介于板级依赖和板级独立的代码间的接口部分代码的目标文件。
在本章中, 将有一部分专注于列举重要的BSP相关的函数和它们的调用顺序(参考附录D VxWorks 启动顺序), 该部分信息将为你提供一个调试VxWorks 启动阶段必须的系统概念。
在本章结束, 将有一个关于BSP 开发新手常犯错误的讨论。
2.2 BSP 部件:
一个BSP 由一系列例程或程序组成, 这些例程把它们对于硬件环境的接口提供给VxWorks.
图1 显示了VxWorks的各种部件, 并标志出了哪些是硬件独立的, 哪些是硬件相关的。
图1
BSP例程包含在许多你必须创建的C或汇编文件中, 如果你从一个模板BSP开始的话, 这些文件可能只需要修改, 不必从头开发。下面总结BSP的文件和目录。
2.2.1 BSP 源和包含文件
本节介绍目录target/config/all 和target/config/bspname (bspname 是你的特定目录). 严格来讲,目录target/config/all下面的文件并不是BSP的部分, 但是定义在那里的模块是被所有BSP共享的。 因此如果你想理解你的特定的BSP的话, 这些模块的熟悉是十分必要的。当build 一个项目的image时,目录target/config/comps/src目录下的部件配置取代了目录target/config/all下的文件。 一个部件 配置是指作为项目build 步骤的一部分的那些被项目工具所编译的C源代码。 这些文件仅提供了最终项目
配置的一些有限的部分。
目录target/config/all 下面的文件
目录target/config/all 下面的文件是作为VxWorks架构的一部分被发布的, 除非绝对必要, 否则不要轻易地修改这些文件。 特别需要注意的是文件configAll.h。 这个文件设置了所有VxWorks images的缺省 配置, 你在这个文件中的定义应当是通用的, 因此可以被和你使用同样环境的大多数开发者所用, 如果不 是所有开发人员的话。如果你需要一个不同于缺省配置的VxWorks image, 那么可以使用你的BSP的config.h 中的值去覆盖(使用#define 或#undef )configAll.h 中的缺省值。
config/all 目录下的文件在build 一个项目时没有被直接使用, 它们只在从一个BSP新建一个项目的时候被扫描一次。 当一个新的项目建立后, 对config/all 目录下的文件所做的任何修改将不会再对项目有任何影响。 如果你期望某种改变能够在项目中体现, 那么你必须直接在项目中做更改而不是在config/all目录下的文件中做更改。
注意: 从命令行方式改变configAll.h 文件可能对其他和你使用相同机器的用户产生不好的副作用, 这种情况只应用于从命令行build。 Tornado 2.0的一个特性是变更不影响现存的项目, 只有从一个BSP创建的新项目才会继承之前对configAll.h 的修改。
bootConfig.c -- Boot ROM images 最主要的初始化文件。
bootconfig.c 是所有boot ROM images 的主要的初始化和控制文件。 它包含了完整的boot ROM shell 任务。 它包含了一个用于网络设备初始化的表(NETIF)。 这个模块实际上是usrConfig.c 的一个子集。 Boot ROM images 并不象一个完整的VxWorks images那样提供了所有的可选特性。特别注意是boot images 不使用MMU 库(除非是用于SPARC)。
Tornado 2.0 项目工具没有能力创建和维护一个boot ROM 项目, 对于从BSP创建的项目,从Build 菜单中可以找到一个按钮,该按钮执行传统的从命令行创建一个boot ROM image。请特别注意, 当build 一个boot ROM image 时, 特定项目的配置信息根本没有效果,只有传统的config.h, configAll.h, bootConfig.c 和bootInit.c这几个文件影响一个boot
ROM image 的build.
bootInit.c --ROM 初始化的第二阶段。
bootInit.c 文件是boot ROM 初始化的第二个阶段, 在romInit.o之后, romInit.s 文件中的函数romInit()在结束的时候跳转到romStart(), 而romStart()函数是定义在bootInit.c中的。 函数romStart()执行必要的代码解压缩和ROM images 的重定位, 首先, 它把text 和data 段 从ROM 拷贝到RAM中, 然后,它清楚在RAM中不再被使用的那些部分,最后它将image被压缩的部分解压缩。不同的配置选项可以决定这些操作如何被具体执行。
对一个ROM化的 VxWorks image 来说,在tornado 2.0 下的项目中, romStart.c 取代了bootInit.c 的功能,注意这不是针对一个boot ROM image来说的。
dataSegPad.s --VxVMI Text段保护。
文件dataSegPad.s 仅被用于VxVMI text段的保护, 它保证text 段和data 段不共享一个MMU 页面。
usrConfig.c -- VxWorks image 的初始化代码。
usrConfig.c 文件中包含了VxWorks images 的主要的初始化代码。 不象bootConfig.c 文件那样是自包含的, usrConfig.c 文件包含了target/src/config/usrExtra.c , 而usrExtra.c 文件又包含了 其它的用来提供子系统初始化和配置的文件。
usrConfig.c 仅用于从命令行进行build 时, 就象在Tornado 1.0 中一样。 当使用项目工具来build 项目时, 项目初始化组决定了部件初始化的顺序, 每个部件都有一套属性用来标识该部件属于哪一个初始化组并且也标识了在那个组中它应当被放在哪里。
目录target/config/comps/vsWorks下的文件
在此目录下的文件是VxWorks 实时系统内核的基本部件描述文件(CDF 文件)。 参考第六章( 部件)来了解关于部件是如何被创建,使用及交付的详细信息。 参考附录F.1 (部件描述语言CDL)来了解关于CDF文件的语法的细节。
目录target/config/comps/src 下的文件
在此目录下的文件 描绘了和内核部件相关的配置, 它们描绘了之前出现在target/config/all/usrConfig.c 文件中代码片段。