59 状态机内存优化:从KB到Byte的极致压缩
上篇我们刚把状态机查找从O(n)干到了O(1),性能是上去了,但有个老哥在项目群里哭诉:“性能倒是没问题了,可我的状态机光状态表就吃了12KB RAM,MCU总共才64KB,这还让不让人活了?”
他用的是一块Cortex-M0+的芯片,跑一个简单的BMS(电池管理系统)状态机,状态数不过30个,事件20个,却因为每个状态节点都塞了函数指针、上下文指针、调试字符串,活生生把内存撑爆了。
你可能会说:“不就是个状态机吗?能有多大?”我告诉你,如果你用常规的面向对象写法,一个状态节点结构体至少20字节,30个状态就是600字节,看着不多对吧?
但问题是,实际项目中状态机往往是嵌套的、并行的,一个ECU里可能同时跑着十几个状态机——通信协议栈一个、诊断一个、应用层一个、安全监控一个……加起来轻轻松松破10KB。在资源受限的MCU上,这简直是“内存刺客”。
今天我们就来解决这个问题,目标是把每个状态的内存占用从几十字节压缩到几个比特。没错,比特级优化,就像在针尖上跳舞。
痛点拆解:那些“内存杀手”写法
先看看常见的错误实现长什么样。很多初学者甚至老手都爱这么写:
# 反例:内存密集型状态节点classStateNode