c - 通信独立的 C 模块
问题描述
我在业余爱好项目中为通过 SPI 连接到 Arduino 板的外部 CAN 驱动器 IC 实现了一个库。当我开始在连接到 CAN 网络的其他 ECU 中工作时,我意识到我的方法不够灵活,需要进行重构以提供更通用的解决方案,以便我可以在具有不同 CAN 的其他 ECU 中重用相同的架构司机。
此时,我的 CAN 驱动程序库实现直接管理与 IC 的 SPI 通信,以便配置过滤器和读/写 CAN 帧。与 IC 通信的顺序如下所示:
[Cyclical tasks] -> [CanDrv.h] -> [SPI.h] -> [CAN driver IC]
这种方法有两个问题:
- CanDrv.h 的实现需要 SPI,因此在不同的板上它应适应不同的 SPI 接口。
- 与系统其余部分的接口取决于 IC,因此如果我更改 CAN 驱动器 IC(以及因此 CanDrv 模块),我应该重新编写所有调用它的模块。
我的想法是定义一个通用 CAN 接口模块,它使用 Candrv.h 中的服务并处理 SPI 通信,因此上游系统将独立于 IC 并且 CanDrv.h 实现不依赖于 SPI 接口:
[Cyclical tasks] -> [CanIf.h] -> [SPI.h] -> [CAN driver IC]
^
[CanDrv.h]
现在的问题是我如何实现 CanIf 以便它可以充当 CanDrv 和 SPI 模块之间的“桥梁”。我读了一些关于回调函数的东西,但我不确定这是否是最好的方法,无论如何我不知道如何实现它。
有人可以就这种方法给我建议吗?还有其他方法可以使我的代码更灵活吗?
谢谢
解决方案
推荐阅读
- math - Unscented Kalman 滤波器线性非自变量
- azure - sw-description 中“adu-swupdate.sh”所需的功能“postinstall”不存在
- vue.js - 英雄图标没有出现在 TailwindUI 的 chrome 中,但在 Firefox 中出现损坏
- c# - Razor-pages 智能面包屑
- java - openJDK13:Java AppCDS(应用程序类数据共享)jsa生成classPath和JVM调用classpath应该完全一样?
- autodesk-forge - Forge 升级 Revit 文件
- vue.js - 通过 vue.js 使用私人 Paypal
- node.js - 如何从不同集合中的 Firestore 中删除文档
- c++ - 如何对类声明进行字符串化并定义它?
- for-loop - 如果href在selenium python中只有https,如何请求