本文介绍一些在嵌入式开发中常见的概念,比如API,硬件抽象,库函数等,会不断进行补充。
7.1.API,Handle(句柄)
7.1.1 API:
在嵌入式开发中,API(Application Programming Interface,应用程序编程接口)是一组定义、协议和工具的集合,它允许不同的软件组件相互交互。API为开发人员提供了一种标准化的方式,来访问特定功能或数据,而无需了解底层实现的细节。
可以理解为是一些已经封装好了的可以被调用的功能函数或者方法,我们把这些函数放到我们的工程中,当我们要实现某个功能时,就可以在工程中找到对应的函数,然后进行调用。
7.1.2 Handle(句柄):
Handle按英文的翻译就是“把手”,“抓手”,就像上图中的门把手,我们一旦抓到这个Handle“门把手”,那么我们就可以对这个房间进行一些操作,比如进入房间,知道里面放了什么,或者可以进去取一些东西之类的。在软件开发里,Handle的意思和前面的比喻是一样的,你只要获取了某个“东西”的句柄Handle(把手),那么你就可以对这个“东西”进行一些操作。
说的正式一些就是:在软件开发中,Handle(句柄)是一种特殊类型的标识符,它用来唯一地标识和引用系统内某个资源或对象。Handle在软件开发中起到了一个桥梁的作用,使得开发人员能够间接地访问和控制底层资源,从而提高了代码的灵活性和可维护性。
在STM32 的手册上经常看到这个词,可以理解为它是一个指针,或者是一些表的索引,或者是用于描述和标记某些资源的的标识,这些资源可以是函数、可以是一段内存、可以是一组数字、可以是一个外设等等,总之很广泛,通过句柄我们可以访问到打开的资源。我们在调用 API 函数的时候,可以利用句柄来说明要操作哪些资源。
7.2.CMSIS标准,HAL(硬件抽象层)
7.2.1 CMSIS标准
CMSIS(Cortex Microcontroller SoftwareInterface Standard)标准的建立主要是为了解决不同芯片厂商生产的Cortex微控制器软件兼容性问题。基于Cortex系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核,不同外设的芯片上移植困难。为了解决这个问题,ARM与芯片厂商建立了CMSIS标准。CMSIS标准的建立为基于Cortex核的嵌入式系统开发带来了诸多便利和优势,使得开发人员可以更加高效、快速地开发出高质量的产品。
CMSIS 标准,实际是新建了一个软件抽象层。见图7-1.CMSIS 架构。
图7-1.CMSIS架构
CMSIS标准中最主要的为CMSIS核心层,它包括了:
•内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由ARM公司提供。
•设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。
可见CMSIS层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植是有极大的好处的。
CMSIS标准的优势主要体现在以下几个方面:
降低学习曲线和开发成本:CMSIS提供了统一的软件接口和标准,使得开发人员可以更容易地学习和使用不同芯片厂商的Cortex微控制器。这降低了学习成本,提高了开发效率。
提高软件的可移植性和可重用性:通过遵循CMSIS标准,开发人员可以编写出在不同芯片上都能运行的代码,提高了软件的可移植性。同时,CMSIS提供的标准接口也使得软件模块的重用成为可能,进一步降低了开发成本。
缩短上市时间:CMSIS标准的采用可以加速新微控制器的部署和上市过程。由于CMSIS提供了与芯片生产商无关的硬件抽象层,开发人员可以更快地开发出符合市场需求的产品。
支持多种编译器:CMSIS独立于编译器,因此它支持主流编译器。这使得开发人员可以根据自己的喜好和需要选择适合的编译器进行开发。
增强程序调试:CMSIS提供了用于调试连接、调试外设视图、软件交付和设备支持的接口,以及通过调试器的外围信息和用于printf样式输出的ITM通道来增强程序调试。这使得开发人员可以更方便地进行程序调试和错误排查。
实现快速软件交付和简化更新:CMSIS以CMSIS-Pack格式交付,可以实现快速软件交付、简化更新,并与开发工具实现一致集成。这使得开发人员可以更方便地管理和更新他们的软件项目。
简化系统资源和分区:CMSIS-Zone将简化系统资源和分区,因为它管理多个处理器、内存区域和外围设备的配置。这使得开发人员可以更有效地管理系统资源,提高系统的整体性能。
7.2.2 HAL(硬件抽象层):
在嵌入式开发中,“硬件抽象层”(Hardware Abstraction Layer,简称HAL)是一个关键的概念,它主要用于隐藏底层硬件的细节,为上层软件提供统一的接口。硬件抽象层是嵌入式系统开发中的重要组成部分,它为上层软件提供了统一的、标准化的接口,并隐藏了底层硬件的细节。通过合理地设计和实现硬件抽象层,可以极大地提高嵌入式系统的开发效率和产品质量。
以下是关于硬件抽象层(HAL)的详细介绍:
定义与功能:
硬件抽象层是一种软件层,其主要目的是将硬件差别与操作系统的其他层相隔离。它通过将不同硬件平台的功能和特性抽象出来,为上层软件提供一个统一的、标准化的接口。
通过硬件抽象层,相同的代码可以在不同的硬件平台上运行,而无需进行大量的修改。这极大地提高了代码的可复用性和可移植性。
当需要对系统进行修改或添加新的功能时,可以通过修改或添加硬件抽象层来实现,而无需对整个系统进行大规模的修改。这降低了开发难度和成本。
优势:
硬件抽象层在嵌入式系统开发中扮演着至关重要的角色。它简化了软件开发的复杂性,降低了开发难度和成本,并提高了代码的可复用性和可移植性。
通过硬件抽象层,开发者可以更加专注于实现应用层逻辑,而无需深入了解底层硬件的细节。这有助于加速开发进程并提高产品质量。
随着硬件技术的不断发展,新的硬件功能不断涌现。通过设计可扩展的硬件抽象层,可以方便地添加新的硬件支持和功能,从而满足不断变化的市场需求。
7.3.BSP和库函数
7.3.1 BSP(板级支持包):
BSP(Board Support Package,板级支持包)是指针对特定硬件平台的软件支持包。它位于主板硬件和操作系统(或裸机系统)之间,提供了一组软件接口和驱动程序,用于实现对底层硬件设备的抽象和管理,使上层应用程序能够更加方便、高效地访问和控制硬件资源。
它是针对特定硬件平台(例如某款开发板或特定的嵌入式系统)的软件支持包。BSP的作用是提供一系列软件组件,帮助开发者在特定硬件平台上进行软件开发。这些组件包括了对硬件的初始化、配置以及访问硬件的接口,以确保软件能够正确地运行在目标硬件上。
BSP通常包括以下内容:
引脚配置:包括各功能引脚的初始化设置,比如串口、I2C、SPI等接口的引脚配置。
中断配置:处理器中断控制器的初始化设置,确保中断能够正常工作。
时钟配置:处理器和外设的时钟配置,确保系统时钟和外设时钟能够正常运行。
外设驱动:对于特定的开发板,可能包含对应外设的驱动程序,比如液晶显示屏驱动、触摸屏驱动等。
其他硬件初始化:例如初始化LED、按键、传感器等外部硬件设备。
7.3.2 库函数
库函数在嵌入式领域中也经常被称为固件库(Firmware Library)。固件库的作用是为特定的微控制器MCU或处理器MPU提供高级别的函数接口,以简化对硬件的访问和控制,并且为开发者提供更加便捷的软件开发和调试环境。在不同的硬件和开发工具厂商中,固件库也可能被称为不同的名字,比如标准外设库、处理器支持库等等。
STM32的库函数是为ST公司生产的STM32系列微控制器而设计的一组函数库。这些库函数旨在简化对STM32微控制器的编程和开发,提供了对处理器内部功能和外设的高级抽象,使得开发者可以更容易地与STM32系列微控制器进行交互和控制。
STM32的库函数主要包括标准外设库(Standard Peripheral Library,SPL)和STM32Cube库(HAL库和LL库)两种形式。标准外设库提供了对处理器内部外设(比如定时器、串口、I2C、SPI等)的底层驱动函数,而STM32Cube库则提供了一套更加高级、现代化的API,包含了对各种传感器、通信接口和外设的驱动函数,并提供了更加丰富和易用的功能。
通过使用STM32的库函数,开发者可以更便捷地进行嵌入式软件开发,加快产品上市速度,并且为不同型号的STM32微控制器的开发提供了一定的通用性。
7.3.3 BSP和库函数的区别
以STM32开发为例,BSP和库函数这2个概念经常容易混淆,下面是我个人对这2个概念的理解。
BSP是针对特定的开发板或硬件平台的(比如我们STM32的MCU做了个控制板),它包含了特定硬件的初始化和配置信息,因此具有一定的特殊性。而库函数则是针对某款MCU(微控制器单元)的,提供了对处理器内部功能的封装,具有普遍性,可以适用于多种硬件平台,比如STM32F103C8T6这个MCU的库函数,不管是谁设计控制板都可以使用且是一样的。在实际开发过程中,BSP和库数通常配合使用,BSP用于配置和初始化特定硬件平台,而库函数则用于提供通用的MCU或MPU处理器功能和外设控制。
7.4 应用层软件,中间层软件,底层软件
以我自己的认识来看,这3个概念似乎只有应用层软件是比较固定的,而中间层和底层的定义在不同的环境中可能具有不同的含义,很难给出统一的解释,在不同人和不同场景下,中间层和底层的一些内容可能会有重叠,但一般而言下面这张关系图都是成立的。
以STM32开发为例,应用层软件、中间层软件和底层软件具体含义和内容:
应用层软件:
含义:应用层软件是STM32微控制器上运行的最终功能程序,它直接满足用户需求或完成特定的功能任务。
内容:应用层软件包括用户界面、通信协议、数据处理算法等。例如,如果你正在开发一个基于STM32的温度控制系统,应用层软件可能包括温度数据的读取、处理、显示以及与上位机的通信功能。
中间层软件(硬件抽象层HAL或板级支持包BSP):
含义:中间层软件是连接应用层软件和底层硬件的桥梁,它隐藏了底层硬件的复杂性,为应用层软件提供了一组统一的接口。
内容:在STM32开发中,中间层软件通常包括STM32的HAL库(硬件抽象层库)或特定的BSP(板级支持包)。HAL库提供了一组高级API,用于访问STM32微控制器的硬件资源,如GPIO、UART、SPI等。BSP则针对特定的STM32开发板提供了初始化代码、驱动程序等。这些库和包使得开发者能够以一种统一、标准化的方式访问底层硬件,而不必深入了解底层寄存器和位操作。
底层软件:
含义:底层软件直接与STM32微控制器的硬件交互,负责完成硬件的初始化、驱动程序的加载以及硬件资源的直接控制。
内容:底层软件通常包括与STM32微控制器直接相关的代码,如启动文件(Startup Files)、链接脚本(Linker Scripts)、中断服务程序(Interrupt Service Routines, ISRs)以及硬件的初始化代码。这些代码负责设置微控制器的时钟、内存、外设等,为中间层和应用层软件提供一个稳定、可靠的硬件环境。
|