一、前言

在嵌入式开发中,90%的新手项目架构都存在一个致命问题:层级混乱、跨层调用、业务直接耦合硬件/操作系统。

例如:APP层直接调用FreeRTOS接口、Service层直接操作BSP、业务层直接读写寄存器。

短期写代码很快,但是一旦换芯片、换操作系统、更换外设,整个项目代码大面积崩塌,需要重写大量业务代码,无法复用、无法维护、无法商业化。

本文基于企业标准工业架构(和你手上架构图一模一样),从零讲解五层架构:硬件层、驱动BSP层、Platform平台层、Service服务层、APP应用层。

附带每层职责、调用规则、完整工程代码、调用链路,帮助大家彻底掌握商业级嵌入式架构。

二、整体架构总览(官方标准架构)

2.1 架构层级图(参照你提供原图)

(请在此处插入架构大图,与项目Platform架构完全一致)

从上至下层级顺序:

  1. 应用层(Application)

  2. 服务层(Service)

  3. 平台抽象层(Platform)

    1. 中间件封装 Middleware

    2. 操作系统封装 OS_Wrapper

    3. 硬件驱动封装 BSP_Wrapper

  4. 底层驱动层(BSP / Driver / OS内核)

  5. 硬件层(Hardware)

2.2 核心架构理念

所有上层模块,只能调用紧邻下一层,禁止跨层调用;上层永远不直接操作硬件、不直接调用原生OS。

Platform平台层是整个项目的唯一隔离层、解耦层,所有硬件差异、系统差异全部收敛在Platform。

三、逐层详细职责讲解

3.1 硬件层(Hardware)

架构最底层,代表物理实体。

包含:MCU芯片、LCD/OLED屏幕、按键、传感器、串口、Flash、外设电路。

该层不编写任何业务代码,只负责物理电气特性。

3.2 驱动层(BSP / Driver / OS Kernel)

该层分为两大板块:

  • BSP板级驱动:直接操作寄存器,实现外设初始化、读写、时序驱动(屏幕、GPIO、UART)。

  • OS内核层:FreeRTOS/RTThread/Linux原始内核API,任务、队列、信号量、延时。

特点:只写给硬件,不写任何业务逻辑。

3.3 平台抽象层 Platform(架构核心)

Platform 是整套架构的灵魂,也是大型项目与小型裸机项目最大区别。

它分为三大子模块:

(1)BSP_Wrapper 硬件封装层

统一封装底层BSP驱动,屏蔽不同型号设备的接口差异,向上提供统一硬件API。

(2)OS_Wrapper 操作系统封装层

封装原生FreeRTOS/RTThread API,重新封装一套统一延时、信号量、队列接口。

后续项目更换操作系统,Service与APP完全不用改动。

(3)Middleware 中间件封装

封装LVGL、协议栈、加密算法、第三方库,避免业务层直接依赖第三方库。

Platform总体职责

承接上层Service、隔离底层BSP与OS,实现:换芯片不改业务、换OS不改业务、换外设不改业务。

3.4 服务层 Service(业务功能层)

很多新手最大误区:让Service直接调用BSP、直接调用OS。

❌ 错误:Service —> BSP / 原始OS

✅ 正确:Service —> Platform(OS_Wrapper/BSP_Wrapper)

Service层按照功能进行模块化拆分:

  • Display_Service 显示服务

  • Key_Service 按键服务

  • UART_Service 串口服务

  • Storage_Service 存储服务

职责:处理业务逻辑、数据格式化、功能整合,绝不操作硬件、绝不调用原生OS。

3.5 应用层 Application(APP)

整个项目最顶层,面向产品业务。

职责:状态机、业务流程、页面逻辑、事件调度。

APP层只能依赖Service层,完全不知道底层芯片、操作系统、外设型号。

四、标准调用链路(官方固定流程)

下图为整套架构唯一合法调用流向:

APP应用层

  ⬇️(仅调用业务服务接口)

Service服务层

  ⬇️(仅调用Platform封装接口)

Platform平台层(OS_Wrapper / BSP_Wrapper / 中间件)

  ⬇️(调用底层驱动与内核)

BSP驱动层 & OS内核层

  ⬇️

物理硬件层

五、工程目录结构(企业标准)

Project/
├── App/                // 应用层
│   └── app_main.c
├── Service/            // 业务服务层
│   ├── service_display.h
│   └── service_display.c
├── Platform/           // 平台抽象层
│   ├── os/
│   │   ├── platform_os.h
│   │   └── platform_os.c
│   ├── screen/
│   │   ├── platform_screen.h
│   │   └── platform_screen.c
├── BSP/                // 底层硬件驱动
│   ├── bsp_lcd.h
│   └── bsp_lcd.c

六、分层代码实战(完整版)

6.1 BSP层(bsp_lcd)纯硬件驱动

bsp_lcd.h

#ifndef BSP_LCD_H
#define BSP_LCD_H

void BSP_LCD_Init(void);
void BSP_LCD_Write(const char* str);

#endif

bsp_lcd.c

#include "bsp_lcd.h"
#include <stdio.h>

void BSP_LCD_Init(void)
{
    printf("[BSP] 操作寄存器初始化LCD\r\n");
}

void BSP_LCD_Write(const char* str)
{
    printf("[BSP] 硬件输出:%s\r\n",str);
}

6.2 Platform平台层(BSP封装)

platform_screen.h

#ifndef PLATFORM_SCREEN_H
#define PLATFORM_SCREEN_H

void Platform_Screen_Init(void);
void Platform_Screen_Display(const char* str);

#endif

platform_screen.c

#include "platform_screen.h"
#include "bsp_lcd.h"

void Platform_Screen_Init(void)
{
    BSP_LCD_Init();
}

void Platform_Screen_Display(const char* str)
{
    BSP_LCD_Write(str);
}

6.3 Platform平台层(OS封装)

platform_os.h

#ifndef PLATFORM_OS_H
#define PLATFORM_OS_H

void Platform_OS_Delay(uint32_t ms);

#endif

platform_os.c

#include "platform_os.h"
#include "FreeRTOS.h"
#include "task.h"

// 统一封装延时接口,屏蔽不同RTOS差异
void Platform_OS_Delay(uint32_t ms)
{
    vTaskDelay(pdMS_TO_TICKS(ms));
}

6.4 Service服务层(业务功能)

service_display.h

#ifndef SERVICE_DISPLAY_H
#define SERVICE_DISPLAY_H

void Display_Service_Init(void);
void Display_Service_Print(const char* text);
void Display_Service_ShowState(const char* state);

#endif

service_display.c

#include "service_display.h"
#include "platform_screen.h"
#include "platform_os.h"
#include <string.h>

void Display_Service_Init(void)
{
    Platform_Screen_Init();
}

void Display_Service_Print(const char* text)
{
    Platform_OS_Delay(100);
    Platform_Screen_Display(text);
}

void Display_Service_ShowState(const char* state)
{
    char buf[64] = {0};
    strcat(buf,"System State:");
    strcat(buf,state);
    Platform_Screen_Display(buf);
}

6.5 APP应用层

#include "service_display.h"

int main(void)
{
    Display_Service_Init();
    Display_Service_Print("Hello Platform Arch");
    Display_Service_ShowState("Running OK");
    return 0;
}

七、运行结果

[BSP] 操作寄存器初始化LCD
[BSP] 硬件输出:Hello Platform Arch
[BSP] 硬件输出:System State:Running OK

八、架构四层铁律(必背)

  1. 上层只能调用相邻下一层,禁止跨层调用

  2. APP、Service 绝对禁止直接操作硬件

  3. APP、Service 禁止直接调用原生OS内核API

  4. 所有硬件、系统差异,全部收敛至Platform层

九、架构优势总结

  • 解耦性:业务与硬件完全隔离

  • 可移植:换MCU、换屏幕、换RTOS,业务代码零改动

  • 易维护:分层清晰,各司其职,多人协作无冲突

  • 易拓展:新增外设仅需补充BSP+Platform,不影响上层

十、结合设计模式(高阶拓展)

10.1 Platform平台层

  • 注册器模式 / 简单工厂:统一管理所有设备

  • 适配器模式:适配第三方非标驱动

10.2 Service服务层

  • 策略模式:动态切换刷新、滤波、校验算法

十一、总结

五层架构的本质:APP管业务,Service管功能,Platform管底层适配与隔离,BSP管硬件,硬件只通电。

真正的工业级项目,从来不是堆砌功能,而是分层、解耦、规范化。掌握这套架构,你就已经超越90%嵌入式开发者。

更多推荐