与现代传感器接口:接口设计

网友投稿 283 2022-10-25

与现代传感器接口:接口设计

创建接口的好处

使用面向对象语言的开发人员自然会理解接口可以为应用程序提供的好处,但大多数嵌入式系统仍然使用 C 编写,因此这些开发人员可能会忽略这些好处。在嵌入式系统中创建与 I/O 设备交互的接口有很多好处,例如:

反转代码依赖方向增强便携性抽象的复杂性和低级细节提高重用性和可扩展性简化软件维护

例如,花点时间看一下下图:

传感器接口中的抽象(来源:Jacob Beningo)

在此示例中,应用程序通过传感器 API 进行调用,并使用其操作之一与传感器进行交互。应用程序不知道 Sensor API 的幕后发生了什么,它可能有函数调用,例如:

该传感器接口可能正在直接调用 ADC 外围设备,或者它可能正在创建从通信外围设备发送出去的消息包。界面的好处是应用程序开发人员不需要知道这些细节。(事实上​​,接口层可能只是取消对已配置为指向正确模块以处理传感器通信的函数指针的引用!这在我们的 C 应用程序中提供了一种简单的继承形式。)

设计传感器接口

有兴趣创建良好、可重复使用的传感器接口的开发人员应该遵循几个步骤。这些步骤有助于确保界面在第一次交互时尽可能可用,即使在界面完全稳定之前可能需要多次迭代。

第一步是确定将在您将设计的嵌入式系统中使用的传感器类型,然后检查数据表。在此步骤中,您希望熟悉所有不同传感器类型之间共有的操作和数据,以及哪些不常见。您会发现,即使跨不同类型的传感器,操作和数据之间也始终存在共性。我们希望将这种共性构建到界面中。我们将不常见的操作和数据构建到该接口的扩展中,这允许我们根据正在开发的应用程序添加和删除这些功能。

接下来,一旦我们确定了操作和数据,我们就可以用 C 语言勾勒出一个可以满足我们传感器需求的接口。该接口的复杂性完全取决于开发人员。例如,我们可以设计一个简单的基于函数调用的接口,其中函数原型可能如下所示:

bool Sensor_Init(const SensorConfig_t * const Config); bool Sensor_Read(const SensorObj_t * const, SensorData_t * const SensorData); bool Sensor_Write(const SensorObj_t * const, SensorData_t * const SensorData);

在这种情况下,对接口的任何调用都会返回一个布尔值,该布尔值提供有关操作结果的信息。例如,我们可能会调用Sensor_Read,如果底层实现是轮询设备以获取传感器数据就绪,那么如果没有新数据,我们可能会返回 false。如果数据可用,则可能会将其复制到提供给接口的SensorData位置并返回 true。(我们当然可以变得更复杂并创建错误代码和其他返回值,但我们应该从简单开始)。

该接口可用于与任意数量的传感器进行交互,我们只需将SensorObj信息传递给接口,然后让接口完成我们需要完成的操作即可。我们也可以将其用作模板并为传感器名称重命名Sensor,尽管这开始最小化抽象的有用性和可重用性。

我们可以设计接口的最后一种有趣的方式是成为函数指针的结构。然后,开发人员将实例化该结构并使用与他们想要连接的传感器相关的特定函数调用对其进行初始化。此实现可能如下所示:

typedef struct { bool ( Init)(const SensorConfig_t * const Config); bool ( Read)(const SensorObj_t * const, SensorData_t * const SensorData); bool (*Write)(const SensorObj_t * const, SensorData_t * const SensorData); } 传感器_t;

然后,我们可以通过简单地创建和初始化这个结构来为多个传感器使用相同的接口,例如:

调用传感器的接口然后看起来像:

模拟.Init(AdcConfig); Gryo.Init(GyroConfig);

正如你所看到的,这种类型的接口是非常可扩展和可重用的。这可能会让一些开发人员感到紧张,因为它确实使用了函数指针。必须注意确保这些函数指针正常运行。

结论

将传感器连接到嵌入式系统时,自然的本能是检查该传感器,然后开始为其编写驱动程序。不幸的是,这导致软件紧密耦合并且不具有可扩展或可重用的优点。正如我们在这篇文章中所看到的,我们应该首先关注我们的软件架构以及我们的传感器如何适应该架构。然后我们可以开发一个接口来抽象出我们传感器的细节,这样应用程序就不会意识到复杂性或低级细节。这样一来,如果在设计周期后期发现传感器不适合应用程序,则可以轻松更换传感器,而无需修改核心应用程序代码。

审核编辑 黄昊宇

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Docker中容器的备份和恢复(可迁移)
下一篇:M.2硬盘接口与PCI-E硬盘接口的区别是什么
相关文章

 发表评论

暂时没有评论,来抢沙发吧~