多核嵌入式开发里有一种容易产生误判的现象:共享变量放在 NonCached RAM,读写都是简单赋值,两边也都进入了 SchM Exclusive Area,但事件队列和业务状态仍可能不一致。
这里不需要先假设硬件缓存出错。更值得追问的是:
“事件已发布”与“事件对应的数据已就绪”,是不是同一个不可分割的状态转换?
本文以 AUTOSAR Classic COM 的一种 Deferred Rx + EventCache 实现为例,借助一个可构造的双核交错,讨论缓存可见性、原子性、内存顺序与跨核互斥之间的区别,以及事件驱动系统该怎样维护状态不变量。
文中的代码是根据实际函数关系抽象的示意性伪代码,不是 AUTOSAR 对所有 COM 实现的统一规定。具体项目还应遵循所使用组件的多核部署和并发访问约束。
原创大约 15 分钟