基于龙芯2F平台下Vxworks移植的研究与实现

2014-08-15 20:59郭勇等
科技视界 2014年18期

郭勇等

【摘 要】本文简单介绍了VxWorks实时操作系统和龙芯2F处理器,对基于龙芯2F平台的VxWorks系统移植进行了分析,并详细介绍了移植内容,包括文件的配置、中断管理、PCI库的实现和驱动程序等方面详细。

【关键词】龙芯2F;VxWorks;BSP;系统移植

0 引言

VxWorks是美国WindRiver公司推出的一种嵌入式实时操作系统,以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中。

龙芯系列处理器是中国科学院计算所自主开发的国产处理器系,龙芯2F微处理器是64位MIPS 指令集的通用RISC处理器,其最高工作频率为1GHZ[1],具有高性能、低功耗等特点。现有的龙芯平台大都基于Linux操作系统,但是在工业控制、高性能嵌入式等领域,对实时性、定制性的要求很高,因此VxWorks系统才是比较理想的选择。

本文首先明确移植的基本思路,然后分别从中断分级管理性维护、地址空间的访问扩展、PCI设备的读写机制和驱动程序开发与配置的建立等几个方面来展开相关的工作。

1 BVxWorks移植分析

1.1 VxWorks移植的主要内容

VxWorks主要由三部分组成:BSP、微内核及I/O系统,BSP( Board Support Package)是板级支持包,是介于主板硬件和操作系统之间的一层,包括硬件初始化、中断处理、时钟管理、MMU等功能.在龙芯2F平台上移植VxWorks,主要就是完成板级支持包BSP的开发.

1.2 VxWorks启动流程分析与移植思路

与X86的BIOS不同,龙芯2开发板的BIOS采用了PMON,可以通过网络或硬盘直接加载ELF格式的VxWorks映像文件到内存中运行。对可下载型的VxWorks映像文件,说明如下[2]。

SysInit()为VxWorks映像的入口函数,它由汇编语言编写。SysInit()通过对CPU内部各种控制与状态寄存器的设置来使得CPU具有确定的工作方式和稳定的状态等,然后跳到c语言函数usrInit()。

usrInit()函数主要进行外围硬件初始化,为下载VxWorks内核映像做初始准备,主要包括cache库初始化、系统中断向量初始化、目标板硬件初始化等,最后调用kernelInit()。

kernelInit()为由风河vxWorks库文件封装的,功能为提取kernel并运行,使得后期的初始化能够以kernel下运行的任务来完成。该任务名为tRootTask,它执行的方式类似于usrRoot。

针对龙芯2F开发板,usrInit()调用的cacheLibInit()、sysHwInit()、sysHwInit2()等函数是与硬一些主要的硬件初始化函数。一部分处理器由于有第三方支持的BSP,可以使用户方便的使用。而对于龙芯2F,由于其为国产处理器,则通常需要自己建立龙芯2F 专用的BSP。

通常情况下BSP开发的流程是,先实现一个最小化的VxWorks内核,向其中添加定时器、串口设备、中断控制器等基本驱动程序,使得VxWorks系统基本可用,然后在此基础上添加其他设备,最终满足目标需求.本文进行龙芯2F平台的BSP开发也是基于该流程。

2 龙芯2F平台的VxWorks移植

2.1 Config.h与MakeFile文件的配置

为了使Pmon能够直接加载VxWorks,需要在BSP 包的MakeFile与Config.h件中修改VxWorks映像文件的入口地址,使其在Pmon支持的加载地址范围内。Config.h文件还涵盖了龙芯2F的所有包含文件和定义,需要对其修改.修改Config.h文件如下:

#define ROM_BASE_ADRS 0xbfc00000

#define ROM_TEST_ADRS 0xbfc00000

#define ROM_SIZE 0x00100000

#define ROM_HIGH_ADRS 0x bfd00000

#define ROM_LOW_ADRS 0x 00100000

中,ROM_BASE_ADRS表示ROM的基地址,ROM_TEST_ADRS表示初始化启动代码存放在ROM中的起始地址,ROM_SIZE表示ROM 的大小,若存储空间大小为8Mbit,则应该定义为为0x00100000.ROM_HIGH_ADRS表示复制BooTROM 到RAM 所使用的目标地址,ROM_LOW_ADRS表示RAM中的VxWorks运行的起始地址。

此外还要修改MakeFile文件,如CPU类型号,选择编译工具,附加编译选项等。应注意要保证MakeFile和ConFig.h中ROM和RAM宏定义中地址一致等。

2.2 中断管理

龙芯处理器在它的Cause寄存器中有8个独立的中断位,分别对应IP1-IP8,当中断发生触发异常,异常处理函数读取Cause寄存器的EXCODE域为0,判断异常为中断产生,然后读取Cause寄存器IP位判断中断来自哪个引脚[3-4]。

VxWorks通过intPrioTable[]来管理MIPS的一级中断,intPrioTable[]表项数据类型为PRIO_TABLE,根椐本课题实际应用,intPrioTable[]数组设计如下。

PRIO_TABLE intPrioTable[] =

{

{CAUSE_SW1, (ULONG) IV_SWTRAP0_VEC, 0x000100, 0},

{CAUSE_SW2, (ULONG) IV_SWTRAP1_VEC, 0x000200, 0},

{CAUSE_IP3, (ULONG) sysFeiInt, 0x000400, 1},

{CAUSE_IP4, (ULONG) sysSerialprint, 0x000800, 36},

{CAUSE_IP5, (ULONG) NULL, 0x001000, 0},

{CAUSE_IP6, (ULONG) NULL, 0x002000, 0},

{CAUSE_IP7, (ULONG) sysNetInt, 0x004000, 40},

{CAUSE_IP8, (ULONG) IV_TIMER_VEC, 0x008000, 0},

};

2.3 PCI库的实现

在Vxworks的硬件初始化函数sysHwInit()中对PCI库进行初始化。对于龙芯2而言,PCI采用配置机制0,读写函数具体由sysPciConfigRead()和sysPciConfigWrite()来实现,通过PCI总线号,PCI设备号,PCI功能号,按传入的字节宽度,实现对PCI配置空间的寄存器地址进行读写操作。PCI库初始化如下:

pci Config LibInit (PCI_MECHANISM_0, ULONG) sysPciConfigRead, ULONG)sysPciConfigWrite,NONE);sysPciConfigRead()和sysPciConfigWrite()基本实现见[4]。Vxworks中实现PCI资源(I/O端口地址、PCI Memory地址、中断号)的自动分配可以通过sysPciAutoConfig ()接口来实现。

2.4 串口驱动程序开发

龙芯2F平台的启动过程中,需要对串口设备初始化.普通多模式串行驱动程序存放在target/src/drv/sio目录下.此目录中包括了很多常见的串口设备的驱动源文件,如i8250SIO.c和nsl16550sio.c等等,同时还包含了templateSio.c模板文件.龙芯2F中的UART串口设备兼容NS 16550,因此可以直接使用nsl16550sio.c作为串口驱动.如果需要添加特殊串口设备时,需要先在模版templateSio.c上创建驱动程序,然后修改BSP的syslib.c或sysSerial.c文件,以使它们包括所需的驱动程序.由于本文龙芯2F平台的所用硬件均为普通的常用设备,可同样按照上述方式添加与配置.

3 结束语

针对不同的用途和需求,龙芯2F的硬件平台配置也各不相同,但Vxworks移植的方法是类似的.本文详细研究了龙芯2F平台下的Vxworks移植方法,并在龙芯2F开发板上验证了其可行性,一定程度上可以拓展龙芯系列在高性能嵌入式等领域的应用范围。

【参考文献】

[1]龙心.中国科学院计算技术研究所.2F处理器用户手册[Z].2008.

[2]王金刚,译.Wind River.VxWorks BSP开发人员指南[M].北京:清华大学出版社,2003.

[3]Wind River Ststem,Inc,VxWorks BSP Developers Guide [Z] ,2008.

[4]赵传良,张福新,陶品,等,译.Dominic Sweetman MIPS处理器设计透视[M]. 北京:北京航空航天大学出版社,2005.

[责任编辑:薛俊歌]

{CAUSE_SW2, (ULONG) IV_SWTRAP1_VEC, 0x000200, 0},

{CAUSE_IP3, (ULONG) sysFeiInt, 0x000400, 1},

{CAUSE_IP4, (ULONG) sysSerialprint, 0x000800, 36},

{CAUSE_IP5, (ULONG) NULL, 0x001000, 0},

{CAUSE_IP6, (ULONG) NULL, 0x002000, 0},

{CAUSE_IP7, (ULONG) sysNetInt, 0x004000, 40},

{CAUSE_IP8, (ULONG) IV_TIMER_VEC, 0x008000, 0},

};

2.3 PCI库的实现

在Vxworks的硬件初始化函数sysHwInit()中对PCI库进行初始化。对于龙芯2而言,PCI采用配置机制0,读写函数具体由sysPciConfigRead()和sysPciConfigWrite()来实现,通过PCI总线号,PCI设备号,PCI功能号,按传入的字节宽度,实现对PCI配置空间的寄存器地址进行读写操作。PCI库初始化如下:

pci Config LibInit (PCI_MECHANISM_0, ULONG) sysPciConfigRead, ULONG)sysPciConfigWrite,NONE);sysPciConfigRead()和sysPciConfigWrite()基本实现见[4]。Vxworks中实现PCI资源(I/O端口地址、PCI Memory地址、中断号)的自动分配可以通过sysPciAutoConfig ()接口来实现。

2.4 串口驱动程序开发

龙芯2F平台的启动过程中,需要对串口设备初始化.普通多模式串行驱动程序存放在target/src/drv/sio目录下.此目录中包括了很多常见的串口设备的驱动源文件,如i8250SIO.c和nsl16550sio.c等等,同时还包含了templateSio.c模板文件.龙芯2F中的UART串口设备兼容NS 16550,因此可以直接使用nsl16550sio.c作为串口驱动.如果需要添加特殊串口设备时,需要先在模版templateSio.c上创建驱动程序,然后修改BSP的syslib.c或sysSerial.c文件,以使它们包括所需的驱动程序.由于本文龙芯2F平台的所用硬件均为普通的常用设备,可同样按照上述方式添加与配置.

3 结束语

针对不同的用途和需求,龙芯2F的硬件平台配置也各不相同,但Vxworks移植的方法是类似的.本文详细研究了龙芯2F平台下的Vxworks移植方法,并在龙芯2F开发板上验证了其可行性,一定程度上可以拓展龙芯系列在高性能嵌入式等领域的应用范围。

【参考文献】

[1]龙心.中国科学院计算技术研究所.2F处理器用户手册[Z].2008.

[2]王金刚,译.Wind River.VxWorks BSP开发人员指南[M].北京:清华大学出版社,2003.

[3]Wind River Ststem,Inc,VxWorks BSP Developers Guide [Z] ,2008.

[4]赵传良,张福新,陶品,等,译.Dominic Sweetman MIPS处理器设计透视[M]. 北京:北京航空航天大学出版社,2005.

[责任编辑:薛俊歌]

{CAUSE_SW2, (ULONG) IV_SWTRAP1_VEC, 0x000200, 0},

{CAUSE_IP3, (ULONG) sysFeiInt, 0x000400, 1},

{CAUSE_IP4, (ULONG) sysSerialprint, 0x000800, 36},

{CAUSE_IP5, (ULONG) NULL, 0x001000, 0},

{CAUSE_IP6, (ULONG) NULL, 0x002000, 0},

{CAUSE_IP7, (ULONG) sysNetInt, 0x004000, 40},

{CAUSE_IP8, (ULONG) IV_TIMER_VEC, 0x008000, 0},

};

2.3 PCI库的实现

在Vxworks的硬件初始化函数sysHwInit()中对PCI库进行初始化。对于龙芯2而言,PCI采用配置机制0,读写函数具体由sysPciConfigRead()和sysPciConfigWrite()来实现,通过PCI总线号,PCI设备号,PCI功能号,按传入的字节宽度,实现对PCI配置空间的寄存器地址进行读写操作。PCI库初始化如下:

pci Config LibInit (PCI_MECHANISM_0, ULONG) sysPciConfigRead, ULONG)sysPciConfigWrite,NONE);sysPciConfigRead()和sysPciConfigWrite()基本实现见[4]。Vxworks中实现PCI资源(I/O端口地址、PCI Memory地址、中断号)的自动分配可以通过sysPciAutoConfig ()接口来实现。

2.4 串口驱动程序开发

龙芯2F平台的启动过程中,需要对串口设备初始化.普通多模式串行驱动程序存放在target/src/drv/sio目录下.此目录中包括了很多常见的串口设备的驱动源文件,如i8250SIO.c和nsl16550sio.c等等,同时还包含了templateSio.c模板文件.龙芯2F中的UART串口设备兼容NS 16550,因此可以直接使用nsl16550sio.c作为串口驱动.如果需要添加特殊串口设备时,需要先在模版templateSio.c上创建驱动程序,然后修改BSP的syslib.c或sysSerial.c文件,以使它们包括所需的驱动程序.由于本文龙芯2F平台的所用硬件均为普通的常用设备,可同样按照上述方式添加与配置.

3 结束语

针对不同的用途和需求,龙芯2F的硬件平台配置也各不相同,但Vxworks移植的方法是类似的.本文详细研究了龙芯2F平台下的Vxworks移植方法,并在龙芯2F开发板上验证了其可行性,一定程度上可以拓展龙芯系列在高性能嵌入式等领域的应用范围。

【参考文献】

[1]龙心.中国科学院计算技术研究所.2F处理器用户手册[Z].2008.

[2]王金刚,译.Wind River.VxWorks BSP开发人员指南[M].北京:清华大学出版社,2003.

[3]Wind River Ststem,Inc,VxWorks BSP Developers Guide [Z] ,2008.

[4]赵传良,张福新,陶品,等,译.Dominic Sweetman MIPS处理器设计透视[M]. 北京:北京航空航天大学出版社,2005.

[责任编辑:薛俊歌]