本帖最后由 dirtwillfly 于 2015-11-3 16:10 编辑
在设计一个简单的应用程序时,可以不使用操作系统,但在设计较复杂的程序时,可能就需要一个操作系统来管理和控制内存,多任务,周边资源等。依据系统所提供的程序界面来编写应用程序,可大大减少应用程序员的负担。
对于使用操作系统的嵌入式系统来说,嵌入式系统软件结构一般包含4个层面:设备驱动层,实时操作系统RTOS,应用程序接口API层,实际应用程序层。有些书籍将应用程序接口API归属于OS层。由于硬件电路的可裁剪性和嵌入式系统本身的特点,其软件部分也是可裁剪的。
对于功能简单,仅包含应用程序的嵌入式系统,一般不适用操作系统,仅有应用程序和设备驱动程序。现代高性能嵌入式系统的应用越来越广泛,操作系统的使用成为必然发展趋势。
1.驱动层程序
驱动层程序是嵌入式系统中必不可少的重要部分,使用任何外部设备都需要有相应驱动层程序的支持,它为上层软件提供了设备的操作接口。上层软件不用理会设备的具体内部操作,只需要调用驱动层程序提供的接口即可。驱动层程序一般包括抽象层HAL,板级支持包BSP和设备驱动程序。
(1) 硬件抽象层
硬件抽象层HAL是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化。也就是说,可通过程序来控制所有硬件电路如CPU,I/O,Memory等的操作。这样就使得系统的设备驱动程序与硬件设备无关,从而大大提高了系统的可移植性。从软硬件测试的角度来看,软硬件的测试工作都可分别基于硬件抽象层来完成,使得软硬件测试工作的并行进行成成为可能。在定义抽象层时,需要规定统一的软硬件接口标准,其设计工作需要基于系统需求来做,代码工作可由对硬件比较熟悉的人员来完成。抽象层一般应包含相关硬件的初始化,数据的输入/输出,硬件设备的配置操作等功能。
硬件抽象接口的定义和代码设计应具有以下特点:
硬件抽象层具有与硬件的密切相关性;
硬件抽象层具有与操作系统的无关性;
接口定义的功能应包含硬件或操作系统所需要硬件支持的所有功能;
接口定义简单明了,太多接口函数会增加软件模拟的复杂性;
具有可测性的接口设计有利于系统的软硬件测试和集成;
(2) 板级安装包
板级安装包BSP是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统的一部分,主要是实现对操作系统的支持,为上层的驱动程序系统而言的,不同的操作系统对应于不同定义形式的BSP。例如,VxWorks的BSP和Linux的BSP相对于某一CPU来说,尽管实现的功能可能完全一样,但写法和接口定义却完全不同。因此,BSP一定要按照该系统BSP的定义形式来写,这样才能与上层OS保持正确的接口,良好的支持上层OS。
板级支持包实现的功能大体有以下两个方面:
系统启动时,完成对硬件的初始化。例如,对系统内存,寄存器以及设备的中断进行设置。这是比较系统化的工作,他要根据嵌入式开发所选的CPU类型,硬件以及嵌入式操作系统的初始化等多方面决定BSP应实现什么功能。
为驱动程序提供访问硬件的手段。驱动程序经常要访问设备的寄存器,对设备的寄存器进行操作。如果整个系统为统一编址,则开发人员可直接在驱动程序中用C语言的函数访问设备寄存器。但是,如果系统为单独编址,则C语言就不能直接访问设备中的寄存器,只有用汇编语言编写的函数才能进行对外围设备寄存器的访问。BSP就是为上层的驱动程序提供访问硬件设备寄存器的函数包。
(3) 设备驱动程序
系统中安装设备后,只有在安装相应的设备驱动程序之后才能使用,驱动程序为上层软件提供设备的操作接口。上层软件只需调用驱动程序提供的接口,而不用理会设备的具体内部操作。驱动程序的好坏直接影响着系统的性能。驱动程序不仅要实现设备的基本功能函数,如初始化,中断响应,发送,接收等,使设备的基本功能能够实现,而且因为设备在使用过程中还会出现各种各样的差错,所以好的驱动程序还应该有完备的错误处理函数。
2.实时操作系统RTOS
对于使用操作系统的嵌入式系统而言,操作系统一般以内核映像的形式下载到目标系统中。以μCLinux为例子,在系统开发完成之后,将整个操作系统部分做成内核映像文件,与文件系统一起传送到目标系统中;然后再通过BootLoader制定运行μCLinux内核,启动已经下载好的嵌入式Linux系统;在通过操作系统解开文件系统,运行应用程序。整个嵌入式系统与通用操作系统类似,功能比不带有操作系统的嵌入式系统强大多了。
内核中通常必需的基本部件是进程管理,进程间通信,内存管理部分,其他部件如文件系统,驱动程序,网络协议等都可根据用户要求进行配置,并以相关的方式实现。
3.操作系统的应用程序接口API
API是一系列复杂的函数,消息和结构的集合体。嵌入式操作系统的API和一般操作系统下的API在功能,含义及知识体系上完全一致。可这样理解API:在操作计算机系统中有很多可通过硬件和外设设备区执行的功能,这些功能的执行可通过计算机操作系统或硬件预留的标准指令调用,而软件人员在编址应用程序时,就不需要为每种可通过硬件或外设执行的功能重新编址程序,只需按系统或某些硬件事先提供的API调用即可完成功能的执行。因此在操作系统中的提供的API函数,可加快用户应用程序的开发,统一应用程序的开发标准,也为操作系统版本的升级带来了方便。在API函数中,提供了大量的常用模块,可大大简化用户应用程序的编写。
4.应用程序
实际的嵌入式系统应用软件建立在系统的主任务基础之上。用户应用程序主要通过调用系统的API函数对系统进行操作,完成用户应用功能开发。在用户的应用程序中,也可创建自己的任务。任务之间协调操作主要依赖于系统的消息队列。
|