火影 发表于 2025-3-9 02:25:31

嵌入式单片机代码层级架构

目次
层级
1. 硬件抽象层(HAL - Hardware Abstraction Layer)
2. 板级支持包(BSP - Board Support Package)
3. 中间件层(Middleware Layer)
4. 操纵体系抽象层(OSAL - Operating System Abstraction Layer)
5. 应用层(Application Layer)
6. 驱动层(Driver Layer)
7. 库支持层(Library Layer)
一些定义补充
HAL与BSP层的区别
stm32 hal库 和代码架构
例子

下面是GPT 4o天生的,结合我看到的其他文章先容,大差不差,末了再补充一些我个人的理解。
层级

1. 硬件抽象层(HAL - Hardware Abstraction Layer)



[*]职责:HAL是对芯片(MCU)级外设的抽象,它为每个硬件外设(如GPIO、USART、SPI、ADC等)提供统一的接口。它将底层硬件的寄存器级操纵举行封装,提供通用的函数来初始化、控制和操纵外设。
[*]优点:通过HAL层,可以实现对差别型号MCU的代码移植,由于雷同外设的底层寄存器操纵通过HAL层屏蔽了差别。
[*]实现示例:

[*]GPIO控制:HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
[*]UART通讯:HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

2. 板级支持包(BSP - Board Support Package)



[*]职责:BSP是针对具体开辟板或硬件平台的硬件抽象层,BSP将MCU和所有板载外设(如LED、按键、屏幕、传感器等)封装成上层应用可以方便调用的接口。
[*]特点:BSP的主要功能包括硬件的初始化以及提供对特定板卡的硬件资源的访问函数,例如对LED的控制、按键的读取、传感器的初始化等。
[*]实现示例:

[*]初始化LED:void BSP_LED_Init(void);
[*]控制LED:void BSP_LED_On(uint8_t led_id);
[*]初始化按键:void BSP_Button_Init(void);

3. 中间件层(Middleware Layer)



[*]职责:中间件层主要用于实现协议栈和复杂功能模块,如文件体系、网络协议栈、USB协议栈、图形界面库等。它提供常用的体系服务,使得应用层可以通过高层次的接口来实现复杂的功能。
[*]典型中间件:

[*]文件体系:如FATFS,用于在存储装备(如SD卡)上管理文件。
[*]网络协议栈:如TCP/IP协议栈(lwIP,FreeRTOS+TCP)用于实现网络通讯。
[*]图形用户界面:如emWin、LVGL等,用于实现嵌入式显示体系的图形界面。

4. 操纵体系抽象层(OSAL - Operating System Abstraction Layer)



[*]职责:OSAL为应用程序和中间件提供一个统一的操纵体系接口抽象,使得代码可以独立于特定的RTOS(如FreeRTOS、ThreadX等)。它抽象了一些操纵体系的基本功能,如任务管理、信号量、互斥量、消息队列等。
[*]利益:通过操纵体系抽象层,代码的可移植性更强,可以方便地移植到差别的实时操纵体系上,且无需对应用层代码做大规模修改。
5. 应用层(Application Layer)



[*]职责:应用层包罗用户编写的业务逻辑,是体系终极功能实现的部分。应用层依赖于下面的BSP层、HAL层、中间件层提供的接口来实现用户需求的功能。
[*]特点:应用层可以调用BSP来控制硬件,也可以调用中间件来实现复杂功能(例如网络通讯或文件操纵)。应用层通常通过任务、状态机等实现特定的应用逻辑。
[*]示例:

[*]通过LED指示体系状态。
[*]通过串口输出调试信息或获取用户输入。
[*]通过TCP/IP协议发送和接收数据。

6. 驱动层(Driver Layer)



[*]职责:驱动层的职责是实现对外部硬件装备的具体控制,比如传感器、显示屏、外部存储装备等。驱动层位于HAL和BSP之间,偶然与HAL层结合实现,对具体的外设提供初始化和操纵接口。
[*]特点:通常包罗特定外设的操纵接口,例如:

[*]传感器驱动:Sensor_Init(), Sensor_Read()
[*]外部装备:如SPI屏幕驱动、I2C EEPROM驱动等。

7. 库支持层(Library Layer)



[*]职责:这层包括一些通用的库函数或者工具函数,如数学计算、字符串处理、CRC计算等。这些库函数可能与硬件无关,但为应用层和其他层提供了基本的功能支持。
[*]示例:CMSIS(Cortex Microcontroller Software Interface Standard),它提供了Cortex-M微控制器的一些基础库,包括启动文件、内核功能、数学函数等。
+-----------------------------------+
|       应用层 (Application)      |
|      - 业务逻辑实现            |
+-----------------------------------+
|       中间件层 (Middleware)       |
|    - 文件系统、网络协议栈等       |
+-----------------------------------+
|   操作系统抽象层 (OSAL) [可选]    |
|    - 任务调度、消息队列等      |
+-----------------------------------+
|      BSP (Board Support)      |
|   - 硬件资源的封装和初始化       |
+-----------------------------------+
|          HAL (Hardware)         |
| - MCU外设抽象,如GPIO、UART等    |
+-----------------------------------+
|         驱动层 (Drivers)          |
| - 外设驱动,如传感器、显示屏等    |
+-----------------------------------+
|    库支持层 (Library Support)   |
| - 通用库函数、CMSIS、工具函数    |
+-----------------------------------+
|          硬件层 (Hardware)      |
| - MCU、传感器、显示屏、存储器等   |
+-----------------------------------+
一些定义补充

HAL与BSP层的区别

https://i-blog.csdnimg.cn/direct/ab9728155b794431b9d057ca802595ce.png
stm32 hal库 和代码架构

【08】STM32·HAL库开辟-HAL库先容 | STM32Cube固件库先容 | HAL库框架结构 | 如何使用HAL库及使用留意事项_stm32 hal库-CSDN博客
例子



[*] 我要在代码中添加一个环形队列的代码,我应该放到哪里?
        应该放入:”库支持层(Library Layer)”中,由于这个不属于中间件,不是很大的一个库,或者说一个很复杂的东西。


[*]我要代码中添加CANopen 协议栈应放到哪里?
        当然是中间件,很明显。


[*]比如我要写一个关于AD7190的ADC驱动支持,应该放入哪里?
        放入BSP,然后再BSP中调用HAL/LL的支持

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 嵌入式单片机代码层级架构