VxWorks的移植和BSP定制过程

BSP(Board Support Package,板级支持包)的作用是针对特殊的硬件平台,为操作系统内核提供操作接口,使操作系统能够独立于底层硬件。对上层应用屏蔽具体硬件,VxWorks的高可移植性就是通过BSP实现的。
本文重点介绍将VxWorks移植到AT91RM9200芯片过程中BSP的定制过程。

1 BSP概念

BSP通常是指针对具体的硬件平台,用户所编写的启动代码和部分设备驱动程序的集合。它所实现的功能包括初始化和驱动部分设备。最基本的BSP仅需要支持处理器复位、初始化、驱动串口和必要的时钟处理。BSP是相对于操作系统而言的,不同的操作系统对应不同形式的BSP,因此,在写BSP时一定要按照要求的操作系统对BSP的定义形式来写。在VxWorks系统中,BSP是介于底层硬件环境和VxWorks之间的一个软件接口,它的主要功能是系统加电后初始化目标机硬件和VxWorks,并提供部分硬件驱动程序。BSP在VxWorks系统中的层次关系如图1所示。

BSP为各种板卡的硬件功能提供了统一的软件接口,包括硬件初始化、中断的捕捉和处理、硬件时钟和定时器管理、内存地址映射,以及内存分配等。每个BSP还包括一个ROM启动或其他启动机制。

2 VxWorks的引导过程

在编写BSP之前,首先要了解整个系统的启动过程。VxWorks的映像由代码段、数据段和BSS段3部分组成。VxWotks内核可以分为3种:可加载类型映像、基于ROM的VxWorks映像和RoM驻留型映像。这3种类型的映像组织是不一样的,因此启动过程有所区别。

可加载映像包括VxWorks和Boot ROM两部分内容,两部分是独立创建的。首先,由系统引导代码把ROM引导程序搬到RAM_HIGH_ADRS。然后,ROM引导程序开始运行,将VxWorks映像加载到RAM_LOW_ADRS,之后跳转到VxWorks映像装入点。

基于ROM的VxWorks映像在BSP初始化时,会把lmage完全搬到RAM中执行,包括代码段和数据段。在拷贝执行完毕后,系统控制权转移给RAM中VxWorks映像的初始化代码。

ROM驻留型映像只是将ROM中VxWorks映像的数据段和BSS段拷贝到RAM中,完成后系统控制权转移给ROM/Flash里VxWorks映像的初始化代码,代码段留在ROM中并在ROM中运行。在ROM中运行的VxWorks映像主要足为了节省RAM空间,带来的不利则是运行速度慢。

图2和图3分别是下载型和ROM型VxWorks映像的初始化流程。

下面以ROM型VxWorks内核启动流程为例,说明各文件的作用:

romlnit()保存启动类型,屏蔽中断;初始化内存和寄存器,屏蔽Cache;初始化CPU,将堆栈指针定位于被拷贝Boot ROM映像在RAM的地址;跳到romStart()。

roraStart()根据不同的映像类型将VxWorks映像的不同部分解压缩

3 VxWorks在AT91RM9200上的BSP设计

3.1 AT91RM9200简介

AT91RM9200的片上资源包括:ARM920T处理器棱、16KB的内部SRAM和128KB的内部ROM存储器;支持SDRAM、SRAM、Burst Flash和CompactFlash、SmartMedia以及NANDFlash的无缝连接;16KB的数据Cache,16KB的指令Cache,完全可编程的外部总线接口EBI,4个32位的PIO控制器可以达到122个可编程I/O引脚(每个都有输入控制、可中断及开路的输出能力);带有8个优先级、可单独屏蔽中断源的先进中断控制器、6组硬件定时器、4个通用同步/异步收发器USART。

3.2 BSP中几个重要文件的修改

由于AT91RM9200的内核是ARM920T,所以BSP文件主要在VxWorks编泽环境Tornado的目录target/config/all和target/config/integrator920t文件夹里。其中,a11文件夹里的文件对于绝大多数BSP都是共用的,一般来说不需要修改,特别是“configAll.h”;integrator920t文件夹里的文件就是所要编写的BSP文件,这些文件往往与系统硬件密切相关。

3.2.1 修改Makeflie

Makefile文件定义编译和链接整个BSP的规则,如编译工具的选择、编译选项和包含文件路径等;控制生成VxWorks映像文件的类型,同时含有存储区大小的信息,对于存储区大小信息的改动必须与Config.h的对应改动同步。有些参数需在该文件中定义,如处理器类型、编译工具、目标地址等。下面介绍一些须修改的参数和地址:

3.2.2 修改Config.h

Config.h文件包含了所有头文件和与CPU相关的特殊定义。VxWorks内核组件的配置由Config.h文件定义。Config.h中的主要修改内容有定义引导行和修改地址。

(1)定义引导行

其中,mac(O,0)为AT91RM9200芯片中的EMAC设备;host为主机名;VxWorks为要下载的文件名;h为主机IP地址;e为目标板IP地址;u为用户名;pw为密码;tn为目标板名称。

(2)修改地址

该文件中的地址定义,如ROM_TEXT_ADRS、ROM_SIZE、RAM_LOW_ADR、SRAM_HIGH_SIZE等要与Makefik文件中的相关定义一致。本设计中代码段存储在连接ARM芯片外部片选CSO上的Flash里面,基地址为Oxl0000000,因此.定义如下:

VxWorks的缺省配置由configAll.h来确定。一般来说,缺省配置的设置与自行开发的硬件系统的配置不同,用户可通过Cotlfig.h来改变缺省配置。用户须查看configAll.h,并在Config.h中将不需要的软硬件配置和初始化去掉。例如,缺省配置中一般包含浮点处理器,而AT9lRM9200中没有浮点寄存器,因此就要删掉相关配置。

3.2.3 修改integrator920t.c

该文件中设置所有非可选的、与AT91RM9200芯片相关的信息,如各硬件相关寄存器的地址定义,设备寄存器中对应位的定义,各硬件中断矢量和中断优先级的定义,DBUG和USART的控制,网口的定义,系统时钟和辅助时钟参数设置等。VxWorks所要使用的目标板包含设备的驱动程序头文什应当包含在该文件的开始。该文件中的各项宏定义均是基于AT91RM9200芯片的,并根据具体要求定义。例如,电源管理控制器中用到两个锁相环PLLA和PLLB,对它们的部分参数设定代码如下:

3 2.4 修改rornlnit.s

该文件包含引导ROM和基于ROM的VxWorks映像的入口初始化汇编代码。入口点为romInit()函数,是系统加电启动后首先执行的代码。主要功能是:保存启动类型,使处理器复位;初始化Flash和SDRAM;设置MMU到已知状态;指令Cache使能;初始化MMU控制寄存器(指令32位、数据32位、写缓冲使能);开漏写缓冲,并且使指令和数据Cache都兀效;通过设置CPSR的IRQ禁止位、FIR禁止位和先进中断控制器AIC中的中断禁止寄存器来屏蔽中断,跳转到bootInit.c中的rom-Start(),同时传递启动类型。其中,中断屏蔽代码如下:

在调试这段代码时,由于串口和网口都没有启动,因此只能通过点灯程序来跟踪程序的执行情况,设置不同的LED亮来显示程序执行到哪一步。例如,如果要并行输入/输出口C的32位中的第15位亮,则可以编程为;

在编写本文件时,需要注意的地方是:不要在该文件里进行过多的初始化操作,大部分硬件初始化操作在sysLib.c文件中的sysHwInit()函数中进行。

3.2.5 修改sysLib c

sysLib.c是BSP初始化的核心代码。在这个文件中,必须复位所有的硬件,使其处于初始化状态,保证后面开中断后不会产生假中断。这个文件包含了由目标机体系结构决定的、与系统有关的C程序。这些C程序提供板级接口。基于这些接口,VxWorks和应用程序的构造与系统无关。该文件的功能包括:定义了RRAM、SRAM、ROM、外部片选芯片的物理地址和虚拟地址;定义中断优先级寄存器中各个位对应的优先级;调用sysHwInit()初始化串口和网口,安装IRQ/SVC中断堆栈分配程序;总线中断功能等。本文件中有两个重要的函数:sysHwInit()和sysHwInit2()。sysHwInit()的代码如下:

sysHwInit2()用来连接系统中断,安装ISR,进行其他配置。它在初始化系统时钟时,由sysClkConnect()调用,主要用来初始化中断库和中断驱动,安装系统时钟和辅助时钟的中断以及串口等设备的中断。

4 编译生成映像

系统定制完成后,有两种编译方式:一种是在Tornado下进行编译,生成映像文件;另一种是直接用Make工具编译,但要写好脚本文件。装载到目标板中的VxWorks映像取决于使用的下载方式,其中主要包括以下几种:

①VxWorks。这是基于RAM的映像,VxWorks需要通过目标板上的引导程序从串口或网口把它下载到目标板的RAM中运行。在Tornado开发环境下,这是一个默认选项,主要用在调试阶段。使用宿主机上的WindSh工具和符号表。

②VxWorks.st。这也是基于RAM的映像,需要通过引导ROM把VxWorks映像下载到目标机内存中才能执行。该对象文件内置符号表。

③VxWorkS_rom。这是一个非压缩、基于ROM的映像。在这个对象文件执行前,先把自己拷贝到目标机RAM中。这种类型的映像通常在启动阶段速度比较慢,因为代码在ROM中执行,但执行阶段比ROM驻留型的映像要快。

④VxWorks.st_rom。这是基于ROM压缩的VxWorks映像。它在执行前先把自己解压并拷贝到目标机RAM中执行。

⑤VxWorks.res_rom。这是ROM驻留型的非压缩VxWorks的映像。它在执行前把数据段拷贝到目标机RAM中。这种类型的映像在启动阶段比较快,但在目标机上执行的速度比基于ROM类型的映像慢(因为CPU访问ROM比访问RAM要慢)。通常在RAM空间比较小的目标机上使用这种类型的映像。

5 需要注意的问题

首先,应该避免在romInit.s中进行过多的初始化操作。该史件中只是进行必要的最小硬件初始化,大部分硬件的初始化都是在sysHwInit()中完成的。另外,romTnit.s中的代码不应当被其他模块或函数调用。

其次,应该避免sysAlib.s中工作太少。BSP开发人员通常错误地认为在romInit.s里初始化过的设备不需要在sysAlib.s中重新初始化。实际上,VxWorks映像并不认为它是由引导映像程序引导的,因此,它必须重新设置和初始化所有它自己需要使用的设备。sysInit()是该文件中最主要的一个函数,也是第一个函数。该例程中很多工作与romInit()是相同的,目的是保证内核映像在运行与冷启动时,软硬件环境高度一致。

最后,对特定的BSF。驱动程序的修改,只能在特定的BSP目录下。此设计中目录为target/config/integra-tor920t,不要直接在target/src/drv以及target/h/drv中修改。只有风河公司的源程序才能存放在这些目录下。

6 结论

本文在介绍BSP的概念、作用和vxWorks映像分类以及系统启动流程的基础上,以Atmel公司生产的ARM9处理器AT91RM9200为例,重点介绍了VxWorks的BSP设计中需要修改的几个重要文件,最后提出了需要注意的问题。尽管目标板硬件不同,BSP的实现也不尽相同,但基本思想是一样的。本设计对各类开发板的系统移植和后续的应用程序开发有一定的参考价值。

时间: 2024-08-08 11:47:52

VxWorks的移植和BSP定制过程的相关文章

OpenERP安装定制过程实录

OpenERP作为目前优秀的开源ERP系统,功能非常强大,使用Python语言开发,基于模块化设计,使用.定制非常灵活.本文简要记录一下在Ubuntu 14.04 LTS x86_64安装.配置.使用OpenERP7.0的过程. 一.安装OpenERP: OS: Ubuntu 14.04 LTS x86_64 OpenERP:7.0 在/etc/apt/sources.list的最后,添加一行:"deb http://nightly.openerp.com/7.0/nightly/deb/ ./

将项目从android studio移植到adt的过程

1.项目架构是这样的: 2.所以第一步看主工程的AndroidManifest.xml文件,看里面的packagename 等信息. 3.adt新建一个android项目,packagename和appname跟旧的项目一致. 4.最关键的一步.那些原有的lib module怎么办? 同理new一个java project然后到处jar格式. 注意到处jar的时候不能把xml以及proguard-project.txt打到包里面.否则编译不出错.但是运行会出错. PS:为什么导出到Eclipse

Vxworks工程移植到SylixOS应用笔记

1.适用范围 该应用笔记适用帮助用户在RealEvo-IDE开发环境中移植Vxworks应用程序,并部署到SylixOS操作系统上运行,使用到的开发工具为RealEvo-IDE集成开发环境. 2.准备工作2.1 环境准备在使用之前,须安装有翼辉信息开发的集成开发套件,由于系统上安装的防火墙软件或者杀毒软件,可能会影响到集成开发软件的使用,因此,在使用本套件前请关闭计算机上的windows防火墙以及杀毒软件.因后续操作需要在模拟器上进行展示,所以在进行后续章节操作前,请完成mini2440模拟器的

Linux移植之内核启动过程引导阶段分析

在Linux移植之make uImage编译过程分析中已经提到了uImage是一个压缩的包并且内含压缩程序,可以进行自解压.自解压完成之后内核代码从物理地址为0x30008000处开始运行.下面分析在进入C之前内核做的一些工作,以下是内核启动过程中打印出来的信息,其中Uncompressing Linux就是在自解压代码.make uImage编译的最后也给出了链接脚本arch/arm/kernel/vmlinux.lds,以及链接的顺序arch/arm/kernel/head.o 是第一个.

将实朴主流程移植到九安的过程中遇到的问题及解决方法

经过一个星期的努力,已完成将实朴主流程移植到九安的工作任务,期间遇到了不少问题.由于是新入职的新手,遇到的问题都是第一次接触到的,通过向老同事虚心讨教,基本上都找到了解决的方法.现将我遇到的问题及解决的方法大致罗列如下: 一.进入StarLims时报错 ① 报错信息:ORA-01033:Oracle initialization or shutdown in progress 报错原因:Oracle实例没有启动 解决方法: <1> 进入SQL Plus,执行命令:sqlplus/nolog &

驱动移植过程中DMA内存相关接口替换

1. 相关概念介绍及移植简介 1.1 物理地址与总线地址         1)物理地址是与CPU相关的.在CPU的地址信号线上产生的就是物理地址,在程序指令中的的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上.         2)总线地址,顾名思义,是与总线相关的,外设使用的就是总线地址.         在x86平台下,外设的I/O地址是独立的,即有专门的指令访问外设I/O,I/O地址就是所谓的"总线地址".而"物理地址"就

Linux移植的一般过程

前一阵子在公司移植Linux2.6到一块ARM11的开发板上,下面粗略讲讲移植Linux的一般过程. 一开始的UBOOT的移植不多说了.UBOOT最后有两种方式进入Linux,一种是使用uImage,可以在引导时附加命令行参数,但操作起来比较麻烦.另一种较简单的是使用tftp将Linux内核加载到0x80008000(默认起始地址)的地方,然后使用go命令直接跳转.我使用的是第二种方式,其缺点是调整命令行参数的时候需要修改.config文件,然后强制重新编译setup.c(可以通过删除setup

ORB_SLAM2在Android上的移植过程

作者:Frank 转载请注明出处 一直没时间写博客,最近抽时间写了些关于在ORB_SLAM2在Android上的移植过程,也算是点经验吧. 写完后一个手贱点了个链接,瞬间1/3工作量没了,深夜弄完也是醉了... 正文开始 这篇博客讲述如何在Android平台上移植ORB_SLAM2,讲述过程包括基本的Android环境的搭建和NDK环境的配置,Android下移植的基本概念,ORB的具体移植步骤等. Android平台搭建和NDK环境配置 系统:windows7 32bit IDE:Eclips

深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统(瘋耔修改篇二)

第四章.Android编译系统与定制Android平台系统 4.1Android编译系统 Android的源码由几十万个文件构成,这些文件之间有的相互依赖,有的又相互独立,它们按功能或类型又被放到不同目录下,对于这个大的一个工程,Android通过自己的编译系统完成编译过程. 4.1.1 Android编译系统介绍 Android和Linux一样,他们的编译系统都是通过Makefile工具来组织编译源码的.Makefile工具用来解释和执行Makefile文件,在Makefile文件里定义好工程