APP下载

基于龙芯宇航级芯片的BSP开发和移植*

2020-05-04林宝军刘迎春

计算机工程与科学 2020年4期
关键词:龙芯中断串口

徐 帅,林宝军,刘迎春,赵 帅

(1.中国科学院空天信息创新研究院,北京 100094;2.中国科学院大学,北京 100094;3.中国科学院微小卫星创新研究院,上海201203;4.上海科技大学信息科学与技术学院,上海 201203)

1 引言

2018年,北斗三号导航卫星系统完成19颗卫星发射、组网基本系统的建成,可以向全球提供服务[1]。至2020年底,北斗导航系统将全面建成,30颗卫星在轨组网运行,向全球提供定时、测速、授时的导航功能。北斗三号卫星配备了Ka频段星间链路,1颗卫星可与多颗卫星建链[2],未来可能还会搭载通信速率更快的激光星间链路,使得星间通信速率从几百Kb/s提升至1 Gb/s。随着星间链路的广泛应用,大量的遥控、遥测、导航和测量等数据由星间链路传输至每一颗卫星的星载计算机内进行处理,卫星网络也需要传输和处理网络管理信息,这些都对星上计算机系统的性能提出了更高要求。文献[3]中提出了基于星间链路的集中式自主导航算法,配合星间链路的高速率数据传输,在同等周期下,星载计算机需要处理和存储更多的数据,配备更快的通信接口。这些都对现有CPU的频率、存储、数据接口提出了挑战,软件方面也需要设计复杂算法,搭建高速数据存储交互的基础环境。

2018年中国科协年会中杨长风总设计师提出了北斗导航系统未来瞄准PNT(Positioning Navigation Timing)体系[4],实现更高精度的导航,信息更多元化,空天地一体化。可以预见,北斗卫星的星载计算机处理能力仍将不断提升。

国产星载计算机的发展比国外起步晚,最早多采用运行能力只有几MIPS的处理器,目前中国科学院研制的北斗卫星在轨星载计算机,采用一种基于核心部件全部自主可控的高运算性能和高数据传输性能的方案,即以龙芯中科公司生产的龙芯1E高性能宇航级处理器芯片为主构建硬件环境,采用32位龙芯2号处理器,2 MB Flash和128 MB SDRAM存储架构,以1553B总线为通信接口。

星载操作系统经过了由简单顺序执行的无系统模式到功能强大的实时操作系统VxWorks的发展过程,其优越的实时性和可裁剪内核等优势使其在星载操作系统中成为标杆。目前,星载操作系统多运行在较低频率和小存储空间的星载计算机中[5],在设备驱动方面,外设驱动采用由应用程序直接调用的管理方式,需要设计更多面向高频高速多接口的星载计算机操作系统管理方案。

为适应类似新需求,星载计算机将采用升级的新型龙芯1E高性能处理器芯片,通信峰值速率提升100倍,处理峰值速度提升2倍[6]。在软件方面,对星上软件和操作系统VxWorks 6.8进行移植,同时为配合卫星网络通信需求,并保证其可靠性、独立性,将外设驱动修改为由内核管理,为多线程多任务运行创建软件基础。

本文将对VxWorks 6.8进行板级支持包BSP(Board Support Package)开发[7]、移植操作系统到新型1E芯片,在设备驱动开发中采用新型VxBus型架构[8],并配置操作系统组件。

2 BSP移植背景和需求

新型龙芯1E芯片具有频率更高、处理速度更快等优点,处理器核采用64位双发射龙芯2号GS232,峰值频率由以前的100 MHz提升到200 MHz,定点峰值性能从200 MIPS提升到400 MIPS,较上一代芯片处理速度有成倍的提升;SDRAM空间提升至256 MB;通信接口方面除传统的1553B外,还配备了SpaceWire高速通信接口,峰值速度从1 Mb/s提升到200 Mb/s。SpaceWire和DMA相结合,可实现远程访问内存的功能。

软件需采用一个较好的解决方案实现相应的移植开发:

(1)软件开发环境、编译方法。

星上软件目前开发环境为代码阅读器+命令行编译。该方式有以下缺点:对复杂工程管理不足,对应用程序开发和调试不友好,对VxWorks内核和驱动等组件添加、删除不方便等。并且未来星载计算机发展到多核CPU后,该编译方式不能支持VxWorks对称多处理器SMP(Symmetrical Multi-Processing)编译。对于VxWorks 6.8的编译,风河公司推出WorkBench编译器作为开发工具,该编译器界面友好,方便对BSP[8]、内核、驱动、应用程序实现相互独立开发,适合管理复杂的星载软件工程。在系统组件方面可以实现一键添加和删除,大大提升了开发效率。

(2)驱动程序管理方式。

星载计算机驱动程序管理方式分为3类:应用程序直接管理、通过内核调用驱动、通过系统扩展模块调用驱动程序(例如网络)。文献[9]中指出由应用程序直接管理代码效率高,实时性较高,但面向多核多线程运算时这种驱动模式可能会造成缓存数据冲突,产生死锁等问题。本文采用风河公司推出的VxBus型驱动架构管理驱动程序,该架构对设备管理结构更清晰,开发更简便,可在WorkBench编译器中配置,在层次上VxBus型驱动和内核、应用程序独立,为其他层次提供统一接口,具有更好的可靠性、可移植性等优点,为应用层开发提供便利。

(3)对新型1E芯片硬件环境适配。

本文硬件平台选用新型芯片,在操作系统移植过程中,对硬件环境做相应的适配:配合更大数据存储和计算需求,内存管理增加VxWorks 任务栈、中断栈空间等VxWorks系统管理空间,并采用VxBus型驱动管理中断驱动,在系统启动时对相应组件和中断向量表进行配置。为支持自主导航算法中大量浮点等复杂计算和C++编译环境,在VxWorks启动阶段配置协处理器开启浮点计算,在操作系统初始化阶段添加C++组件。

3 BSP介绍及移植思路

3.1 BSP介绍

板级支持包BSP,顾名思义,它是应用于操作系统和硬件资源之间的相关软件集合。其主要功能是配置硬件,为操作系统屏蔽硬件,使得上层软件开发不需配置底层,并且在此基础上,BSP要完成操作系统的引导和启动,外设驱动和内核初始化等任务,使得操作系统可以运行在不同的硬件环境中。从层次上分,BSP也属于操作系统的一部分,如图1所示。

Figure 1 VxWorks operating system structure图1 VxWorks操作系统结构图

3.2 VxWorks启动流程

考虑到本文开发的BSP应用在星载系统中,在保证安全有效存储操作系统镜像前提下,对开发做出以下前提声明:

如图2所示,BootLoad存放在NandFlash中,通过BootLoad下载并引导操作系统,引导过程中,将操作系统拷贝到RAM_LOW_ADRS的位置运行。引导结束后,将执行权交给VxWorks操作系统,开始进行系统初始化[10]。

Figure 2 Storage structure of VxWorks图2 VxWorks存储结构

图3所示为从函数级描述操作系统启动过程,BootLoad将程序指针跳转到RAM_LOW_ADRS后执行sysInit(),对CPU进行基础初始化,进而在usrInit()中通过接口sysHwInit()和KernelInit()对硬件设备和操作系统内核进行初始化,之后运行usrRoot()完成内核组件创建并跳到应用层,执行应用程序[11]。

Figure 3 VxWorks startup process图3 VxWorks启动流程

3.3 移植思路

本文采用风河公司推出的VxWorks 6.8操作系统,编译环境采用适用于复杂项目管理、具有良好调试功能的WorkBench 3.2,满足星载系统软件开发需求。在系统启动阶段,启动新型龙芯1E芯片的协处理器1,以增强浮点运算能力,并添加C++、VxBus等系统组件,为复杂算法搭建软件基础。采用VxBus型驱动架构管理串口等外部设备。在中断管理方面,利用VxBus型架构分层管理中断驱动。将内存分配为VxWorks管理和静态管理2部分,并增加VxWorks管理区域,充分利用新型1E龙芯芯片的存储空间。

4 BSP移植实践及关键技术

4.1 VxWorks BSP相关组件编写方案

在VxWorks BSP开发中,从文件角度需要编写以下组件:

(1)Config.h。

Config.h是缺省配置文件,在操作系统启动和初始化过程中,将会根据Config.h的参数来对操作系统进行配置。开发人员在该文件中对BSP基本配置选项进行设置,例如系统时钟频率、内存起始地址、Cache模式等,通过#define、#undef的宏命令来对BSP的组件进行添加和裁剪。必须的组件配置需要写入该文件中,其他的可选组件可以在WorkBench开发中进行添加。

在Config.h中更改RAM_LOW_ADRS镜像起始地址,通过设置LOCAL_MEM_SIZE规定VxWorks操作系统管理内存区域大小,并添加对VxBus型驱动架构的支持,添加编写的驱动模块,例如串口、中断、时钟。配置操作系统对浮点操作和C、C++的支持。

(2)Makefile。

Makefile是BSP的编译文件,在该文件中指定编译VxWorks镜像时所要使用的编译器和函数库。另外需要指定根启动设备ROM大小和地址、增加的目标模块、编译应用层软件所需要的源码文件。

(3)sysAlib.s。

在sysAlib.s中改写sysInit(),该程序为VxWorks启动的入口程序,其主要功能是初始化协处理器,建立环境启动usrInit()。下面以伪代码形式介绍本文方案:

sysInit(){

使能协处理器0,1;

清空中断;

清空协处理器0的CAUSE、WIRED寄存器;

启动向量入口地址控制,置协处理器0 ERL为1;

清空TLB,建立堆栈;

建立全局偏移量表指针;

初始化处理器时钟计数器、计时器中断控制器;

将usrInit()入栈并执行;

}

(4)sysLib.c。

该文件主要提供目标板硬件资源的初始化接口。通过编写sysHwInit()、sysHwInit2()函数,实现对目标板的硬件初始化。操作系统对VxBus驱动的支持也是在这2个函数中完成。在sysHwInit()对VxBus架构进行第1次初始化,调用hardWareInterFaceInit()接口,初始化硬件设备表的数据结构,对VxBus型设备挂接的虚拟总线PLB进行初始化,注册VxBus型设备。在sysHwInit2()中,调用vxbDevInit()进行设备第2次初始化,包括设置设备的寄存器和内存缓存区等,并向应用层提供接口。最后在vxbDevConnect()中完成中断挂接,至此硬件设备驱动初始化完成。

(5)hwconf.c。

VxWorks在该文件中定义hcfDeviceList[]列表来描述VxBus驱动架构的所有硬件设备。hcfDeviceList[]列表是由一个个设备结构体构成的,所有与硬件相关的设置都在设备结构体中完成,进而在注册设备驱动时被写入驱动程序中。在设备结构体中需要定义设备寄存器基地址、中断号、设备引脚号等。本文中ns16550串口、MIPS中断、R4K时钟在hwconf.c中注册。

4.2 中断管理方案

本文中硬件环境是MIPS架构的龙芯1E芯片,对于中断采用VxBus驱动的方式管理。在硬件结构上,MIPS的芯片采取分层次管理。第1层为MIPS中断控制,共有8个类型,第2层为龙芯1E中断控制,共有32个中断[12],本文中涉及时钟中断和串口中断。在编写软件时,本文采用分层次的方式管理中断。

第1层MIPS中断控制,可利用自带的VxBus型中断控制驱动。在hwconf.c中添加所需要控制的中断设备引脚说明,将引脚2设置为龙芯1E中断,将引脚7设置为时钟中断。第2层的中断为板级中断,将引脚11、12设置为串口0、1中断并更新向量表。然后在hwconf.c中添加龙芯1E的中断:

Const Struct intrCtlrInputsmipsLSIntCtlrInputs[]{

{11,”ns16550”,0,0},

{12,”ns16550”,1,0}

}

const struct hcfResourcemipsLSResources[]={

{“regBase”,HCF_RES_INT,(void *)TRUE},

{“input”,HCF_RES_ADDR,((void *)mipsLSIntCtlrInputs[0])},

{“inputTableSize”,HCF_RES_INT,{(void *)

NELEMENTS(mipsLSIntCtlrInputs)}}

}

#definecpuNumNELEMENTS(mipsLSResources)

在设备列表中添加中断设备:

{“mipsLSIntCtlr”,0,VXB_BUSID_PLB,0,cpu0Num,mipsLSResources}

4.3 内存管理方案

从硬件角度看,在32位MIPS存储器架构中,对程序空间地址映射分为4大区域:kuseg,kseg0~kseg2。本文将地址空间的kseg0和kseg1直接映射到物理地址空间的最低0.5 GB。考虑到星载软件对实时性和安全性的要求,将内存分为静态管理和动态管理2部分。本文将操作系统映射到kseg0区域,将200 MB分配给操作系统作为动态内存使用,即:0x80000000~0x8C800000用于系统运行、局部变量存储等。剩下的地址空间作为静态内存使用,重启不刷新,用于存储遥测数据等。

图4为用于动态存储的内存空间分配图。在本文中,低端内存区域存放中断向量表、bootline、exception message等信息。RAM_LOW_ADRS=0x801000000,VxWorks区域存放操作系统映像的代码段、数据段和BSS(Block Started Symbol)段。WDB(Wind deBug)内存池在前期开发时使用,主要用于动态下载目标模块、传递参数等。VxWorks可用内存区域主要用于动态内存分配(malloc等)、任务和中断堆栈等。

Figure 4 Dynamic memory allocation图4 动态内存分配图

静态存储起始地址为0x8C800000,至SDRAM结束。在操作系统运行时,可由应用程序直接向这段区域写入数据,省去了系统调度等过程,提供了很好的实时性和可靠性。具体的分配策略可根据应用层程序的需要进行分配,以达到最好的内存利用状态。

4.4 时钟管理方案

时钟管理关系着操作系统任务调度、超时处理、时钟计时、时钟中断等。本文中新型龙芯芯片通过配置PLL分倍频参数将系统时钟设置为180 MHz,其高频PLL结构图如图5所示,输入的时钟Fin经过输入分频后得到Fref时钟,该时钟送到倍频器,得到Fvco,然后在输出前除以1个分频系数,得到 PLL 输出时钟Fout。转换方式如式(1)和式(5)所示:

Fout=Fin/ref*ldf/odf

(1)

Figure 5 Clock PLL structure图5 高频PLL结构图

在操作系统中采用VxWorks所提供的MIPS R4K的VxBus型驱动管理时钟。在Config.h中包含#define DRV_TIMER_MISR4K驱动组件并将系统时钟设置为180 MHz。在hwconf.h中设置时钟参数:最小时钟、最大时钟、CPU频率等。关键代码如下所示:

Const Struct hcfResourcer4KTimerDevResources[]{

{“regBase”,HCF_RES_INT,(void *)0},

{“minClkRate”,HCF_RES_INT,(void *)SYS_CLK_RATE_MIN},

{“maxClkRate”,HCF_RES_INT,(void *)SYS_CLK_RATE_MIN},

{“cpuClkRate”,HCF_RES_INT,(void *)180000000},

};

#definer4TimerDevNumNELEMENTS(r4KTimerDevResources)

在设备列表中添加时钟设备:

{“r4KTimerDev”,0,VXB_BUSID_PLB,0,r4TimerDevNum,r4KTimerDevResources}

5 VxBus型串口驱动编写

VxWorks系统提供了VxBus型驱动来管理I/O设备,本文以常用的ns16550串口为基础,编写驱动软件。

5.1 串口数据结构定义

编写VXBNS165550.h文件,定义串口寄存器地址、中断类型等变量并构建结构体NS16550VXB_CHAN,把串口抽象成1个组件,以方便对设备的操作设置和管理。

在hwconf.c中,对串口设备进行基础的初始化定义,并把串口设备添加到VxBus设备表中,定义串口寄存器基地址、波特率、时钟频率、寄存器间隔空间,关键代码如下所示:

Struct hcfResourceNS16550Dev0Resources[]={

{“regBase”,HCF_RES_INT,0xbf004080},

{“baudRate”,HCF_RES_INT,152100},

{“clkFreq”,HCF_RES_INT,(void *)BAUD_CLK_FREQ},

{“regInterval”,HCF_RES_INT,(void *)UART_DELTA},

};

#defineNS16550Dev0NumNELEMENTS(NS16550Dev0Resources)

Const StructhcfDevice_hcfDeviceList[]={

{“NS16550”,0,VXB_BUSID_PLB,0,NS16550Dev0Num,NS16550Dev0Resources}}

5.2 串口驱动程序实现

创建VXBNS16550.c驱动源码文件,实现串口设备的初始化、中断以及各种操作,如图6所示。

Figure 6 Method of serial port driver图6 串口驱动方法图

串口NSvxbRegister()、NSvxbInstInit()2个函数在内核初始化过程中完成。NSvxbRegister()创建串口设备,并将串口设备挂接到虚拟总线PLB。

NSvxbInstInit()初始化NS16550VXB_CHAN数据结构,将串口的波特率、通道号、时钟频率、串口基地址、寄存器间隔空间参数从hwconf.h中加载到驱动中,并声明以下2个方法:

LOCALdevice_method_tNS16550VXB_methods[] =

{

DEVMETHOD(sioChanGet,NS16550SioChanGet);

DEVMETHOD(sioChanConnect,NS16550SioChan-Connect)};

NS16550SioChanGet()方法为上层提供通过通道号找到串口设备的接口,NS16550SioChanConnect()用于串口中断的挂接和使能。

NSvxbDevInit()实现2部分初始化,第1部分配置UART通道,包括LCR线路控制寄存器,配置端口8字节,1个停止位无校验,波特率115 200,设置Modem控制寄存器为回环模式中连到RI输入。第2部分声明串口操作方法,包括NSvxbIoctl()、NSvxbTxstartup()、NSvxbCallbackInstall()。

NSvxbIoctl()为串口控制函数,包括设定串口波特率、停止位奇偶校验、打开串口、Modem控制寄存器。NSvxbTxstartup()使能发送的中断。NSvxbCallbackInstall()完成中断后接受和发送的函数连接安装。

在sysHwInit2中调用vxbDevConnect()连接和使能串口中断,将串口中断处理程序NSvxInt()挂接到中断向量中。在本文中串口工作模式为中断触发,在中断处理程序中使用NSIntWr()和NSIntRd()对串口循环缓存区进行读写操作。至此,串口初始化完成,设备以相应的结构体挂接到VxBus设备树中,并开启中断。

5.3 挂接中间层TTY

如图7所示,操作系统通过中间层TTY管理串口设备:虚拟设备TTY作为I/O设备向I/O系统注册。在usrRoot()中将TTY设备加入IO系统:

ttyDevCreate(tyName,sysSerialChanGet(channelNo),512,512);

consoleFd=open(tyName,O_RDWR,0);

Figure 7 I/O device management图7 I/O设备管理

在ttyDevCreate函数中,iosDrvinstall()和iosDevAdd()将串口以TTY设备添加进系统驱动表和系统设备表中。用open()申请consoleFd为设备文件描述符。至此,串口设备被挂接到I/O系统中,驱动开发完成。

6 测试方法与结果

6.1 测试环境和方案

本文采用新型龙芯1E系列开发板作为验证和测试的目标机,采用研华工控机作为宿主机。龙芯1E串口0和工控机相连,将串口信息发送到工控机中。操作程序镜像通过串口1从工控机下载到开发板中。

测试分为3部分:第1部分,通过系统运行,在VxWorks shell中输入VxBusShow检验VxBus驱动启动是否成功。第2部分,在应用层编写串口收发测试程序,通过串口收发数据各1 500次验证VxBus型串口驱动在实际应用中的可靠性。第3部分,分别在新型龙芯1E芯片和在轨星载计算机上创建相同应用程序,检验在复杂运算过程中,BSP的表现情况和BSP性能对比。

6.2 实验过程

Figure 8 Diagram of drive device hook up图8 驱动设备挂接图

Figure 9 Operation diagram of serial port receiving data图9 串口接收数据运行图

(1)在WorkBench开发环境中创建1个VxWorks Image型工程,选择编辑本文实现的BSP。编译镜像生成可执行文件VxWorks。通过串口将镜像下载到开发板中运行。在shell中输入VxBusShow显示当前系统的驱动和设备,可看到当前VxBus串口驱动、中断驱动、时钟驱动成功注册。如图8所示。

(2)创建VxWorks Image型工程,在usrAppInit()中创建任务:①通过串口接收数据1 500次,并将数据进行比对,输出接收总次数、接收数据成功次数、接收数据错误次数。②通过串口发送数据到宿主机1 500次,宿主机接收后在SSCOM串口中输出。图9为串口接收数据运行结果图。

由图9结果得出,分别接收和发送1 500次数据,均未出现误码等情况,实践证明VxBus型驱动具有很好的可靠性。

(3)创建VxWorks Image型工程,在usrAppInit()中创建1个任务:

voidusrAppInit(void){

logMsg(“----usrAppInit,---- ”,0,0,0,0,0,0);

taskSpawn(“test”,100,0x01000000,2000000,(FUNCTPTR)main,0,0,0,0,0,0,0,0,0,0);

}

Figure 10 Results of the program running on the on-board computer图10 在轨星载计算机中程序运行结果图

Figure 11 Results of the program running on the new Godson 1E图11 新型龙芯1E中程序运行结果图

并将任务分别运行在移植成功的新型龙芯1E芯片和在轨星载计算机中,将2款计算机设置为相同CPU频率,通过运行时间对比验证其性能提升。该任务为武汉大学编写的导航卫星自主定轨的模拟程序,用C++语言编写,并用到大量的浮点运算,包括协方差计算,读取存储12*12的矩阵,算法复杂度高,可以很好地检测BSP的运行状态和进行性能对比。如图10所示为模拟程序在目前在轨星载卫星系统中运行截图,如图11所示为模拟程序在新型龙芯1E中运行截图。

由运行结果可知操作系统已启动且运行状态良好。运行1次模拟程序在轨星载计算机系统的时间为38 s,在新型1E芯片中的时间为21 s。以运行时间为衡量标准,移植后程序运行速度提升了81%,性能提升明显,可以满足执行复杂应用的需求。

7 结束语

本文在新型龙芯1E开发平台上,针对硬件升级所提出的需求,完整开发了VxWorks操作系统的BSP包,包括内存分配、中断管理、时钟管理、串口VxBus型驱动设计,并基于工程实践的星载计算机,设计了可靠合理的测试方案,测试结果说明操作系统移植成功,计算性能得到了提升,具备承担未来多样化星载软件任务的可行性,同时为未来SpaceWire高速通信接口应用开发奠定了技术基础。

猜你喜欢

龙芯中断串口
基于国产化龙芯的动环数据采集系统
浅谈AB PLC串口跟RFID传感器的通讯应用
基于FPGA的中断控制器设计*
Linux中断线程化分析及中断延时测试
跟踪导练(二)(5)
千里移防,卫勤保障不中断
“龙芯之父”胡伟武
数字电源内部数据传输的串口通信方法实现
USB接口的多串口数据并行接收方法探索
串口技术的实物调试和虚拟仿真联合教学模式