BSP和HAL是否需要分层?分层和并行开发测试思想更重要,本文融合了3个文章的内容。
如下这这篇文章把Hardware—BSP—HAL—OS-MiddleWare-APP分层的思想和软硬件并行测试的思想讲清楚了
嵌入式系统硬件抽象层(HAL & BSP)的设计思想--第一部分_m0_46577050的博客-CSDN博客
HAL: Hardware Abstraction Layer
BSP: Board Support Package
这篇文章把各个职责列了一下,
OS - HAL与BSP的关系_迟来大师的博客-CSDN博客
1 前言
硬件抽象层是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化。它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。 从软硬件测试的角度来看,软硬件的测试工作都可分别基于硬件抽象层来完成,使得软硬件测试工作的并行进行成为可能。
硬件抽象层是一个编程层,允许计算机操作系统在逻辑层而不是硬件层与硬件设备交互。
嵌入式操作系统的设计是一个涉及嵌入式软件、硬件的方方面面的非常复杂的问题,解决这个问题可基于这样一个基本原理:问题分解,各个击破。设计易于移植的嵌入式平台,应遵循层次化、模块化和对象化的设计方法 [1] 。
特点
硬件抽象层与硬件密切相关性;
硬件抽象层与操作系统无关性;
硬件抽象层接口定义的功能应包含硬件或系统所需硬件支持的所有功能;
硬件抽象层接口定义应该简单明了,如果定义太多接口,会增加软件模拟的复杂性;
具有可测性的接口设计有利于系统的软硬件测试和集成。
在目前的嵌入式领域中通常也把HAL叫做板级支持包BSP(Board Support Package)。
BSP的特点与功能
由于在系统中的特殊位置,因此BSP具有以下主要特点:
(1)硬件相关性
因为嵌入式实时系统的硬件环境具有应用相关性,所以,作为高层软件与硬件之间的接口,BSP必须为操作系统提供操作和控制具体硬件的方法。
(2)操作系统相关性
不同的操作系统具有各自的软件层次结构, 因此,不同的操作系统具有特定的硬件接口形式。
在实现上,BSP是一个介于操作系统和底层硬件之间的软件层次,包括了系统中大部分与硬件相关的软件模块。在功能上包含两部分:
- 系统初始化
初始化过程总是可以抽象为三个主要环境,按照自底向上、从硬件到软件的次序依次为:片级初始化、板级初始化和系统级初始化。
1)片级初始化: 主要完成CPU的初始化,包括设置CPU的核心寄存器和控制寄存器,CPU核心工作模式以及CPU的局部总线模式等。片级初始化把CPU从上电时的缺省状态逐步设置成为系统所要求的工作状态。这是一个纯硬件的初始化过程。
2)板级初始化: 完成CPU以外的其他硬件设备的初始化。除此之外,还要设置某些软件的数据结构和参数,为随后的系统级初始化和应用程序的运行建立硬件和软件环境。这是一个同时饮食软硬件两部分在内的初始化过程。
3)系统级初始化: 这是一个以软件初始化为主的过程,主要进行操作系统初始化。BSP将控制转交给操作系统,由操作系统进行余下的初始化操作。包括加载和初始化与硬件无关的设备驱动程序,建立系统内存区,加载并初始化其他系统软件模块,比如网络系统、文件系统等;最后,操作系统创建应用程序环境并将控制转交给应用程序的入口。
经过以上三个层次的操作,嵌入式系统运行所需要的硬件和软件环境已经进行了正确设置,从这里开始,高层的实时应用程序可以运行了。
需要指出:系统级初始化不是BSP的工作。但是,系统级初始化成功与否的关键在于BSP的前两个初始化过程中所进行的软件和硬件的正确设置,而且系统级初始化也是由BSP发起的。
- 硬件相关的设备驱动。
尽管BSP中包含硬件相关的设备驱动程序,但是这些设备驱动程序通常不直接由BSP使用,而是在系统初始化过程中由BSP把它们与操作系统中通用的设备驱动程序关联起来,并在随后的应用中由通用的设备驱动程序调用,实现对硬件设备的操作。设计与硬件相关的驱动程序是BSP设计中另一个关键环节。
BSP和HAL是否需要分层?分层和并行开发测试思想更重要。
BSP与HAL关系_kyo_的博客-CSDN博客_bsp和hal
板级支持包(BSP)(Board Support Package)是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统一部分,主要是实现对操作系统的支持,为上层的驱动程序提供访问硬件设备寄存器的函数包,使之能够更好的运行于硬件主板。
硬件抽象层是位于操作系统 内核与硬件电路之间的接口层,其目的在于将硬件抽象化。它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。
就我跟人理解而言BSP就是硬件驱动程序,它包含了操控硬件的必要函数,单片机系统使用BSP可以直接进行应用开发,这时候应用开发的hierarchy如下图所示:
但是由于日益增长的芯片种类和芯片复杂度,直接使用BSP进行应用开发将会受到巨大的挑战,因此为了程序的可阅读性以及可移植性提出了硬件抽象层HAL这一个概念。引入HAl之后的系统hierarchy如下图所示:
引入HAL之后操作系统将会使用相对更为统一的HAL接口来实现对硬件的操作,而不是直接使用BSP库。当然,HAL库的实现是基于BSP库的,只是将其进一步封装,形成统一的标准。因此一个完整、强健的嵌入式系统的系统hierarchy应该为:
hardware –> board support package –> hardware abstract layer –> driver –> operating system –> application
当然嵌入式系统中操作系统并不是必须的,并且在操作系统和应用程序之间可以在有一层中间件Middleware层,用于提供更多的系统功能,这个中间件Middleware层也被称作SDK。
针对某个CPU芯片的厂家来说,HAL和BSP最好还是分开。
HAL一般都是与OS中的驱动程序打交道的。
以如下I/O子系统中的Create函数用来创建一个虚拟设备实例,每个虚拟实例都以唯一的名字插入到I/O子系统的设备表中。图2中的设备表显示了UART0与USB0两个虚拟实例,设备表中的每一项包含通用信息以及特定的实例信息。设备项的通用部分包括实例的唯一名字和一个对HALAPI的引用。设备项特定的实例信息是由HALAPI为保持特定数据的每一个实例分配的一块内存,HALAPI初始化并维护。此信息的内容依赖于HALAPI的实现,HALAPI是唯一可以访问和中断此数据的实体。