设计一个简单的应用程序时,可以不使用操作系统;但是,当设计较复杂的程序时,可能就需要一个操作系统(OS)来管理、控制内存、多任务、周边资源等。 依据系统所提供的程序界面来编写应用程序,可以大大地减少应用程序员的负担。
对于使用操作系统的嵌入式系统来说,嵌入式系统软件结构一般包含四个层面:设备驱动层、实时操作系统(RTOS)、应用程序接口(API)层和实际应用程序层。 有些资料将应用程序接口API 归属于OS 层,如图1.2 的上半部分所示的嵌入式系统的软件结构,是按三层划分的。 由于硬件电路的可裁减性和嵌入式系统本身的特点,其软件部分也是可裁减的。
对于功能简单仅包括应用程序的嵌入式系统,一般不使用操作系统,仅有应用程序和设备驱动程序。 现代高性能嵌入式系统应用越来越广泛,操作系统使用成为必然发展趋势。 本小节主要介绍具有操作系统的嵌入式软件层次。
(1)驱动层程序
驱动层程序是嵌入式系统中不可缺少的重要部分,使用任何外部设备都需要有相应驱动层程序的支持,它为上层软件提供了设备的操作接口。 上层软件不用理会设备的具体内部操作,只需调用驱动层程序提供的接口即可。 驱动层程序一般包括硬件抽象层(HAL)和板级支持包(BSP)和设备驱动程序。
1)硬件抽象层(HAL)
硬件抽象层(HAL Hardware Abstraction Layer)是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化,也就是说,可以通过程序来控制所有硬件电路,如CPU、I/O、Memory 等的操作。 这样就使得系统的设备驱动程序与硬件设备无关,从而大大提高了系统的可移植性。 从软硬件测试角度来看,软硬件的测试工作都可分别基于硬件抽象层来完成,使得软硬件测试工作的并行进行成为可能。 在定义抽象层时,需要规定统一的软硬件接口标准,其设计工作需要基于系统需求来做,代码工作可由对硬件比较熟悉的人员来完成。 抽象层一般应包含相关硬件的初始化、数据的输入/输出操作、硬件设备的配置操作等功能。
2)板级支持包(BSP)
板级支持包(BSP Board Support Package)是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统的一部分,主要是为了完成对操作系统的支持,为上层的驱动程序提供访问硬件设备寄存器的函数包,使之能够更好地运行于硬件主板。 BSP 是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP。 例如,VxWorks 的BSP 和Linux 的BSP 相对于某一CPU 来说,尽管实现的功能可能完全一样,但是写法和接口定义却是完全不同的,因此,写BSP 一定要按照该系统BSP 的定义形式来写(BSP 的编程过程大多数是在某一个成型的BSP 模板上进行修改)。 这样才能与上层OS 保持正确的接口,良好的支持上层OS。
板级支持包完成的功能大体有以下两个方面:
①在系统启动时,完成对硬件的初始化。 例如,对系统内存、寄存器以及设备的中断进行设置。 这是比较系统化的工作,它要根据嵌入式开发所选的CPU 类型、硬件以及嵌入式操作系统的初始化等多方面决定BSP 应完成什么功能。
②为驱动程序提供访问硬件的手段。 驱动程序经常要访问设备的寄存器,对设备的寄存器进行操作。 如果整个系统是统一编址的话,开发人员可以直接在驱动程序中用C 语言的函数就可访问。 但是,如果系统为单独编址,那么C 语言就不能够直接访问设备中的寄存器,只有用汇编语言编写的函数才能进行对外围设备寄存器的访问。 BSP 就是为上层的驱动程序提供访问硬件设备寄存器的函数包。(www.xing528.com)
3)设备驱动程序
系统中安装设备后,只有在安装相应的设备驱动程序之后才能使用,驱动程序为上层软件提供设备的操作接口。 上层软件只需调用驱动程序提供的接口,而不用理会设备的具体内部操作。 驱动程序的好坏直接影响着系统的性能,驱动程序不仅要实现设备的基本功能函数(如初始化、中断响应、发送、接收等),使设备的基本功能得以实现,而且因为设备在使用过程中还会出现各种各样的差错,所以好的驱动程序还应该有完备的错误处理函数。
(2)实时操作系统(RTOS)
对于使用操作系统的嵌入式系统而言,操作系统一般以内核映像的形式下载到目标系统中。 以μCLinux 为例子,在系统开发完成之后,将整个操作系统部分做成内核映像文件,与文件系统一起传送到目标系统中;然后通过BootLoader 指定地址运行μCLinux 内核,启动已经下载好的嵌入式Linux 系统;再通过操作系统解开文件系统、运行应用程序。 整个嵌入式系统与通用操作系统类似,功能比不带有操作系统的嵌入式系统强大了很多。
内核中通常必需的基本部件是进程管理、进程间通信、内存管理部分,其他部件如文件系统、驱动程序、网络协议等都可以根据用户要求进行配置,并以相关的方式实现。
大部分嵌入式操作系统价格昂贵,一般比较看好源代码开放的μC/OS-Ⅱ和μCLinux,因此,在本书的第6 章、第7 章将对这两种操作系统的相关内容进行介绍。 如果在教学、科研中比较感兴趣,请参阅相关资料。
(3)操作系统的应用程序接口(API)
应用程序接口(API Application Programming Interface)是一系列复杂的函数、消息和结构的集合体。 嵌入式操作系统下的API 和一般操作系统下的API 功能、含义及知识体系完全一致。 API 可以这样理解:在计算机系统中有很多可以通过硬件或外部设备去执行的功能,这些功能的执行可以通过计算机操作系统或硬件预留的标准指令调用,而软件人员在编制应用程序时就不需要为每一种可以通过硬件或外设执行的功能重新编制程序,只需要按系统或某些硬件事先提供的API 调用就可以完成功能的执行,因此,在操作系统中提供标准的API 函数,可以加快用户应用程序开发、统一应用程序开发标准,也为操作系统版本的升级带来的方便。 在API 函数中,提供了大量的常用模块,可以大大的简化用户应用程序的编写。
(4)应用程序
实际的嵌入式系统应用软件是建立在系统的主任务基础之上。 用户应用程序主要通过调用系统的API 函数对系统进行操作,完成用户应用功能开发。 在用户的应用程序中也可以创建用户自己的任务,任务之间的协调主要依赖于系统的消息队列。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。