保持微控制器外设驱动独立

Keep Microcontroller Peripheral Drivers Independent

这是我一直在问自己的问题。我已经尝试找到关于此的好读物,但我似乎无法找到适合我认为事情应该如何的解决方案。

我认为出于可移植性和维护的原因,驱动程序最好不要相互依赖。但是,有时一个驱动程序可能需要另一个驱动程序提供的功能。例如,I²C 总线可能有超时,这取决于定时器驱动程序。

到目前为止,我一直这样做的方法是简单地将驱动程序#include'ing 到其他驱动程序中,但这不是理想的解决方案。我觉得应该有更好的方法来做到这一点。

我正在考虑添加另一层,这是主应用程序和所有驱动程序之间的一种抽象。然而,这感觉就像把问题转移到别处而不是解决问题。

我用过函数指针,但这也让维护变得很麻烦。

关于驱动程序的相互依赖性以及如何巧妙地解决这样的问题,是否有任何好的来源或想法?

在大控制器上,CortexM3/4之类的,有无数层完全没问题。例如,LPC1822 的 SD 卡接口包含一个 "sdif" 驱动程序,处理卡接口的基本通信和引脚切换。最重要的是 "sdmmc" 驱动程序,提供更复杂的功能。最重要的是这个可能是 FAT 系统(使用实时时钟),等等......

相反,在微型 8 位控制器上,最好完全没有层。您必须为 i2c 通信设置的那 3 个寄存器是可管理的。不要为了一些微不足道的事情而写上百行代码。在那种情况下,将定时器直接包含在 I2C 例程中是完全可以的。如果您想让您的同事更容易理解您的程序,请花时间编写好的评论和文档,而不是将所有内容封装在函数和抽象层中。

当您受到资源限制并且您的程序又不是那么大时,不要为了获得一致的层而给自己带来太多开销。图层适用于大型复杂软件。在嵌入式计算中,有时最好保持横向依赖关系,而不是编写不适合闪存的庞大库 space。