【CANdelaStudio-从入门到深入到实战】06 诊断会话状态机——从“默认会话”到“编程会话”的优雅切换
开篇故事:一次“死锁”的ECU,让我在客户面前丢了脸
还记得几年前,我陪一位客户做OEM的“会话一致性测试”。测试用例很简单:从默认会话(Default Session)切换到编程会话(Programming Session),刷写一段固件,再切回默认会话。
我自信满满地按下测试按钮,结果ECU直接“死”了——诊断仪发任何请求都不响应,只能断电重启。
客户工程师皱着眉头问我:“你们的状态机是不是没做超时保护?”我翻看代码,发现状态切换时,我直接调用了SessionManager.SwitchTo(ProgrammingSession),但忘了释放上一个会话占用的DMA通道。
编程会话启动时,DMA资源被上一个会话锁死,导致ECU内部死锁。
这个教训让我明白:诊断会话管理,绝不只是切换一个枚举值。它涉及到资源分配、优先级仲裁、超时保护,以及最容易被忽视的——会话之间的“优雅过渡”。
今天,我就把那次踩坑后总结的会话状态机设计思路,完整讲给你听。
痛点拆解:那些看似“正确”的切换,其实全是坑
常见错误1:直接替换会话对象,不做资源清理
很多初学者会这样写:
classSessionManager