设计易于移植的平台,应遵循层次化、模块化和对象化的设计方法。

层次化思想

        层次化设计对于操作系统而言,体现在操作系统的纵向结构上。为了适应多种硬件平台,将操作系统划分出来一个可以直接和硬件通讯的层次,然后为其上层提供抽象支持,下层通过API的形式向上层提供服务。这样上层在进行硬件操作时,不需要了解设备的具体细节,从而大大减少系统理解和开发的复杂度。所以,层次化的方法主要有以下优点:节省成本、易于理解、易于扩展、易于排错。

模块化思想

        模块化最大特点就是将接口和实现分离开来,将具体的功能块隐藏在抽象的接口背后,以保证每个模块可以在不影响其他模块的情况下进行改变。这样,可将模块之间的依赖关系仅仅限定于接口。模块化方法与层次化方法不同,软件模块之间是相互独立的关系,而不是层次之间相互依赖的关系。

对象化思想

        就当前的目的来说,对象是结构化使用模块的方法。面向对象设计方法将数据与数据上的操作封装在对象这个模块实体中,外界不能直接对对象内部进行访问和操作,只能通过消息的方式间接访问。因此,面向对象设计方法能够使软件开发人员更加容易理解,并且也提高了软件的扩展性、维护性和重用性。

下面具体讲述了这些功能实现的原理。

        首先,为了更好地实现嵌入式系统中硬件相关和硬件无关两部分程序代码的隔离,使得硬件抽象层为上层软件提供一个已屏蔽硬件差异的接口,可将HAL进一步细化为几个子层次,即采用层次结构设计的思想。那么,在层次结构设计中,各子层之间定义了统一的接口调用。这些接口采用C/C++语言进行编码,即下层的功能实现需要按照与上层确定的接口规范来进行。而这些上下层之间的接口是使用宏定义的方式进行的。宏定义在预编译时进行替换,没有执行时的性能损失。在系统初始化阶段,片级初始化、板级初始化和系统级初始化基本上就是使用了宏定义这一特点。

        其次,为保证开发语言的移植性,引入面向对象的思想。C语言虽不能直接支持面向对象的数据结构,如数据类型的动态绑定、多态函数或类继承。但在设计时可以借鉴面向对象语言的特点实现基于C语言的对象,却又不依赖于它。这样,就使系统开发难度大为降低。

论层次化架构 层次化的优点_面向对象

图1

        那么,与硬件相关的驱动程序是如何利用面向对象的思想进行设计的?在系统初始化阶段结束以后,操作系统获得了系统控制权。HAL层的主要工作就变为向操作系统提供服务:将上层的调用转化为对硬件的直接访问和控制,具体活动为建立与硬件相关的驱动程序。这里的驱动程序指的是操作系统(通常被包含在I/O子系统里)的一些标准I/O函数,比如任何一个设备都有的Create、Destroy、Open、Close、Write、Read和Ioctl等函数。在这个阶段完成两个工作:

        1、映射驱动程序函数到HALAPI经过改造后的驱动程序不再直接和硬件打交道,而是通过HALAPI进行硬件资源的访问和控制。图1表示了硬件相关设备驱动程序的标准I/O函数与HALAPI集合的映射关系。

论层次化架构 层次化的优点_初始化_02

图2

        2、I/O驱动程序表、设备表与HALAPI的关联如图2,显示了I/O子系统通常维护的I/O驱动程序表。从图2中可看出,驱动程序表的第二行、第N元素是一个指向内部的驱动函数UARTlCreate()的指针。这个指针建立了通用的Create函数和设备指定的Create之间的连接。使用I/O子系统提供的工具函数,可以将任何HAL API安装到驱动程序表中或从表中删除。

        I/O子系统中的Create函数用来创建一个虚拟设备实例,每个虚拟实例都以唯一的名字插入到I/O子系统的设备表中。图2中的设备表显示了UART0与USB0两个虚拟实例,设备表中的每一项包含通用信息以及特定的实例信息。设备项的通用部分包括实例的唯一名字和一个对HAL API的引用。设备项特定的实例信息是由HALAPI为保持特定数据的每一个实例分配的一块内存,HALAPI初始化并维护。此信息的内容依赖于HALAPI的实现,HALAPI是唯一可以访问和中断此数据的实体。

      藉此,很多软硬件平台设计思想最终都统一高度抽象为这几方面思想,他们适用于一切。从而不用再纠结那么多种所谓的设计模式,也不用纠结其他各式变异的思维模式。他们适用于整体的结构,也适用于局部的细节。