MPC8548平台下的VxWorks BSP开发

2013-06-26 11:37任修齐
装备制造技术 2013年6期
关键词:驱动程序镜像中断

任修齐

(桂林电子科技大学 电子工程与自动化学院,广西 桂林541004)

VxWorks是美国WindRiver公司于1983年设计开发的一款嵌入式实时操作系统(RTOS),其具有高性能的内核(Wind Kernel)、持续发展能力以及友好的用户开发环境,在嵌入式实时操作系统领域一直占据着高端位置。当前实时嵌入式开发环境的关键组成部分一般采用VxWorks。考虑到VxWorks的通用性,WindRiver公司将操作系统与硬件之间的一层独立开来,命名为BSP(board support package)。BSP能够使操作系统相对于特定的硬件平台具有独立性,其对上层屏蔽、封装具体的硬件细节,为系统调用以及应用软件提供统一的接口[1]。

面对一个特定的硬件平台,需要在其支持简单外设时正常运行起来,这里涉及到的系统引导和驱动开发都是BSP的核心内容。因此BSP开发是进行嵌入式系统研发时需要完成的第一个任务。BSP与特定硬件关系密切,不同架构的CPU对应的BSP绝大部分不同,即使同一款CPU,在外设细微差异的情况下,BSP也会有较大的不同,这是BSP开发的复杂性所在[2]。本文以嵌入式微处理器MPC8548硬件平台为例,采用“整体移植,局部修改”的开发方法,利用WindRiver公司为PowePc CPU提供的BSP模板,详细介绍了VxWorks BSP开发过程。

1 BSP介绍

1.1 BSP的概念

BSP通常是指特定的硬件平台下的一个程序集合,包括启动代码和部分硬件设备驱动程序。在Vx-Works系统中,BSP简单描述为介于底层硬件环境和VxWorks之间的一个软件接口。

如图1[2]BSP和PC机主板上的BIOS有些类似,但有一些区别。由于PC产业的高度成熟,BIOS的设计已经充分标准化,BIOS主要是负责在PC机主板启动时检测、初始化系统设备,并没有包含一些基本外设的驱动。BSP的概念只是针对嵌入式操作系统而提出的,其实现有较大的灵活性。在启动的开始部分BSP和BIOS所做的工作类似,而后的大部分是不同的,BSP还包含和平台有关的基本驱动(串口、网口等)。另外BSP是和操作系统“捆绑”在一起运行于主板上的。

图1 RTOS BSP和PC BIOS的比较

以下从BSP职责、组成、执行过程三个方面分别介绍[3~4]。

1.2 BSP的职责

1.2.1 硬件环境的初始化

处理器和硬件环境的不同决定着VxWorks引导顺序的差异,初始化硬件的步骤一般分为:

(1)在主存储器的特定位置放置一段代码(跳转指令),当上电复位后处理器将立即执行这段代码;

(2)根据HRCW(硬件复位配置字),将处理器设置为某个具体的状态;

(3)初始化存储器并对存储器进行划分;

(4)关闭中断;

(5)将控制权转交给镜像的引导代码;

(6)装载需要的VxWorks段到RAM中;

(7)在开始初始化VxWorks内核之前,确保以CPU为主的硬件处于状态静止。

1.2.2 硬件驱动程序的集成

为支持操作系统访问硬件外设,BSP必须支持设备驱动程序相关的配置管理。主要指以下几个方面:

(1)在BSP里面支持部分驱动程序,其中包括驱动程序所调用的中断服务程序;驱动程序代码涉及到的结构体以及宏等;

(2)BSP需支持硬件驱动程序实现可移植性。比如允许网络设备驱动程序在不同的硬件环境之间移植;

(3)设备的管理和配置,比如:将产品的开发和配置分开。

1.2.3 软件(与硬件相关)的集成

一个好的BSP不仅功能齐全,还需要考虑如下问题:

(1)提供代码编译时的适应性。比如:使用预处理宏,用户可以根据自己的需要来定制BSP系统。例如:

#define INCLUDE_ATA/*包含ATA硬盘驱动程序*/

#define INCLUDE_FD/*包含软盘驱动程序*/

(2)提供执行时的可移植性。比如:提供编译对象模块的可移植性;使用指针访问程序。

1.3 BSP的组成

BSP主要由源文件、head文件、自动化编译文件、派生文件组成,其实现的主干部分为源文件。以下主要介绍源文件。

1.3.1 BSP相关文件

这些文件位于.. argetconfigall目录,它们并不是特定BSP的一部分,而是所有BSP的公共部分。该目录主要由下面几个文件组成:

(1)bootConfig.c。其包含完整的引导ROM外壳任务、一个网络设备初始化表(NETIF),其主要对引导型ROM镜像起初始化和控制作用。该文件定义了usrInit()函数和usrRoot()函数。

(2)bootInit.c。该文件包含引导ROM镜像第二阶段的初始化代码,包括了函数romStart(),该函数的作用是重定位ROM镜像和压缩必要的代码。

(3)usrConfig.c。其包含VxWorks镜像的主要初始化代码。它的初始化功能较为完整,包括了.. argetsrcconfigusrExtra.c文件以及其他提供子系统配置和初始化的文件。

(4)version.c。其提供了VxWorks版本号、构造镜像时的日期和时间,这些信息会在执行VxWorks镜像时显示。

(5)configAll.h。其设置了所有VxWorks镜像的通用设置。

1.3.2 BSP实现文件

这些文件位于.. argetconfigspname目录,包含了系统或硬件相关的BSP文件。其中的函数都需要依据硬件平台进行编写和调试。主要由下面几个文件组成:

(1)rominit.s。该文件包含引导ROM和基于ROM的VxWorks镜像的入口初始化汇编代码。函数romInit()负责实现入口,该函数执行初始化CPU、初始化内存、初始化堆栈指针等。

(2)sysLib.c。该文件包含目标机体系结构、与系统有关的C程序。这些程序实现了上层与硬件的接口,由于这些接口,VxWorks和应用程序的构造与硬件无关。对硬件平台所有外部器件初始化函数sysHwInit()和中断挂载函数sysHwInit2()也在该文件中实现。

(3)sysSerial.c。这是一个可选文件,包含所有的SIO设备串行I/O驱动程序的安装和初始化,包含串口初始化函数sysSerialHwInit()、sysSerialHwInit2()。

(4)systemClk.c。其包含系统时钟处理函数sysClkConnect()、sysClkRateSet()和sysClkEnable()。

(5)IntrInit.c。其包含中断控制器初始化函数IntrInit()。

(6)config.h。其包含了全部头文件与涉及CPU的特殊宏。

(7)makefile。该文件控制使用命令行方式构造镜像。

1.4 BSP执行过程

上一节中介绍了BSP的文件组成以及所包含的函数,执行这些函数,硬件平台实现了从上电到Vx-Works启动完成。下面以ROM型VxWorks镜像启动为例介绍BSP函数的执行过程。

系统上电启动后,首先执行固化在ROM中的romInit()函数,其功能主要是禁止CPU中断,配置SDRAM控制器,设置初始栈指针,然后执行romStart()函数将ROM中VxWorks镜像拷贝到RAM中执行,接着在RAM中首先执行usrInit()函数。usrInit()调用sysHwInit()函数初始化外部硬件设备,调用usrKernelInit()函数初始化并启动内核,调用usrRoot()函数连接系统时钟、初始化并设置I/O系统和安装所有外部设备驱动程序。至此系统启动完成,BSP执行结束。

图2 BSP执行过程中的核心函数调用

在启动过程中,与具体硬件平台相关的函数有romInit()、sysHwInit()以及usrRoot()调用的系统时钟函数。其中,sysHwInit()函数调用所有外部硬件设备的初始化函数。例如:串口初始化函数sysSerialHwInit()、中断控制器初始化函数IntrInit()、时钟函数。时钟函数包括:时钟驱动挂载函数sysClkConnect()、时钟速率设置函数sysClkRateSet()和时钟使能函数sysClkEnable()。其中,sysClkConnect()函数还调用sysHwInit2()函数安装所有外部设备的中断处理程序,例如:串口中断挂载程序sysSerialHwInit2()。启动完成后所有外部设备驱动开始工作。

2 BSP开发

2.1 硬件平台介绍

PowerPc处理器是Freescale、IBM和苹果电脑的合作结晶。作为一个处理器,PowerPc在指令集、指令执行和处理器内核的设计方面具有很强的优势[5]。MPC8548是基于Freescale(飞思卡尔)的PowerPC架构的PowerQuiccⅢ处理器,其强大的处理能力特别适合于高速低时延的处理。主要参数如下[6]:

路面基层检测合格及模板安装完成后,进行钢筋网安装。先将横筋按设计尺寸布置于底层,再将纵筋布置横筋上方,在此过程中要注意钢筋在板厚方向的高度,预留足够的保护层厚度。钢筋布置完成后进行钢筋连接,纵向钢筋接头采用电弧单面焊接,搭接长度为16cm,焊接接头处应错开布置,接头连线与路面行车方向成45°夹角,纵向钢筋与横向钢筋交叉处采用钢丝绳绑扎。采用φ16钢筋弯拉制做成“Ω”形置于横向钢筋下作为钢筋支架,并采用电焊连接,横向布置间隔约为150cm,纵向布置间隔约为120cm。

最高频率:1.5 GHz;支持内存:最高2 G Byte DDR2 SDRAM;Flash:最高512 Kbyte+64 MByte×2+1 GByte;以太网口:前面板端2个千兆RJ45口;串口:前面板监控串口;PCIexpress:AMC金手指端支持PCIe x4;电源:支持单板外部输入单独12 V/2 A电源和AMC金手指端供电。

采用的硬件平台是围绕MPC8548处理器设计的通信板。如图3,硬件平台的外设有:512 MByte的SDRAM,1 G×16 Bit NAND Flash Memory,RS-232串口,10/100 Mbit/s网口和JTAG调试端口。

图3 硬件平台结构

2.2 BSP函数实现

2.2.1 rominit()函数

该函数在romInit.s中实现,其主要功能是:配置HRCW;配置内存系统;初始化堆栈指针[7]。

(1)配置HRCW。本平台CPU使用的HRCW为0x0AA356B7,CPU读取HRCW后将自身设置为特定状态。MPC8548处理器使用指向FLASH的CS0,上电启动后CS0有效且读/写位宽是16 bit,MPC8548从FLASH的地址0x00、0x08、0x10和0x18共计读取32 bit的HRCW,配置其自身的工作模式。然后在执行一段跳转指令后MPC8548将程序计数器指向FLASH地址0x100(复位异常向量)处执行rominit()函数。因此在rominit.s文件的开始部分通过汇编指令.fill将硬件复位字写到0x00、0x08、0x10和0x18处,剩余空间直到0x100处写0,具体如下:

.fill 8,1,0x0A

.fill 8,1,0xA3

.fill 8,1,0xB7

.fill 224,1,0

rominit:

(2)配置内存系统。当执行到romInit()函数时,romInit()在屏蔽外部中断,关闭高速缓存后开始配置连接FLASH和SDRAM内存的控制器,确定它们的内存地址(分配给FLASH的基地址为0xF0000000)。此时将FLASH映射到地址为0xFC000000的空间,如果不执行一段跳转指令,CPU将按照地址0x0从FLASH中读取指令,造成系统崩溃。

解决方法如下:在romInit函数内部定义一个符号start,让跳转指令跳到这个符号的位置执行,跳转地址=0xF0000000+start-0x100。此时CPU才能以0xFC00000为基地址,从偏移地址(start-0x100)读取指令。

接下来只需完成CS0对应的寄存器配置,以确定FLASH和SDRAM地址空间划分。

2.2.2 sysLib.c文件

sysLib.c是BSP初始化的核心代码,提供了Vx-Works和应用程序之间的板级联系。动态页表和静态页表是两种主要的内存映射模式,这里着重介绍动态页表的配置。

为提高系统的实时性,硬件平台将开启MMU功能。BSP在sysLib.c文件中定义了一个结构体数组sysPhysMemDesc[]来配置MMU的动态页表。sys-PhysMemDesc[]数组中的每个结构体对应着物理内存中一个块单元,结构体定义了物理地址、物理地址映射的虚拟地址(一般情况下与物理地址相同)、该块内存初始化状态信息、掩码信息等。其可包含的映射空间有内存、Flash、ROM、I/O设备等,可以根据系统的需求自行进行配置。部分代码如下[8]:

PHYS_MEM_DESCsysPhysMemDesc[]=

{

{(void*)(ROM_BASE_ADRS+0xF0000000),(void*)(ROM_BASE_ADRS),

ROUND_UP(ROM_SIZE_TOTAL*2,PAGE_SIZE),VM_STATE_MASK_VALID|

VM_STATE_MASK_WRITABLE|VM_STATE_MASK_CACHEABLE,VM_STATE_VALID|

VM_STATE_WRITABLE_NOT|VM_STATE_CACHEABLE_NOT},

};

上面的代码是对ROM_BASE_ADRS的内存映射,ROM_BASE_ADRS+0Xf0000000是要映射的虚拟地址,ROM_BASE_ADRS是硬件设计时定义的实际物理地址,ROUND_UP(ROM_SIZE_TOTAL*2,PAGE_SIZE)是映射长度,VM_STATE_MASK_VALID|VM_STATE_MASK_WRITABLE|VM_STATE_MASK_CACHEABLE是初始化的地址状态,VM_STATE_VALID|VM_STATE_WRITABLE_NOT|VM_STATE_CACHEABLE_NOT是实际初始化的地址状态。

sysLib.c中包含了与硬件初始化密切相关的函数sysHwInit()和函数sysHwInit2()[9]。

2.2.3 sysHwInit()函数

sysHwInit()函数的功能是初始化系统硬件,该函数包含在sysLib.c文件中。根据本硬件平台开发需求,需要编写中断控制器初始化函数IntrInit()和串口控制器初始化函数sysSerialHwInit()。

(1)IntrInit()函数。该函数位于IntrInit.c文件。根据MPC8548中断控制器的工作原理需要实现以下3个功能:

一是,将中断分离程序挂接到外部异常向量上。PowerPC处理器所有外部中断共享同一个外部异常向量0x500,中断分离程序的作用是识别中断源,然后获得中断向量并调用中断服务程序ISR。

二是,安装钩子函数。系统提供了3个钩子函数:中断连接函数_func_intConnectRtn、中断使能函数_func_intEnableRtn和中断禁止函数_func_intDisableRtn。需根据中断控制器工作原理编写具有上述功能的3个函数,然后指向对应的钩子函数。

三是,禁止所有中断。

(2)sysSerialHwInit()函数。该函数在sysSerial.c文件中实现,负责处理器引脚配置和串口控制器配置。MPC8548处理器外部引脚是复用的,需要分为3步来执行初始化:将串口控制器对应的引脚配置为串口使用;配置串口工作模式及速率;为串口驱动分配收/发缓冲。

2.2.4 sysHwInit2()函数

该函数位于sysLib.c文件,其负责连接系统中断,初始化其它必要的配置[10]。在初步开发时,平台外部设备只使用串口模块,sysHwInit2()函数只需要调用串口中断挂载函数sysSerialHwInit2(),该函数在sysSerial.c文件中实现,实现方法是:根据所使用串口的中断号,调用系统函数intConnect()将中断处理程序注册到系统中断向量表中。

3 调试

3.1 ICE(In-Circuit Emulator)调试法

BSP开发过程中最常用的一种调试方法是ICE调试法,如图4所示。其过程是仿真头插在用户板的CPU位置上,然后在仿真器RAM中或目标机RAM中下载好被调试的VxWorks镜像。ICE调试法的原理为:在具体硬件平台上运行仿真器的CPU来调试软件。

图4 IDE调试法

3.2 调试过程中遇到的几个问题

rominit.s中有少量的初始化操作,这些操作是为载入VxWorks镜像服务的,在能够保证正常载入镜像的情况下要使rominit.s中的初始化操作尽量的精简。实际上绝大部分初始化任务要由sysHwInit()函数来完成。

函数malloc()不能在调试阶段调用。这是由于malloc()属于缓冲区函数,在内存分配的初始化还未完成时调用函数malloc()将导致系统崩溃。前文提到的intConnect()不能够在sysHwInit()中被调用。

4 结束语

文中介绍了VxWorks BSP的组成和功能,并以MPC8548为核心的硬件平台为例详细介绍了BSP的开发过程。虽然针对不同的硬件平台,BSP需要根据具体的硬件细节进行具体的设计,但是各类硬件平台之间还是有一定的共性,故对VxWorks BSP的开发者有一定的借鉴作用。同时,“整体移植,局部修改”的开发方法对开发效率有明显提高。

[1]陈智育,温彦军,陈 琪.VxWorks程序开发实践[M].北京:人民邮电出版社,2004.

[2]周启平,张 扬.VxWorks下设备驱动程序及BSP开发指南[M].北京:中国电力出版社,2004.

[3]Wind River.VxWorks kernel programmer's guide 6.4[EB/OL].http//www-ad.fnal.gov/controls/micro_p/manuals/vx-works_kernel_programmers_guide_6.4.pdf.2012-12-15.

[4]Wind River.VxWorks architecture supplement 6.4[EB/OL].http://www-ad.fna1.gov/controls/micro~/manu-als/vxworks-architecture supplemen_6.4.pdf.2012-12-10.

[5]王 齐.Linux PowerPc详解-核心篇[M].北京:机械工业出版社,2007.

[6]Freescale.MPC8548E PowerQUICCTMⅢIntegrated Processor Family Reference Manual[EB/OL].http://cache.freescale.com/files/32bit/doc/ref_manual/MPC8548ERM.pdf.2012-12-8.

[7]王彦刚,吕遵明,万留进.VxWorks系统的BSP设计与实现[J].计算机系统应用,2011,20(12):91-94.

[8]李 丹.E500 MMU架构研究及VxWorks下的优化方案[J].计算机工程与应用,2010,48(30):56-61.

[9]Wind River.VxWorks architecture supplement 6.4[EB/OL].http://www-ad.fna1.gov/controls/micro~/manuals/vxworks-architecture_supplement_6.4.pdf.2012-12-8.

[10]张 忠,樊留群.VxWorks在S3C2410上的BSP设计[J].微型电脑应用,2005,21(10):16-19.

猜你喜欢
驱动程序镜像中断
镜像
“单片机中断概述”微课教学设计
一种考虑GPS信号中断的导航滤波算法
阻止Windows Update更新驱动程序
Linux中断线程化分析及中断延时测试
计算机硬件设备驱动程序分析
镜像
跟踪导练(二)(5)
镜像
妙用鼠标驱动