首页 > 解决方案 > 通信独立的 C 模块

问题描述

我在业余爱好项目中为通过 SPI 连接到 Arduino 板的外部 CAN 驱动器 IC 实现了一个库。当我开始在连接到 CAN 网络的其他 ECU 中工作时,我意识到我的方法不够灵活,需要进行重构以提供更通用的解决方案,以便我可以在具有不同 CAN 的其他 ECU 中重用相同的架构司机。

此时,我的 CAN 驱动程序库实现直接管理与 IC 的 SPI 通信,以便配置过滤器和读/写 CAN 帧。与 IC 通信的顺序如下所示:

[Cyclical tasks] -> [CanDrv.h] -> [SPI.h] -> [CAN driver IC]

这种方法有两个问题:

  1. CanDrv.h 的实现需要 SPI,因此在不同的板上它应适应不同的 SPI 接口。
  2. 与系统其余部分的接口取决于 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 模块之间的“桥梁”。我读了一些关于回调函数的东西,但我不确定这是否是最好的方法,无论如何我不知道如何实现它。

有人可以就这种方法给我建议吗?还有其他方法可以使我的代码更灵活吗?

谢谢

标签: ccallbackarchitecturespican-bus

解决方案


推荐阅读