亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial Internet of Things >> 嵌入式

与现代传感器接口:轮询 ADC 驱动程序

在上一篇文章中,我们研究了开发人员应该如何在现代嵌入式应用程序中创建一个接口,将低级驱动程序实现细节与应用程序代码分离。该接口提供了一种架构抽象,通过减少对硬件的依赖来提高应用程序代码的可伸缩性和可移植性。

现在,我们将开始研究开发人员可以基于我们在微控制器的 3 种驱动器设计技术中讨论的技术来实现 ADC 驱动器的几种不同方式。在本文中,我们将更详细地研究如何使用轮询技术,并讨论阻塞和非阻塞驱动程序之间的区别。

屏蔽还是不屏蔽,这是个问题

在为微控制器开发任何驱动程序时,开发人员必须决定他们的驱动程序是阻塞的还是非阻塞的。阻塞驱动程序本质上会停止代码执行,直到驱动程序完成其任务。例如,映射到 UART 的 printf 的典型实现是阻塞。

当您拨打以下电话时:

printf(“你好世界!”);

开发人员知道,在整个“Hello World!”之前,该语句后面的任何代码行都不会执行。声明已打印出UART。 “你好世界!”包含 12 个字节,96 位,但语句阻塞的时间量取决于 UART 波特率。对于配置为 1 Mbps 的 UART,您需要大约 96 微秒。对于配置为 9600 bps 的 UART,您需要大约 10,000 微秒!这是一个很大的差异,具体取决于硬件的配置方式,如果将 UART 驱动程序配置为阻塞驱动程序,它会显着影响程序执行。

非阻塞驱动程序是在驱动程序完成其任务时不会停止程序执行的驱动程序。例如,可以配置 printf 和上一个示例中的 UART 驱动程序,使其不会阻塞,而是允许应用程序在每个字节从 UART 传输出去时继续执行。这可以在适当的情况下提高应用程序的效率,但需要额外的设置,例如使用中断、DMA 或至少一个传输缓冲区。

决定设计驱动程序的方式取决于您的应用程序和硬件。例如,如果 UART 配置为 1 Mbps,则从效率的角度来看,编写非阻塞驱动程序可能不会获得太多收益,并且实际上可能会导致比通过额外的程序复杂性修复的问题更多的问题。但是,如果应用程序调用 9600 bps,其中应用程序代码被阻塞 10 毫秒,那么拥有非阻塞驱动程序可以显着提高程序效率,并且额外的时序复杂性问题的风险会小得多且更易于管理。

嵌入式 ADC 驱动器概述

需要注意的是,在一篇博客中,我无法完成编写完整 ADC 驱动程序所需的所有步骤。我可以很容易地在上面写一篇 20 页的论文,或者举办一个完整的网络研讨会,它可能仍然不会涵盖所有细节,但我们至少可以看看其中的一些核心部分。

我们可以通过多种方式组织 ADC 驱动程序,但我喜欢的组织方式需要三个组件:

低级驱动程序在初始化期间获取配置模块,并根据配置设置硬件。低级驱动程序提供了一个通用的硬件抽象层 (HAL),然后应用程序代码可以使用它。 ADC HAL 调用应该是通用的,以便高级应用程序可以以任何必要的方式配置硬件,并且可以重用和可扩展。例如,我过去使用过的一些 ADC HAL 调用包括:

前三个 API 提供初始化 ADC 硬件、启动转换然后检查转换状态的功能。最后三个功能旨在允许对低级硬件进行可扩展性。例如,如果 HAL 不提供应用程序所需的选项,例如转换单个 ADC 通道,则可以使用 Adc_RegisterRead 和 Adc_RegisterWrite 函数扩展 HAL。这提供了基于应用程序需求的灵活性,而不会创建过多的 API。

编写一个简单的阻塞 ADC 驱动程序

我们可以在硬件层之上编写一个非常简单的 ADC 驱动程序。例如,我们可以创建一个名为 Adc_Sample 的简单函数,它启动 ADC 硬件,然后将所有结果存储在应用程序可以访问的缓冲区中。存储模拟值计数值的缓冲区不一定只需要存储单个值,而是可以存储多个值,这些值以后可以根据应用需要进行平均或过滤。采样函数的阻塞版本可能如下所示:

正如您在这段代码中看到的,while 循环会阻止执行,直到 ADC 硬件完成其转换,然后将值存储在应用程序缓冲区中。

编写一个简单的非阻塞 ADC 驱动程序

将阻塞驱动程序转换为非阻塞代码非常简单,但需要更改更高级别的应用程序代码。例如,现在,如果应用程序想要对传感器进行采样,开发人员会调用:

Adc_Sample();

在非阻塞版本中,开发人员必须检查 Adc_Sample 的返回值,以查看样本是否已完成并可以使用。这允许示例在后台运行,应用程序代码继续运行,并对我们的驱动程序代码进行以下更新:

结论

正如我们在这篇文章中看到的,有多种编写 ADC 的方法,根据我们的需要,实现可以是阻塞的,也可以是非阻塞的。阻塞驱动程序往往比非阻塞驱动程序更简单、更不完整,但它们可能效率低下。非阻塞驱动程序允许其他代码在驱动程序工作时运行,但应用程序代码仍然需要检查状态,这本身在轮询实现中效率低下。

在本系列的下一篇文章中,我们将研究如何编写应用程序,通过使用中断的 ADC 外设对传感器进行采样。


嵌入式

  1. 传感器类型及其电路图
  2. 具有应用程序的模拟和数字传感器的类型
  3. Bulgin:采用新型超薄光电传感器的经济高效的 IIoT 解决方案
  4. ams 以创新演示点亮 2019 年传感器博览会
  5. DATA MODUL 扩展了更大尺寸的触摸传感器产品组合
  6. Contrinex:云就绪智能传感器和带蓝牙接口的安全光幕
  7. 集成驱动器简化了步进电机设计
  8. 使用真实传感器控制效果
  9. 使用一个 GPIO 引脚读取模拟传感器
  10. 将 HC-SR501 PIR 运动传感器与 Raspberry Pi 连接
  11. 使用物联网传感器改进空气污染监测
  12. 使用输送机解决工程卡车司机短缺问题