在嵌入式系统(如 STM32 + RT-Thread、AUTOSAR)或驱动框架设计中,常见的软件架构设计模式包括以下几种形式,每种结构适用于不同场景,如驱动解耦、应用扩展、模块隔离等:
✅ 常用架构设计模式(适用于嵌入式 / AUTOSAR / OS)
架构模式 | 中文名称 | 典型应用场景 | 特点 |
---|---|---|---|
分层架构(Layered Architecture) | 分层结构 | 操作系统、驱动、协议栈 | 解耦明确、逻辑清晰、易维护 |
插件架构(Plug-in / Component) | 插件组件结构 | AUTOSAR SWC、RT-Thread drv | 动态注册、易扩展 |
总线驱动模型(Bus-Driver-Device) | 总线-驱动-设备模型 | Linux、RT-Thread 驱动 | 多种硬件共用接口、驱动分离 |
客户端-服务端(Client-Server) | 客户端-服务端 | AUTOSAR RTE、IPC | 通信解耦、适合分布式 |
发布-订阅(Pub/Sub) | 发布订阅机制 | ROS、RT-Thread EventBus | 多对多通信、松耦合 |
消息队列/事件驱动(Message/Event Driven) | 事件驱动结构 | GUI、USB、RTOS任务间通信 | 实时响应、低耦合 |
有限状态机(FSM) | 状态机结构 | GUI状态、协议栈 | 适合状态转换多的逻辑 |
🧱 1. 分层架构(Layered)
+--------------------+ ← 用户应用层(App)
| 应用层(GUI/APP) |
+--------------------+ ← 接口服务(API)
| 中间件/驱动抽象层 |
+--------------------+ ← HAL/BSP层
| 硬件控制/驱动层 |
+--------------------+ ← 硬件设备
| 外设寄存器 |
适用于:RT-Thread、STM32 HAL、AUTOSAR Basic Software。
🔌 2. 插件架构 / 组件化驱动框架(如 RT-Thread)
// 注册驱动(initcall)
init_driver(lcd_ili9341_driver);
init_driver(lcd_st7735_driver);
// 通过名字查找
device = rt_device_find("lcd0");
rt_device_open(device, ...);
优点:
- 便于动态扩展设备类型;
- 不同驱动可组合插拔。
🚌 3. 总线/驱动/设备模型(Linux, RT-Thread)
bus: SPI
├── driver: w25qxx
│ └── device: w25q64
├── driver: ili9341
│ └── device: ili9341@spi1
优势:
- 支持同一总线上多个设备;
- 驱动和设备分离;
- 动态绑定关系。
🔄 4. 发布-订阅(Pub/Sub)
publish("event_key", data);
subscribe("event_key", callback);
用于:
- 多任务间解耦;
- GUI、传感器框架;
- RT-Thread EventBus 等。
📡 5. AUTOSAR 架构层次(参考)
+----------------------+ ← Application SWC
| SWC (Runnable) |
+----------------------+
| RTE (Runtime Env) | ← 虚拟接口连接
+----------------------+
| Basic Software (BSW) |
| - COM, CAN, DCM... |
+----------------------+
| MCAL |
+----------------------+
| ECU HW |
✅ 小结:不同系统推荐架构
场景 / 系统 | 推荐结构 |
---|---|
RT-Thread 驱动框架 | 分层 + 插件 + 总线模型 |
Linux 驱动 | 总线-设备-驱动三层模型 |
AUTOSAR | 应用/RTE/BSW/MCAL 四层 |
小型裸机项目 | 分层 + 状态机 |
用于**绘制调用流程图(调用关系图、调用时序图、控制流程图)**的工具很多,以下是常用工具的对比和推荐,适用于 AUTOSAR、RT-Thread、裸机驱动、应用层设计 等软件开发场景:
✅ 常用流程图 / 调用图 工具推荐
工具名称 | 类型 | 适合场景 | 特点 |
---|---|---|---|
PlantUML | 代码式 | 时序图、调用图、组件图 | 脚本描述,自动生成图,支持 Git |
Mermaid.js(VSCode 支持) | 代码式 | 调用图、流程图、状态图 | VSCode 原生支持,语法简单 |
Draw.io / diagrams.net | 图形界面 | 任意流程图/架构图 | 免费、直观拖拽、可导出 |
Graphviz / DOT | 代码式 | 调用关系图、依赖图 | 专注于图论、层级图布局清晰 |
SequenceDiagram.org | 在线工具 | 时序图 | 无需安装,快速出图 |
Lucidchart / ProcessOn | 云端图形 | 协作流程图/系统架构图 | 多人协作,适合团队 |
Doxygen + Graphviz | 自动生成 | 从代码中提取调用关系图 | 适合已有代码的分析整理 |
VSCode 插件:Markdown Preview Mermaid Support | 插件 | 结合文档与图示 | 适合写项目说明书时嵌入图 |
💡 示例对比
1. Mermaid 示例(VSCode 支持)
可用于 AUTOSAR SWC 初始化流程、RT-Thread 驱动注册流程等。
2. PlantUML 示例
@startuml
actor User
User -> App : start()
App -> Driver : init()
Driver -> Hardware : write_register()
@enduml
适用于驱动调用流程、API 调用关系图。
3. Draw.io 示例图类型
- 控制流程图(例如
if / switch
) - 模块依赖图(例如 RT-Thread 的驱动框架)
- 网络通信图(CAN/LIN/SOME/IP)
4. Doxygen + Graphviz
在代码中加注释,自动生成调用图:
/*! \brief 初始化接口
* \callgraph
*/
void lcd_driver_init(void);
用 doxygen
生成调用图和被调用图,适合整理大型项目。
📌 建议搭配
如果你… | 推荐工具 |
---|---|
使用 VSCode 写文档 / 画图 | Mermaid 插件 |
喜欢脚本画图、自动化 | PlantUML / Graphviz |
想写注释自动生成调用图 | Doxygen + Graphviz |
团队协作、可视化 | Draw.io / ProcessOn |
快速画几个交互 | SequenceDiagram.org |