嵌入式与单片机的分层——硬件能力如何逐层变成应用能力
服务器、CLI、GUI 分层是从「代码职责」出发的;嵌入式程序多了一个根本性的东西——硬件。嵌入式最好不要直接套 Web 那套 Controller / Service / Infrastructure,更自然的是按 硬件 → 驱动 → 系统能力 → 应用 拆。这一条线是拆解与组织原则在嵌入式领域的完整案例:Driver 是接口,RTOS 是框架,Middleware 是子系统,Application 是功能——「分层」在这里不是目录层级,而是硬件能力如何逐层变成应用能力。
一、嵌入式软件的基本分层
1 2 3 4 5 6 7 8 9 10
| Embedded System ├── Hardware ├── BSP / Driver │ ├── GPIO / UART / SPI / I2C / CAN / ADC / PWM / Timer ├── System / Runtime │ ├── RTOS / Task / Queue / Mutex / Timer / Memory ├── Middleware / Protocol │ ├── TCP/IP / USB / MQTT / File System / Serialization └── Application ├── Service / Control / State / Algorithm
|
每一层用「框架 / 接口 / 子系统 / 组件」模型都能对上:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 1. 驱动是硬件的接口 UART Hardware ↑ UART Driver ↑ Application uart.write(data); uart.read(buffer); 应用不需要知道寄存器、中断号、DMA、时钟、GPIO 复用 → Driver 本质上是硬件能力的封装接口
2. RTOS 是框架 FreeRTOS 的 Task / Scheduler / Queue / Semaphore / Mutex / Timer 应用 create_task(...) 之后,RTOS → Scheduler → 调用 Task 控制权部分交给 RTOS → 符合「运行框架」而不是单纯的 API 库
3. Middleware 是子系统 / 库 TCP/IP 协议栈是网络能力库/子系统,Ethernet Driver 是硬件接口 Application → TCP/IP API → Network Stack → Ethernet Driver → Ethernet Controller
4. Application 才是产品功能(温控器) Temperature Sensor → Sensor Driver → TemperatureService → ControlAlgorithm → PWM Driver → Heater
|
嵌入式的「分层」不是简单的目录层级,而是硬件能力如何逐层变成应用能力:硬件 → 驱动接口 → 系统运行能力 → 中间件/协议 → 应用功能。
二、单片机程序的分层(C/C++ 项目)
1 2 3 4 5 6
| MCU Application ├── Application Service / StateMachine / Control / Algorithm ├── Middleware Protocol / Communication / FileSystem / RTOS ├── Drivers Sensor / Display / Motor / Storage ├── BSP GPIO / UART / SPI / I2C / Timer / PWM / ADC └── Hardware
|
1. Hardware:物理硬件(不是 C++ 类)
2. BSP / Driver:把硬件封装成接口
应用不应该直接操作寄存器:
1 2 3 4 5
|
uart.write(data); gpio.set(); gpio.clear(); adc.read();
|
Driver 的核心作用之一,就是把硬件组件封装成软件接口。
3. Middleware:多个底层组件组装出来的能力
1 2
| UART Driver + RingBuffer + Timer + Interrupt → Serial Communication 再往上:UART → Modbus;CAN Protocol;USB;TCP/IP;File System
|
这里开始出现子系统。
4. RTOS:特殊的运行框架
1 2 3
| RTOS:Scheduler / Task / Queue / Semaphore / Mutex / Timer 你的程序:xTaskCreate(...); xQueueSend(...); 然后 RTOS:Scheduler → Task → Task Function
|
RTOS 不是单纯的硬件接口,而是运行时框架。
5. Application:产品真正的功能
温控器:TemperatureService + ControlAlgorithm + Alarm + DisplayService + StateMachine,数据流:
1
| Sensor → Driver → Service → Algorithm → PWM Driver → Heater
|
6. 没有 RTOS 时 main 承担组装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| int main() { gpio_init(); uart_init(); adc_init(); sensor_init(); display_init();
while (1) { sensor_update(); control_update(); display_update(); communication_update(); } }
|
此时 main 承担了系统组装和控制流——与服务器里 Server 组装、游戏里 GameApplication 组装是同一件事。
7. 单片机总结图
1 2 3 4 5 6 7 8 9 10
| MCU → Hardware → BSP/Driver → 底层软件接口 → Middleware(Protocol / USB / FileSystem) → Application(Service / Control / Algorithm)
RTOS 是一条横向的运行基础(Task/Queue/Mutex/Timer/Scheduler), 服务于整个软件,而不是某一个具体业务层: RTOS ↙ ↓ ↘ Driver Middleware Application
|
三、与服务器对比
1 2
| 服务器:Socket → Network API → Protocol → Router/Dispatcher → Service → Application 单片机:Hardware → Driver API → Middleware/Protocol → Service → Application
|
区别是单片机下面多了一层非常重要的 Hardware 以及可能存在的 RTOS。
1 2
| 服务器缺少的一层(硬件)恰恰是嵌入式分层的第一层; 服务器多的一层(入口解析/分发)在嵌入式里由通信中间件部分承担。
|
单片机软件最核心的结构:硬件 → 驱动接口 → 中间件/系统能力 → 应用功能;如果使用 RTOS,RTOS 负责整个程序的运行调度。 这比强行套 Controller/Service/Infrastructure 更符合实际结构。
四、这一条线的位置
1 2 3 4 5 6 7 8 9 10 11 12
| 拆解与组织(主题): 01 元原则 02 边界(在哪切) 03 游戏拆解与组装(非 ECS 案例) 04 ECS 与注册机制(运行时组装案例) 05 只有组件的子系统如何被加载(接口化/框架化落点) 06 模块-组织与复用 07 嵌入式与单片机的分层(本线:拆解与组织在嵌入式领域的案例) 08 Linux 的分层与组装(三种组装:编译期/启动期/注册) 09 裸机 hypervisor 的系统组织(无 OS 时的完整系统案例) 10 微服务与组装边界(子系统提升为独立进程) 11 软件组织知识与四个层次(收束)
|
本线与 05 的关系:嵌入式里「Driver 是接口」就是接口化、「RTOS 是框架」就是框架化——main 组装是顶层组装,与「入口启动、入口不管理生命周期」一致。
收束
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 嵌入式分层: Hardware → BSP/Driver(接口)→ Middleware(子系统) → RTOS(框架,可无)→ Application(功能)
每一层的本质: Driver = 硬件能力的封装接口 Middleware = 多个底层组件组装出的能力(子系统) RTOS = 运行时框架(控制权交给调度器) Application= 产品真正的功能(Service/Control/Algorithm)
没有 RTOS 时 main 承担组装和控制流—— 与服务器 Server、游戏 GameApplication 是同一件事
与服务器对比: 单片机多一层 Hardware + 可能有的 RTOS 其余分层(驱动接口 → 中间件/协议 → 业务)结构相同
|
嵌入式的分层 = 硬件能力逐层变成应用能力;Driver 是接口,RTOS 是框架,Middleware 是子系统,Application 是功能。 这是拆解与组织原则在嵌入式领域的完整案例——它验证了「接口化/框架化/子系统/组装」这套概念不依赖操作系统,在裸机上也成立。