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