罗一涵,陈朔鹰,赵建峰,乔杨
(北京理工大学 计算机学院,北京 100081)
基于龙芯3A处理器的DeltaOS嵌入式系统移植
罗一涵,陈朔鹰,赵建峰,乔杨
(北京理工大学计算机学院,北京100081)
嵌入式系统移植是嵌入式开发中经常遇到的问题。本文以龙芯3A处理器为载体,根据其通用异常处理机制和硬件资源配置,完成系统的启动,并对串口驱动进行开发与配置,成功将实时嵌入式道系统(DeltaOS)移植到龙芯3A平台上,为应用程序和驱动程序的开发提供了必要的基础。
龙芯3A;异常处理;实时嵌入式系统;驱动程序
道系统(Delta OS)是目前中国依靠自己技术和力量自主研发的实时操作系统之一,提供实时和嵌入式多任务的内核,任务响应快速、准确,不随任务负载大小改变,绝大部分代码由C语言编写,具有很好的移植性。目前,道系统已成功地应用于消费电子产品、通信产品、工业及军用电子产品中。
龙芯系列处理器是中国科学院计算所自主研发的国产处理器系列,龙芯3A是其新一代的64位多核高性能通用处理器,处理器采用RISC架构,兼容MIPS指令,原生四核设计,内含两条HT PHY超传输总线,主频1 GHz,晶体管数目4.25亿个,单颗龙芯3A的最大功耗为15 W[1]。
本文阐述了龙芯3A平台异常处理和中断机制和系统启动流程,并完成了硬件设备驱动程序的开发。
1.1 基于道系统的开发模型
道操作系统主要由三部分组成:板级支持包(BSP)、系统内核以及应用组件模块,其组成如图1所示。
图1 道系统组成
其中板级支持包(BSP)的下面就是支持操作系统的硬件平台。板级支持包的作用是使嵌入式操作系统在各种不同的硬件环境下都能较好的工作,通过特定的上层接口与操作系统内核进行交互,向操作系统提供底层的硬件信息,并根据操作系统的要求完成对硬件的直接操作。这一层次的独立性决定了该嵌入式操作系统的可移植性。由于这一层屏蔽了底层硬件的多样性,操作系统内核不再直接面对具体的硬件环境。
BSP的作用主要包含两部分:
①初始化。包括对系统资源的初始化,对目标板硬件初始化(包括初始化各种控制器内存资源和硬件设备),以及对CPU相关的初始化(主要初始化内部寄存器、关闭中断等)。
②硬件设备驱动。对硬件设备初始化和管理设备是驱动程序的主要作用,这里的驱动有时钟驱动、串口驱动、网络驱动和总线驱动等。
1.2 BSP开发流程
BSP的开发过程分为以下几个步骤。
①建立道系统集成开发环境Lambda Tools。Lambda Tools提供基本的编码、调试、固化的集成开发环境。
②新建BSP项目,道系统集成开发环境已经集成了BSP项目,实现了BSP操作所需的框架,因此该项目可降低开发BSP的难度,提高研发效率。由于开发一个全新的BSP耗时耗力,因而通常会选择一个BSP模板,在此基础上仅对需要修改的部分进行修改,这样可以大大缩短开发周期。
③配置系统引导程序,本次移植使用龙芯系列专用工具PMON进行系统引导。
④配置DeltaOS的BSP。在BSP模板基础上完成Boot的运行,实现最基本的初始化。同时根据硬件特性修改相应文件,确保系统启动和基本驱动的正常运行,最终生成映像文件。
⑤测试与验证。通过对各个模块的测试实验,验证移植是否成功。
2.1 龙芯3A异常处理及中断机制
异常是硬件或软件影响处理器正常执行循序的方式,是实现多任务和硬件驱动的基础。龙芯3A处理器的通用异常处理又分为32种异常,比如:中断、TLB修改、地址错误等。当触发通用异常时,异常处理函数读取Cause寄存器ExcCode域的值,如果为0,则判断异常为中断产生,龙芯CPU核通过Cause寄存器接收中断。Cause寄存器中有8个独立的中断位IP0~IP7,IP0和IP1表示软件中断,IP2~IP5表示外部中断,IP6表示核间中断,IP7表示时钟中断[2]。异常处理示意图如图2所示。
当触发通用异常处理时,进入exc Norm Vec()函数,此处需要完成龙芯对3A通用异常处理的工作。首先获取Cause寄存器Excode域的值,然后根据Excode域的值判断属于哪种异常。若Excode域的值为0,则跳转到中断处理;若Excode为其他值,则跳转到异常处理。把exc-Norm Vec()函数代码拷贝到地址0x180,此地址是龙芯通用异常入口地址[3]。以下是exc Norm Vec()中关键代码:
图2 异常处理示意图
当异常为中断时,进入中断处理函数Handle_int(), Handle_int()函数会依次保存中断现场,关闭中断,调用plat _irq_dispatch()判断中断的类型,不同类型的中断执行不同do _IRQ()函数,当中断处理完成后,进入ret_from_irq()函数从中断返回[4]。中断路由示意图如图3所示。
龙芯3A处理器中集成了4个处理器核,32位中断源可以通过软件配置选择期望中断的目标处理器核。在hwconf.c文件中,有三个数组描述了具体设备的中断要素,mipsSbIntCtlrInputs数组设定设备选用的引脚,mipsSbIntCtlr XBar数组设定设备使用相应核的哪个中断引脚,mipsSbIntCtlr CpuRoute数组设定设备中断路由到哪个核上。在此次移植过程中,默认将中断路由到CORE0上。图3的配置模块配置的就是这些中断路由到哪个CPU核的哪个IP位,这里IP位和实际的Cause寄存器偏移为2,比如路由到CORE0的IP0,实际上是CORE0的Cause寄存器的IP2[3]。
图3 中断路由示意图
2.2 DeltaOS启动流程
对于系统移植,熟悉系统的启动流程是非常重要的。在龙芯3A平台移植过程中,使用龙芯平台系列专用工具PMON做初始化引导。PMON主要包括硬件初始化、操作系统引导和硬件测试、程序调式等功能。它提供多种加载操作系统的方式,可以从优盘、光盘、tftp服务器和硬盘等媒介加载;它提供对内存、串口、显示、网络、硬盘等的基础测试工具。在移植过程中,PMON的作用是完成硬件初始化,包括设置时钟和堆栈以及分配存储空间等,同时把二进制的DeltaOS系统映像文件加载到内存,之后程序跳转到操作系统所加载的位置,开始启动过程。
图4为DeltaOS系统的启动流程:首先是sys Alib.s中的入口函数sysInit()。sysInit()函数是系统启动后第一个执行的函数,由汇编语言编写,主要的工作包括初始化CPU,设置堆栈,禁止CPU的中断等,然后跳转到prj-Config.c中的usrInit()函数。
以下是根据硬件平台修改完成的关键代码:
图4 DeltaOS启动流程
usrInit()函数是操作系统启动时执行的第一个C函数,任务是对系统进行最小初始化,包括对内核数据结构进行初始化,硬件初始化,根据不同的CPU构架,usrInit()函数可能对cache进行初始化,中断处理程序的初始化,中断处理程序的挂接等。其中几个重要的函数式:exc VecInit()初始化所有缺省中断向量,sys HwInit()初始化目标板中的相关硬件,usrkernelInit()配置系统内核,其中主要是配置操作系统的必要组件,通常不需要修改。kernelInit()初始化并启动内核,其中sys Hw Init()主要负责目标机硬件部分的初始化工作,此时的初始化发生在系统内核启动之前,中断屏蔽,把硬件设备初始化到静止状态,属于对设备的初级初始化。
然后进入usr Root()函数,它的任务是初始化内存池、系统时钟、I/O系统和网络、标准输入输出错等。其中, usr Root()调用的sys HwInit2()函数在系统内核启动之后进行,主要负责将中断服务程序连接到相应的中断向量,并完成中断使能,属于对设备的高级初始化。
在修改完BSP板级支持包后,通过Lambda Tools生成DeltaOS的映像文件,再通过网络或串口的方式传入目标机,使用PMON完成对操作系统的引导。
2.3 配置驱动程序
在移植过程中,除了完成CPU和系统初始化外,另一个重要的工作是完成对设备驱动的配置和开发,首先介绍一下配置和管理驱动程序的设备驱动构架VxBus,然后以配置串口驱动为例进行说明。
VxBus是一套设备驱动程序,它将各种不同功能设备集成到一个统一的程序中,采用模块化设计思想降低驱动对BSP的依赖度,提供了对设备驱动的管理,使驱动的配置和使用更加灵活和方便。驱动配置流程如图5所示。
图5 驱动配置流程
图5是VxBus构架下硬件驱动程序的配置流程,主要分为三个阶段:硬件发现阶段、硬件驱动注册阶段、驱动初始化阶段(驱动初始化又分为两个阶段)。硬件发现阶段硬件初始化函数sys HwInit()调用hardWareInter FaceInit()函数来初始化硬件内存分配机制;在驱动注册阶段,hardWareInter FaceInit()调用hard WareInter FaceBus-Init()函数,hard WareInter FaceBusInit()函数再调用Vxb-DevRegister()函数完成驱动注册和激活;然后进入驱动初始化阶段,初始化第一阶段发生在内核初始化之前,初始化第二阶段发生在内核初始化后。
本文以串口驱动为例,介绍在VxBus构架下配置的过程。为了使系统认识要添加的硬件设备,首先要向系统中添加设备信息。hwconf.c文件是VxBus构架下负责配置驱动的文件,文件中列出了所有添加过的硬件设备,包括其资源信息。添加的信息用两个数据结构来表示:一个是hcf Resource,另一个是hcf Device。前者是描述硬件的信息,后者是一个设备列表,包括设备名、设备号等。
在向hwconf.c添加设备信息时,首先在config.h中添加包含串口组件的信息:
INCLUDE_SERIAL表示包含串口组件;NUM_TTY表示串口数量;CONSOLE_BAUD_RATE表示串口波特率;CONSOLE_TTY表示控制终端使用的通道号,一般定义为0[5]。
然后向hwconf.c中加入描述串口的两个数据结构:
添加完设备信息后,系统已可以识别硬件设备,通过ns16550Dev Register()函数完成设备注册及激活[6]。
在完成设备注册激活后,开始设备驱动初始化过程,第一阶段的初始化函数在sys HwInit()中进行,此时内核还未初始化。需要完成的工作有关闭中断、串口寄存器的配置和设置串口通信参数,这里设置串口波特率为115 200,数据位设置为8位,停止位为1位,无校验,无流控。以下是部分代码:
第二阶段初始化在sys HwInit2()中进行,此时内核已完成初始化,此时的工作是完成中断服务程序与中断向量的连接。通过intConnect()函数来实现。
以上为串口驱动在VxBus构架下添加的过程,对于其他硬件设备驱动可按相同的方法添加。
本文以龙芯3A-RS780E开发板为硬件平台,介绍对道操作系统移植所需的BSP的设计和实现。针对不同的CPU和主板,BSP的实现也不相同,需要根据硬件版的具体功能进行设计,但基本方法类似,本文对开发其他类型目标板具有一定参考价值。
[1]北京龙芯中科技术服务有限公司.LS3A-RS780开发板使用手册,2010.
[2]中国科学院计算技术研究所,龙芯中科技术有限公司.龙芯3A处理器用户手册,2014.
[3]MIPS.MIPS Architecture For Programmers Volume III: The MIPS32 and micro MIPS32 Privileged Resource Architecture,Revision0.95,2001.
[4]殷杰波.基于龙芯3A处理器的嵌入式操作系统BSP设计技术[J].测控技术,2014,33(7):121-123.
[5]杨晔,安军社.Vx Works在龙芯处理器上的移植与实现[J].微计算机信息,2010,26(35):31-33.
[6]谭亮,李一平,任申真.基于VxBus模式的多串口卡驱动程序的设计[J].测控技术,2011,30(7):73-75.
罗一涵、赵建峰、乔杨(硕士研究生),主要研究方向为嵌入式系统与应用;陈朔鹰(副教授),研究方向为计算机操作系统、嵌入式系统应用。
69观察法可有效提高光伏电池充电效率,并提供稳定的输出电压,保证了光伏照明系统能够高效稳定地工作,达到了设计的预期。系统的电池容量检测模块中的过放保护保证了在电量过低或蓄电池端电压过低时可以对蓄电池提供有效保护。针对在温度变化剧烈的状况下,独立光伏公用照明系统加入了温度补偿功能,保证系统在复杂温度情况下都能正常工作。
[1]李春玲,石季英,武艳辉,等.模糊控制的扰动观察法在光伏MPPT中的应用[J].电气传动,2013,43(2):62-64.
[2]董婧.基于MPPT的光伏系统充电控制器的研究[D].西安:西安工业大学,2014.
[3]郑诗程,刘伟,葛芦生.具有TM PPT功能的太阳能光伏充电系统研究[J].电子测量与仪器学报,2008,22(3):11-15.
[4]李明杨.独立光伏发电系统的控制策略及其应用研究基于MPPT[D].长沙:中南大学,2010.
[5]曹旭阳.独立光伏路灯系统MPPT控制器设计[D].青岛:中国海洋大学,2007.
[6]杨自娟.基于模糊控制的太阳能MPPT充电控制器的研究与实现[D].广州:华南理工大学电力学院,2010.
[7]黄瑞,孙黎霞.基于占空比模糊控制的光伏发电系统MPPT技术[J].电子设计工程2013,21(7):101-104.
[8]王海龙,王维俊,张国平,等.基于STM32F103芯片的光伏充电控制器设计[J].微电机,2013,46(3):54-57.
[9]欧阳名三.独立光伏系统中蓄电池管理的研究[D].安徽:合肥工业大学,2004.
[10]王立志,宋伟,汪徳洋,等.STM32的风光互补发电蓄电池充放电保护研究[J].单片机与嵌入式系统应用,2016,16 (2):21-23.
温宗周(副教授)、费腾蛟(硕士研究生):主要研究方向为嵌入式系统应用与开发;段俊瑞(教授),主要研究方向为汽车电子的开发与应用。
Transplant of DeltaOS Embedded System Based on Loongson3A
Luo Yihan,Chen Shuoying,Zhao Jianfeng,Qiao Yang
(School of Computer Science&Technology,Beijing Institute of Technology,Beijing 100081,China)
In the development of embedded system application,the transplantation is a frequently encountered problem.In the paper,taking the Loogson3A processor as the carrier,according to its exception handing mechanism and configuration of hardware resources,the design completes the startup of system,develops and configurates the driver of serial port.The embedded real-time system DeltaOS is transplanted on the Loogson3A successfully,which provides the necessary foundation for the application and other driver development.
Loogson3A;exception handing;embedded real-time system;driver
TP316
A
(责任编辑:杨迪娜2016-06-06)
(责任编辑:杨迪娜2016-05-09)