更新时间:2024-05-07 22:07
硬件抽象层是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化。它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。 从软硬件测试的角度来看,软硬件的测试工作都可分别基于硬件抽象层来完成,使得软硬件测试工作的并行进行成为可能。
硬件抽象层技术最初是由Microsoft公司为确保WindowsNT的稳定性和兼容性而提出的。针对过去Windows系列操作系统经常出现的系统死机或崩溃等现象,Microsoft总结发现,程序设计直接与硬件通信,是造成系统不稳定的主要原因。在得出这个结论的基础上,微软公司在WindowsNT上取消了对硬件的直接访问,首先提出了硬件抽象层(Hardware Abstraction Layer,简称HAL)的概念,硬件抽象层就是:“将硬件差别与操作系统其他层相隔离的一薄层软件,它是通过采用使多种不同硬件在操作系统的其他部分看来是同一种虚拟机的做法来实现的。“后来,这种HAL设计思路被一些嵌入式操作系统参考,其系统内核被分成两层,上层称为“内核(Kernel)”,底层则称为“硬件抽象层”。在EOS中,HAL独立于EOS内核;对于操作系统和应用软件而言,HAL是对底层架构的抽象。综合分析HAL层的代码,可以发现这些代码与底层硬件设备是紧密相关的。因此,可以将硬件抽象层定义为所有依赖于底层硬件的软件。即使有些EOS的HAL在物理上是与系统内核紧密联系的,甚至相互交叉的,但是从功能上可以从分层技术的角度去分析它。
硬件抽象层是一个编程层,允许计算机操作系统在逻辑层而不是硬件层与硬件设备交互。Windows 2000就是支持硬件抽象层的操作系统之一。操作系统核心或者硬件驱动程序都可以调用硬件抽象层。无论哪种情况,调用程序都不用了解硬件的具体设计细节,只需要给出抽象层所需的参数即可。
嵌入式操作系统的设计是一个涉及嵌入式软件、硬件的方方面面的非常复杂的问题,解决这个问题可基于这样一个基本原理:问题分解,各个击破。设计易于移植的嵌入式平台,应遵循层次化、模块化和对象化的设计方法。
层次化设计对于嵌入式操作系统而言,体现在嵌入式操作系统的纵向结构上。为了适应多种硬件平台,将操作系统划分出来一个可以直接和硬件通讯的层次,然后为其上层提供抽象支持,下层通过API的形式向上层提供服务。这样上层在进行硬件操作时,不需要了解设备的具体细节,从而大大减少系统理解和开发的复杂度。所以,层次化的方法主要有以下优点:节省成本、易于理解、易于扩展、易于排错。
模块化最大特点就是将接口和实现分离开来,将具体的功能块隐藏在抽象的接口背后,以保证每个模块可以在不影响其他模块的情况下进行改变。这样,可将模块之间的依赖关系仅仅限定于接口。模块化方法与层次化方法不同,软件模块之间是相互独立的关系,而不是层次之间相互依赖的关系。
就当前的目的来说,对象是结构化使用模块的方法。面向对象设计方法将数据与数据上的操作封装在对象这个模块实体中,外界不能直接对对象内部进行访问和操作,只能通过消息的方式间接访问。因此,面向对象设计方法能够使软件开发人员更加容易理解,并且也提高了软件的扩展性、维护性和重用性。
下面具体讲述了这些功能实现的原理。
首先,为了更好地实现嵌入式系统中硬件相关和硬件无关两部分程序代码的隔离,使得硬件抽象层为上层软件提供一个已屏蔽硬件差异的接口,可将HAL进一步细化为几个子层次,即采用层次结构设计的思想。那么,在层次结构设计中,各子层之间定义了统一的接口调用。这些接口采用C/C++语言进行编码,即下层的功能实现需要按照与上层确定的接口规范来进行。而这些上下层之间的接口是使用宏定义的方式进行的。宏定义在预编译时进行替换,没有执行时的性能损失。在系统初始化阶段,片级初始化、板级初始化和系统级初始化基本上就是使用了宏定义这一特点。
其次,为保证开发语言的移植性,引入面向对象的思想。C语言虽不能直接支持面向对象的数据结构,如数据类型的动态绑定、多态函数或类继承。但在设计时可以借鉴面向对象语言的特点实现基于C语言的对象,却又不依赖于它。这样,就使系统开发难度大为降低。
那么,与硬件相关的驱动程序是如何利用面向对象的思想进行设计的?在系统初始化阶段结束以后,操作系统获得了系统控制权。HAL层的主要工作就变为向操作系统提供服务:将上层的调用转化为对硬件的直接访问和控制,具体活动为建立与硬件相关的驱动程序。这里的驱动程序指的是操作系统(通常被包含在I/O子系统里)的一些标准I/O函数,比如任何一个设备都有的Create、Destroy、Open、Close、Write、Read和Ioctl等函数。在这个阶段完成两个工作:
1、映射驱动程序函数到HALAPI经过改造后的驱动程序不再直接和硬件打交道,而是通过HALAPI进行硬件资源的访问和控制。图1表示了硬件相关设备驱动程序的标准I/O函数与HALAPI集合的映射关系。
2、I/O驱动程序表、设备表与HALAPI的关联如图2,显示了I/O子系统通常维护的I/O驱动程序表。从图2中可看出,驱动程序表的第二行、第N元素是一个指向内部的驱动函数UARTlCreate()的指针。这个指针建立了通用的Creat函数和设备指定的Creat之间的连接。使用I/O子系统提供的工具函数,可以将任何HALAPI安装到驱动程序表中或从表中删除。
I/O子系统中的Create函数用来创建一个虚拟设备实例,每个虚拟实例都以唯一的名字插入到I/O子系统的设备表中。图2中的设备表显示了UART0与USB0两个虚拟实例,设备表中的每一项包含通用信息以及特定的实例信息。设备项的通用部分包括实例的唯一名字和一个对HALAPI的引用。设备项特定的实例信息是由HALAPI为保持特定数据的每一个实例分配的一块内存,HALAPI初始化并维护。此信息的内容依赖于HALAPI的实现,HALAPI是唯一可以访问和中断此数据的实体。
嵌入式系统是一类特殊的计算机系统。它自底向上包括3个主要部分:硬件环境、嵌入式操作系统和嵌入式应用程序。硬件环境是整个嵌入式操作系统和应用程序运行的硬件平台,不同的应用通常有不同的硬件环境;因此如何有效地使嵌入式操作应用于各种不同的应用环境,是嵌入式操作系统发展中所必须解决的关键问题。硬件抽象层通过硬件抽象层接口向操作系统以及应用程序提供对硬件进行抽象后的服务。当操作系统或应用程序使用硬件抽象层API进行设计时,只要硬件抽象层API能够在下层硬件平台上实现,那么操作系统和应用程序的代码就可以移植。这样,原先嵌入式系统的3层结构逐步演化为一种4层结构。图3显示了引入硬件抽象层后的嵌入式系统的结构。
在整个嵌入式系统设计过程中,硬件抽象层同样发挥着不可替代的作用。传统的设计流程是采用瀑布式设计开发过程,首先是硬件平台的制作和调试,而后是在已经定型的硬件平台的基础上再进行软件设计。由于硬件和软件的设计过程是串行的,因此需要很长的设计周期;而硬件抽象层能够使软件设计在硬件设计结束前开始进行,使整个嵌入式系统的设计过程成为软硬件设计并行的V模式开发过程,如图4所示。这样两者的设计过程大致是同时进行的或是并发的,缩短了整个设计周期。结构。在整个嵌入式系统设计过程中,硬件抽象层同样发挥着不可替代的作用。传统的设计流程是采用瀑布式设计开发过程,首先是硬件平台的制作和调试,而后是在已经定型的硬件平台的基础上再进行软件设计。由于硬件和软件的设计过程是串行的,因此需要很长的设计周期;而硬件抽象层能够使软件设计在硬件设计结束前开始进行,使整个嵌入式系统的设计过程成为软硬件设计并行的V模式开发过程,如图4所示。这样两者的设计过程大致是同时进行的或是并发的,缩短了整个设计周期。
BSP分析
作为硬件抽象层的一种实现,板级支持包BSP(Board Support Package)是现有的大多数商用嵌入式操作系统实现可移植性所采用的一种方案。BSP隔离了所支持的嵌入式操作系统与底层硬件平台之间的相关性,使嵌入式操作系统能够通用于BSP所支持的硬件平台,从而实现嵌入式操作系统的可移植性和跨平台性,以及嵌入式操作系统的通用性、复用性。然而现有应用较为广泛的BSP形式的硬件抽象层,完全是为了现有通用或商业嵌入式操作系统在不同硬件平台间的移植而设计的,因此BSP形式的硬件抽象层与BSP所向上支持的嵌入式操作系统是紧密相关的。在同一种嵌入式微处理器的硬件平台上支持不同嵌入式操作系统的BSP之间不仅从组成结构、向操作系统内核所提供的功能以及所定义的服务的接口都完全不同,因而一种嵌入式操作系统的BSP不可能用于其他嵌入式操作系统。这种硬件抽象层是一种封闭的专用硬件抽象层。因此,我们提出了为上层嵌入式操作系统内核的开发和构建提供一种开放、通用的硬件抽象层平台,使得在某种硬件平台上的嵌入式操作系统内核的开发能够在支持这种硬件平台的硬件抽象层上进行。
*硬件抽象层具有与硬件的密切相关性
*硬件抽象层具有与操作系统无关性
*接口定义的功能应包含硬件或系统所需硬件支持的所有功能
*接口定义简单明了,太多接口函数会增加软件模拟的复杂性
*具有可测性的接口设计有利于系统的软硬件测试和集成
硬件抽象层对用户设备接口的功能模拟主要由虚拟驱动模块完成,包括数据包的收发及协议报文的预处理等工作,为上层协议软件提供标准的API函数, 而对用户设备的接口管理则由上层网络管理软件通地设备管理模块对其进行管理配置及监控,内部通信模块运行于内部队以太网络,协调各模块之间的功能接口,保证从处理单元与主处理单元之间实时可靠的数据传输.