加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSSRSS-巴斯仪表网
您当前的位置:首页 > 电子发烧 > 单片机学习

实时操作系统 BSP的分析与实现

时间:2013-09-08  来源:123485.com  作者:9stone

引言
   近年来,实时操作系统在网络通信、在线事务处理、生产过程控制、交通控制等各个领域得到广泛的应 用,并越来越引起人们的重视. 目前,国内使用的RTOS主要有VxWorks和PSOS,还有Nuclear、QNX、WinCE、 嵌入式Linux等.
   为了方便用户在自己定义的用户板上进行开发,RTOS提供了板级支持包(BSP) ,提供了支持标准硬件 板和用户硬件板的机制. 每个BSP提供了一种软件模板,其中既包括设备驱动程序的抽象结构代码
(Abstracter Architecture code) 也包括为具体硬件设备所需的底层系统功能代码,不同外设的设备驱动程序代码只与该设备有关,而与该设备所在的硬件板无关.RTOS以源代码形式提供了许多板级支持包以及通用模板、板级支持包是进行开发设计的关键环节,开发人员应当对它有一个清晰的认识和理解.

1、实时多任务操作系统(RTOS)
   实时系统的实现多为微内核体系结构,如图 1 所示 .这使得核心小巧而可靠,易于使用ROM固化,并方便的进行模块化扩展.微内核结构 系统中,OS服务模块在独立的地址空间运行,所以,不同模块的内存错误 便被隔离开来 . 但它也有弱点,进程间通信和上下文切换的开销大大增加.
 
图1 微内核结构
   通过硬件抽象层,操作系统可以很容易地移植到其它硬件结构体系.当然用户需要根据自己的硬件结构写自己的硬件抽象层代码,这也就是 指一般意义上BSP,这也是开发用户个人系统的关键环节.
   实时多任务操作系统RTOS具有下面特点:

  •    RTOS 支持多任务,并能够根据各个任务的轻重缓急设置优先级,合理地在它们之间分配CPU和各种资源的占用时间.
  •    实时性,系统的监测、控制、通信等工作都要求实时性,一旦出现有关情况,CPU能够及时响应,因此,一个实用的 RTOS 都应具有完善的中断响应机制,保证中断响应潜伏时间足够短,在规定的时间内完成需要进 行的工作.

2、WindRiver VxWorks操作系统
       RTOS VxWorks是美国的Wind river 公司开发的一种高性能的嵌入式实时操作系统. 它是目前在世界上用户数量最大的实时操作系统,具有优越的技术性能、广泛的应用软件支持和可靠的系统稳定性 .
VxWorks的主要性能特点有:

  1.  高度可裁剪的微内核结构 (microkernel),VxWorks 所需要的存储器空间大约为 8KB-488KB(ROM) ,29.3KB-620KB(RAM),具有极好的伸缩性.
  2.  高效的多任务调度.VxWorks 支持中断驱动的优先级抢占式(preemptive scheduling)调度和时间片轮转调度(roud-robin scheduling) ,具有确定的、快速的上下文切换的能力,具有256个优先级.
  3.  快速灵活的任务间通信 (intertask communication) 手段.  支持信号灯(semaphores)、消息队列(messagequeues) 、管道(pipe) 、信号(signal)和套接字(socket)等进程间通信和互斥手段 .
  4.  支持诸如环形缓冲(ring buffer)和链表(link list) 等共享内存技术 .
  5.  VxWorks是第一个集成标准TCP/IP网络功能的实时操作系统.到目前为止,VxWorks 的TCP/IP 协议支持最新的Berkeley网络协议,IP,IGMP,GIDR,TCP,UDP,ARP;BOOTP,DNS,DHCP,TFTP;FTP,Rlogin,Telnet,Rsh.
  6.  POSIX1003.1b兼容 VxWorks,支持 POSIX1003.1b规范以及 1003.14规范的基本系统调用.包括:进 程原语,文件目录,I/O原语,语言服务以及目录管理 .另外VxWorks 还遵循 POSIX1003.1b 实时扩展标准,包括:异步 I/O,计数信号量,消息队列,信号,内存管理(页面锁定) ,以及调度控制.
  7.  极其丰富的板级支持包,支持多种处理器板(PowerPC,MIPS,ARM,StrongARM,i960,80x86,CodeFile等).
  8.  支持MS-DOS,RT-11和RAW等文件系统和网络文件系统 NFS.
  9.  灵活的启动方法,支持从 ROM、本地磁盘以及网络启动 .

3、RTOS 板级支持包 BSP 和 PC 的 BIOS

      BSP 通常用于嵌入式领域,主要指在开发嵌入式应用时系统开发商提供的各种驱动支持库 .  在嵌入式领域人们对 BSP 有各种不同的理解:
1) 操作系统的驱动程序. 嵌入式系统提供商的权威,Wind River 公司对BSP 的理解偏向于是OS 的驱动 程序 (从其 BSP的文档中可以看出) ,因为嵌入式系统中的各种设备的确名目繁多,因此将 BSP 定位于 OS 的驱动的确有一定的道理.
2) 驱动程序 . 对于认为 BSP 就是驱动程序的人来讲,通常接触的是嵌入式系统提供商提供的某种应用 解决方案的应用系统(Total Solutio).在这种开发系统中 BSP 完全有理由被认为是所有驱动程序,因为开发人员没有必要自己去开发驱动程序,而只是验证驱动程序在自己的系统中是否正确了事.
3) HAL(Hardware Abstract Layer) 对于开发嵌入式 OS 的人来讲,倾向于将 BSP 看成是对硬件平台的抽象层(HAL)和处理器的驱动程序更恰当.
   实际上各种理解都只是侧重于某个方面,由于每个嵌入式系统提供商都根据自己的操作系统而提出对BSP 的不同理解,因此在涉及到 BSP 的具体涵义时人们往往有一种似是而非的感觉 .实际是各种理解都有其道理,但由于出发点不同,对 BSP的理解都有失全面甚至有错误的地方,这也是初学者容易混淆的原因.
   对于进行硬件和软件开发的人员,第三种理解比较合适,后面的分析也是建立在这个基础之上的.
   这里通过 BSP(board support package)和 BIOS(basic imput and output system)的对比来说明板级支持包的功能 . BSP 说的简单一点,就是一段启动代码,和计算机主板的BIOS 差不多,提供的功能却有较大差别,在通用 51 等系列单片机开发的过程中,要有小段程序设置栈指针,软复位,中断屏蔽等等,可以把这段程序称为它的 BSP.
   实时操作系统的 BSP 相对复杂一点,但通常也是设置堆栈指针、建立中断向量表、初始化寄存器 (控制外围器件如DRAM,EDORAM 条,控制 I/O口的寄存器,片选信号等) ,配置地址空间以及系统启动方式.
 
   从图2可以看出实时操作系统的 BSP 就相当于 PC的BIOS. 一般来说,对不同的微处理器板以及不同的RTOS时就 应该配置相应的 BSP,BSP 可以是已经做好了的,不需要开发人员去关心寄存器设置的细节 . 当然根据实际的要求也可以改写 BSP 来加入自己的特定功能. BSP 可针对不同的硬件做不同的调整,相应于PC的BIOS,它完成对硬件的初始化工作,执行完后再将执行权交给RTOS.在 BSP 中,只需要对与硬件相关的寄存器( 主要是DRAM,SDRAM,片选)及与中断相关的寄存器进行正确配置即可 .
   BSP 程序越简单越好,能放在主程序中初始化的功能尽量不要放在其中,BSP 配置程序只要能够保证系统正常启动即可.大部分RTOS带有针对不同微处理器的 BSP 程序,用户只要稍做修改即可移植到自己的开发应用中.

4、板级支持包(BSP)和驱动程序(Drivers)
    
设备驱动程序指用于处理、管理硬件控制器(Controller)的代码.设备驱动程序是建立在具体的操作系统之上,如图2,而不是某种类型的处理器(CPU)类型,这点很重要 .实际运用中,人们可能选择不同的 目标硬件(CPU),如PowerPC,ARM、x86,并且配置不同的操作系统.即使对于同一种类型的目标硬件,不同的操作系统也要编写不同的BSP,对于驱动程序实际上是在操作系统的层次上对不同的设备控制器所写 的代码.
   实时操作系统的驱动程序和PC的相类似,RTOS通常在 BSP 定义了一套自己的驱动程序接口,根据这些接口写相应的驱动程序.当然 RTOS和硬件较紧密,灵活性较大,开发人员完全可以抛开它提供的接口自己写,这同直接在C代码中调用BIOS提供的底层功能(如 BIOS中断)写程序类似.
   BSP 通常可以认为是基于硬件平台的 .当开发某个平台的、与硬件相关的程序时,往往不得不从设置某 个寄存器的某个位开始编程.在嵌入式领域,这种情况更为明显,几乎所有的设备控制和各种协议控制都在 同一个嵌入式CPU Core, 中,非常有利于对CPU Core和设备进行抽象.如果能对CPU Core和设备的各种控制进行抽象,人们在移植OS或者开发驱动程序时就没有必要对CPU进行非常深入的了解,不必要了解某个寄存器的某个位是控制什么的,也没有必要了解怎样初始化某个控制寄存器等等.因此,BSP 是一种能为程序开发人员提供对硬件进行描述性操作的开发支撑库.描述性操作是指在控制硬件时只需知道要完成什么,而不需要知道如何去完成,每个操作都是一些单一的动作.例如:对于设置一个串口的波特率,只需要知道是哪个串口,波特率是多少,而不需要知道要写哪一个寄存器以及如何写等.在利用 BSP 编写 Driver时, 编程人员只需要了解该Driver的初始化顺序以及初始化的内容而不需要了解初始化的具体细节就能完成驱动程序. 可以大大的提高工作效率,并且对于硬件的具体细节设置是在驱动程序中最容易出错的地方,而采 用 BSP 支撑库则可以大大的减少出错的可能性.  在BSP 支撑库中除了对硬件的描述性操作部分的代码外, 还包含了对目标板的初始化部分、中断管理部分以及一些简单的驱动程序程序单元 .这样的 BSP可以不用依赖于任何的操作系统和驱动程序,但是可以作为操作系统和驱动程序的开发支撑库,可以非常方便的移 植或者开发操作系统与驱动程序.
   在最好的情况下,操作系统与驱动程序的移植只需要更换相应平台下的BSP 支撑库就完成了移植.

5、ARM's BSP(Vxwork for Arm)
Vxwork 的BSP主要功能:
系统上电硬件初始化,提供VxWorks访问硬件驱动程序的支持,综合硬件无关和硬件相关的 VxWorks
软件.BSP不是硬件驱动,对目标环境(target enviroment) 是特定的 .
组成部分:源文件(Source file);头文件(include file) 和编译生成文件(make file) ;继承文件(derived file)和二进制驱动模块(binary).

开发步骤:
1)确定要使用的模板,(Template)bsp 类型,针对目标硬件板进行选择,如 Pid7,Pid_t,snds100.
2)选择合适的开发仿真工具,目前使用较广泛的有EST的VisionICE和VisionProbe,都支持Jtag标准, 可以在线flash Programming.
3)确定要开发的生成镜像(image)的类型,rom image还是 loadable image,rom image根据功能分为boot image 和 VxWorks;根据加载过程为rom image:把代码 (code)和数据(data) 拷贝到ram区,然后执行:rom-resdent image; 仅把数据拷贝到ram区,代码在rom执行;根据是否压缩分为压缩型和非压缩型 .
4)根据目标硬件配置确定系统的配置参数宏(macro), 在config.h,makefile,bspname.h文件中,这些文件在自己的bsp目录下,通常的情况下开发人员只需要对其中的宏参数进行配置并保持一致性,其他的通用 参数由系统缺省完成.
5)内核初始化之前的启动过程, 如图3

 
图3 内核初始化之前的启动过程
   Boot,rom image从rominit romstar() 开始执行,是系统的入口,进行系统最小初始化工作,中断屏蔽,存储器初始化和设置系统堆栈指标.保存启动类型跳到 romstar(), 把vxworks image 从rom 拷贝到ram,跳到usrinit()完成操作系统初始化.
   Loadable image则是有系统的引导程序加载VxWorks image到ram跳到sysinit()执行rominit()的工作, 但是不进行出去器初始化工作 .
   romInit()为适合不同的image类型,应当使用PIC(position independent code) 即PC(program counter)相关代码.
   如#define ROM-OFFSET(x)((x)-_rlmInit+ROM_TEXT_ADRS) 地址计算 .
   系统的需要开发人员自定义的宏:
   LOCAL_MEM_LOCAL_ADRS_RAM 开始地址;
   LOCAL_MEM_SIZE_RAM 大小;
   USER_RESERVED_MEM -在 ram顶部保留的字节数,冷启动不清零;
   RAM_HIGH_ADRS - 非驻留 rom(non -ROM resident)VxWorks boot images  加载地址;
   RAM_LOW_ADRS -  非驻留 ram VxWorks aplication image 加载地址;
   ROM_TEXT_ADRS - Boot ROM 入口地址;
   ROM_BASE_ADRS - ROM  基地址;
   Usrinit() 完成激活内核所需的最小初始化工作.
   SysHwinit()把系统硬件一个静态的环境,由kernelinit()来激活VxWorks.
6) 配置存储器(memory),中断(interrupt) ,时钟(timer) 对自己的bsp 进行调试、修改、发布.
  值得注意的是,在一般的情况下,开发人员不需要修改$(windriver)/target/confige/all和comps目录下的文件,只需要修改自己的 bspname/目录下的文件,有改变连接规则,可以修改makefile 文件,控制系统的启动过程.

结语
   本文讨论实时操作系统中板级支持包BSP的概念,强调指出BSP是基于不同的处理器类型,各种实时 操作系统对不同的处理器提供了不同的板级支持包. 通过BSP,BIOS和Driver对比,分析说明了板级支持包具体的功能作用,即要提供给操作系统一个无关的设备接口,让程序开发人员可以在不熟悉具体硬件的条件下,对硬件的寄存器进行正确的操作和配置.最后结合Arm处理器,给出了编写Vxworks的 BSP的要点以及开发流程.


分享到:
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
栏目导航->单片机学习
  • 电子应用基础
  • 电源技术
  • 无线传输技术
  • 信号处理
  • PCB设计
  • EDA技术
  • 单片机学习
  • 电子工具设备
  • 技术文章
  • 精彩拆解欣赏
  • 推荐资讯
    使用普通运放的仪表放大器
    使用普通运放的仪表放
    3V与5V混合系统中逻辑器接口问题
    3V与5V混合系统中逻辑
    数字PID控制及其改进算法的应用
    数字PID控制及其改进
    恶劣环境下的高性价比AD信号处理数据采集系统
    恶劣环境下的高性价比
    栏目更新
    栏目热门