如何在嵌入式中使用设计模式的思想?

💡 原文中文,约11900字,阅读约需29分钟。
📝

内容提要

嵌入式系统在AIOT时代面临转型,代码可复用性和可移植性成为重要考量。设计模式可解决相似问题,不同语言都可实现。嵌入式设备常采用观察者模式,实现一对多的依赖关系。嵌入式裸机低功耗框架通过观察者模式实现设备唤醒和睡眠。职责链模式可按顺序处理任务,裸机实现较复杂。通过任务节点和责任链实现顺序延时任务。设计模式参考:Head First设计模式、人人都懂设计模式、设计模式之禅。

🔎

延伸解读

设计模式在嵌入式中的适用边界

文章强调设计模式与语言无关,C语言同样可以实现,但并非所有问题都适合套用模式。嵌入式开发中,简单直接的处理有时更有效,盲目追求模式反而可能增加复杂度。作者建议在没有合适模式时,尽量满足开闭原则等设计原则。这提醒读者:模式是解决特定问题的工具,而非目标本身,需结合资源限制和实际场景权衡。

观察者模式如何支撑低功耗管理

文章以裸机低功耗框架为例,展示观察者模式如何管理外设的睡眠与唤醒。PM模块通过注册接口收集各外设的睡眠条件,当所有条件满足时统一进入睡眠,唤醒后依次恢复。这种一对多依赖关系让新增外设只需实现接口并注册,无需修改核心逻辑。同时,条件字段的划分还支持系统部分睡眠,便于调试和模块化维护。

职责链模式在裸机顺序任务中的取舍

对于需要严格按顺序执行的任务,系统环境下可用阻塞延时简化实现,但裸机为保证实时性,常需状态机配合定时器,导致逻辑分散、耦合度高。文章引入职责链模式,将任务抽象为节点,每个节点携带超时、延时、重试等属性,通过内存池动态管理节点,从而简化应用层实现。不过,这种方案也增加了框架本身的复杂度,适合任务种类多但单次执行节点有限的场景。

❓

Q&A

嵌入式开发主要用C语言,也能用设计模式吗?

可以。设计模式与编程语言无关,它是解决某类相似问题的有效方法。Java能实现,C语言同样能实现。C程序员也会遇到需要用模式处理的问题,因此学习设计模式很有必要。

在嵌入式裸机低功耗框架中,观察者模式是怎么用的?

通过观察者模式实现一对多依赖:主题对象提供注册接口,各外设作为观察者注册到主题列表。当系统状态改变(如满足睡眠条件)时,主题依次通知所有观察者,调用其处理函数执行休眠或唤醒操作。观察者还可设置条件决定是否接收通知。

裸机环境下实现顺序延时任务为什么复杂?职责链模式如何简化?

裸机为保证实时性不能用阻塞延时,通常用状态机加定时器实现,导致单个任务处理分散在多个函数中,修改移植不便。职责链模式将任务抽象为节点,每个节点有超时、延时、重试等属性,串成链后依次执行,结果分为OK、BUSY、ERROR,简化了应用层实现,用户只需实现节点处理函数并添加节点即可。

职责链模式中节点内存池的作用是什么?

实际中责任链条数和单链节点数有限但种类多,若全部静态定义节点会消耗大量内存。因此使用内存池动态分配:初始化时所有节点加入free_list,申请时从free_list取出加入used_list并接入责任链,节点执行完后自动回收(从链和used_list删除,重新加入free_list),节省内存资源。

嵌入式PM电源管理模块如何实现部分睡眠和方便调试?

PM可单独形成模块,外设通过实现init/deinit接口并注册到PM列表。每个外设提供condition字段,PM循环检查所有条件,当全部满足时进入睡眠,唤醒后重新初始化。通过条件字段划分,可实现系统部分睡眠;同时可打印当前未满足睡眠条件的模块,方便调试。

使用设计模式时需要注意哪些陷阱?

设计模式是针对特定类问题的有效解决办法,并非所有问题都能匹配到对应模式。不能一味追求设计模式,有时简单直接的处理反而更有效。若没有合适的模式,可尽量满足一些设计原则,如开闭原则(对扩展开放,对修改关闭)。

🏷️

标签

➡️

继续阅读