• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

wb-code

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

嵌入式组件及其一些思考

嵌入式开发中常用的软件组件/设计模式有哪些?
嵌入式开发中常用的软件组件和设计模式非常丰富,以下是系统性的分类总结:

一、核心数据结构组件

环形缓冲区 (Ring Buffer/Circular Buffer)

  • 串口通信数据缓存

  • 日志系统缓存

  • 音频数据处理

** 队列 (Queue)**

  • 消息队列:任务间通信

  • FIFO数据缓冲

** 链表 (Linked List)**

  • 动态管理任务列表

  • 设备链表管理

位图 (Bitmap)

  • 内存管理

  • 资源分配标记

二、通信与同步机制

生产者-消费者模式

  • 数据采集与处理分离

  • 中断服务例程(ISR)与主循环通信

观察者模式

  • 事件通知系统

  • 传感器数据更新通知

发布-订阅模式

  • 模块间解耦通信

  • 系统事件广播

三、实时系统模式

** 时间片轮转调度**

  • 简单任务调度

  • 协作式多任务

状态机 (Finite State Machine)

  • 分层状态机 (HFSM)

  • 状态模式实现

  • 应用:协议解析、设备控制流程

看门狗模式 (Watchdog)

  • 硬件看门狗

  • 软件看门狗任务

四、驱动与硬件抽象

硬件抽象层 (HAL)

typedef struct {
    void (*init)(void);
    void (*set)(uint8_t state);
    uint8_t (*read)(void);
} GPIO_Driver;

设备驱动模型

  • 字符设备驱动

  • 块设备驱动
    适配器模式 (Adapter)

  • 不同传感器接口统一

  • 通信协议转换

五、内存管理组件

内存池 (Memory Pool)

  • 固定大小内存块分配

  • 避免内存碎片
    静态分配模式

  • 编译时确定资源

  • 确定性内存使用
    ** 双缓冲 (Double Buffer)**

  • 显示刷新

  • 数据采集处理分离

六、通信协议栈

协议栈分层设计

  • 物理层 → 数据链路层 → 应用层

  • 如:LWIP TCP/IP栈

命令解析器

  • AT指令解析

  • Modbus协议实现

七、调试与监控组件
日志系统

  • 分级日志(ERROR, WARN, INFO, DEBUG)

  • 环形缓冲区存储

  • 支持多种输出(串口、Flash、网络)

系统监控

  • CPU使用率统计

  • 栈使用量检测

  • 任务运行时间统计

Shell/CLI接口

  • letter-shell

  • pymodbus

  • 自定义命令系统

八、安全与可靠性模式

数据校验

  • CRC校验

  • 和校验

  • 数据回读验证
    超时重试机制

  • 通信超时处理

  • 操作重试策略

安全启动

  • 固件签名验证

  • 启动完整性检查

九、电源管理

低功耗模式

  • 休眠-唤醒机制

  • 外设时钟门控

事件驱动设计

  • 中断唤醒系统

  • 减少轮询

十、固件架构模式

前后台系统

  • 中断(前台)+ 主循环(后台)

  • 简单嵌入式系统常用

RTOS应用模式

  • 任务划分模式

  • 按功能划分任务

  • 按实时性要求划分

IPC通信模式

  • 消息队列

  • 信号量、互斥锁

  • 事件标志组

模块化设计

// 示例:模块接口定义
typedef struct {
    const char *name;
    int (*init)(void);
    int (*process)(void);
    int (*deinit)(void);
} Module_t;

十一、更新与维护
Bootloader设计

  • 双区备份

  • 安全固件更新

DFU模式

  • 通过串口/USB更新

  • OTA无线更新

十二、测试相关

硬件在环 (HIL)

  • 模拟器接口

  • 测试桩 (Stub)

模拟外设

  • 软件模拟SPI/I2C设备

  • 虚拟传感器数据

实际项目中的典型组合:

// 典型嵌入式系统架构示例
App_Tasks (应用层)
├── 状态机模块 (HFSM)
├── 通信协议栈 (分层设计)
├── 数据采集 (生产者-消费者)
└── 用户接口 (命令模式)

Middleware (中间件)
├── 日志系统 (环形缓冲区)
├── 文件系统 (适配器模式)
├── 网络协议栈 (分层)
└── Shell接口

Drivers (驱动层)
├── HAL硬件抽象
├── 设备驱动模型
└── 中断管理 (观察者)

RTOS/Kernel (内核)
├── 任务调度
├── 内存管理 (内存池)
├── IPC通信
└── 时间管理

选择原则:

  1. 资源约束优先:根据RAM/Flash大小选择

  2. 实时性要求:硬实时 vs 软实时

  3. 可维护性:项目规模和团队结构

  4. 可移植性:硬件平台变化考虑

  5. 安全性:工业/医疗等高要求领域

这些模式和组件是嵌入式开发的核心工具箱,熟练运用能极大提高代码质量和开发效率。

可以理解成这些组件存在的初衷是为了使开发更加高效吗?还是这其中有更多其他的考虑.
高效开发确实是重要目标,但绝不是唯一甚至不是最主要的目标。嵌入式系统的特殊性决定了这些组件/模式有更深层的存在意义:

  1. 资源极度受限(比开发效率更重要)
// 对比:通用计算机 vs 嵌入式系统
通用计算机:    嵌入式系统:
RAM: 8-16 GB    RAM: 2-256 KB     // 差1000倍!
Flash: 512 GB   Flash: 64-512 KB  // 差100000倍!
CPU: 多核GHz    CPU: 单核<100 MHz // 差10-100倍
  • 环形缓冲区:不是为了“高效”,而是为了在固定内存下工作

  • 静态内存分配:避免动态内存的碎片和不确定性

  • 内存池:在有限RAM中提供可预测的内存使用

  1. 实时性要求(生死攸关)
医疗设备:心跳监测必须在10ms内响应
汽车ABS:刹车指令必须在5ms内执行
工业控制:电机控制环周期必须稳定在1ms
  • 状态机:提供确定性的执行时间

  • RTOS调度:保证关键任务的截止时间

  • 中断驱动:响应时间可预测

  1. 可靠性要求(失效成本极高)
// 飞机飞控 vs 手机APP
手机APP崩溃:    重启应用,用户抱怨
飞机飞控崩溃:   数百人生命安全受威胁
工业机器人故障: 生产线停工,每小时损失数万
医疗设备故障:   可能直接危及生命
  • 看门狗:不是高效,而是防止系统死锁

  • 数据校验:不是高效,而是确保数据完整

  • 双区备份:固件更新失败时能回滚

二、物理世界的约束

  1. 确定性优先于灵活性
桌面应用:    "先实现功能,再优化性能"
嵌入式系统: "先确保实时性,再实现功能"
  • 编译时决策 > 运行时决策

  • 静态配置 > 动态配置

  • 可预测性 > 灵活性

  1. 物理接口的局限性
// 现实约束示例
1. 串口通信:115200波特率 = 约11.5KB/s
   → 必须使用缓冲,但不是为了高效,而是不丢数据

2. 传感器采样:100Hz采样率
   → 必须在10ms内处理完,否则数据积压

3. 电池供电:仅100mAh
   → 低功耗设计不是"优化",是"必需"

三、开发范式的本质差异

  1. 硬件-软件协同设计
通用软件开发:  抽象硬件,假设无限资源
嵌入式开发:   直面硬件,精心管理每Byte每Cycle
  1. 设计哲学对比
    图片

四、具体组件的真实考量

  1. Letter-Shell的真正价值
// 不是在产品中为了"高效开发"
// 而是在:
1. 开发阶段:调试没有显示器的系统
2. 产线测试:快速验证硬件功能
3. 现场维护:无需拆机连接JTAG
// 价值是:可调试性、可维护性
  1. Ring-Buffer的深层意义
# 不是"高效的数据结构选择"
# 而是解决:
1. 中断上下文限制:
   ISR必须极短 → 快速存数据到buffer → 主循环慢慢处理

2. 数据一致性:
   避免生产者和消费者同时访问冲突

3. 内存约束:
   预先分配固定大小,不动态申请

嵌入式开发是在多重严格约束下的最优解搜索问题,这些组件和模式是为了在:

  • 有限的资源(内存、CPU、功耗)

  • 严格的约束(实时性、可靠性、安全性)

  • 现实的条件(成本、尺寸、环境)
    中找到可行的解决方案。开发效率是重要商业考量,但技术上通常要让位于正确性、确定性和可靠性。

这也解释了为什么嵌入式开发者常常显得"保守"——因为在这个领域,"能工作"比"高效开发"更重要,"稳定"比"功能丰富"更重要,"可预测"比"灵活"更重要。

posted on 2025-12-29 23:00  心事不在脸上  阅读(18)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3