嵌入式传感器的接口:中断驱动的ADC驱动器

news2024/11/13 23:23:39

我们研究了如何编写阻塞的模数转换器(ADC)驱动程序和使用轮询技术不阻塞应用程序流的驱动程序。轮询外围设备的驱动程序效率很低,如果系统可能处于低功耗状态,它们可能会浪费宝贵的时钟周期,而这些时钟周期本来会被使用或浪费能量。开发人员可以实施ADC驱动程序的一种有效方法是使用中断来通知应用程序转换周期已经完成。在本文中,我们将研究如何做到这一点。

更新ADC驱动器采样功能

可以编写几种不同的方式来编写嵌入式ADC驱动程序以使用中断。在本文中,我们将研究如何修改上一篇文章中介绍的无阻塞嵌入式ADC驱动器。就像我们在那篇文章中所做的那样,应用程序可以通过调用函数Adc_Sample进行调用以启动ADC转换。

这是一个很好的示例,为什么拥有一个好的硬件抽象层(HAL)可以派上用场。无论是阻止,不阻止,轮询还是中断,我都会调用完全相同的函数,并且行为会根据驱动程序的配置设置而发生简单的变化,或者它可能基于以下原因链接到不同版本的Adc_Sample函数中:应用需求。

非阻塞系统的Adc_Sample函数如下所示:

在我们的新版本中,可能会实现类似于以下内容的Adc_Sample函数:

哇!所有代码都发生了什么?我们的非阻塞驱动程序具有各种检查和对缓冲区的访问等。对于基于中断的驱动程序,我们要做的只是启动在初始化期间配置的基于外设的ADC通道转换。因此,例如,如果我们要对通道0、1和3进行采样,则这些通道将是初始化期间启用的通道。该驱动程序旨在一次采样所有指定的通道,而不仅仅是采样一两个。正如我已经提到的,有很多方法可以做到这一点并帮助阐明概念,我们正在使用最简单的解决方案。

在这一点上,如果我们调用Adc_StartConversion,我们期望ADC外设对通道进行采样,但是当中断触发时,此时将不会发生任何事情。我们需要填充ADC中断处理程序,但是在驱动程序中这样做是有问题的。相反,如果可以的话,我们想尝试抽象中断处理程序代码。

抽象中断

开发人员在编写驱动程序时经常遇到的一个问题是,在开发中断驱动的解决方案时,他们通常会将中断紧密地耦合到应用程序代码。最佳地,中断将驻留在驱动程序代码中,该代码位于驱动程序层中,而不是位于体系结构中最高层的应用程序代码中。将中断与应用程序代码紧密耦合可能会导致难以移植代码,甚至在某些情况下很难扩展代码。

开发人员可用于将中断保留在驱动程序层中并仍为应用程序自定义中断的一种解决方案是使用回调。回调函数是对可执行代码的引用,该可执行代码作为参数传递给其他代码,这些代码允许较低级别的软件层调用较高级别的层中定义的函数[1]。最简单的回调函数只是作为参数传递给另一个函数的函数指针。在大多数情况下,回调将包含三部分:

回调函数

回调注册

回调执行

下图显示了这三个部分在典型的回调实现中如何协同工作:

图:典型的回调体系结构

如果您回想起上一个博客,则ADC驱动程序HAL包含以下功能:

如果您仔细看一下,该函数旨在通过嵌入式ADC驱动程序注册应用程序代码中的回调函数。第一个参数指定将向其分配回调的中断,而第二个参数通过将函数指针传递给函数来分配要调用的函数。

然后,低层驱动程序此时会将功能指针分配给指定的中断。这非常灵活,因为开发人员可以轻松更新和更改中断执行的功能,而不必回头修改和重新编译嵌入式ADC驱动程序。这有助于将应用程序代码与驱动程序代码分开,从而创建可扩展且灵活的解决方案。

有了这些知识,我们就可以实现ADC中断处理程序,使其类似于以下内容:

该中断仅是取消引用通过Adc_CallbackRegister()函数分配的指针。(请注意,在生产代码中,我还将添加一些检查以确保已分配了函数指针,但我想您知道了)。

编写中断处理程序

对于使用此方法的开发人员,中断处理程序将写在其应用程序层中,并且几乎可以具有他们喜欢的任何函数名。就我个人而言,我总是将其命名为Adc_InterruptCallback之类的名称,这样我就很容易知道它到底是什么。该回调的实现可能因应用程序而异。例如,在一个应用程序中,回调可能如下所示:

在此示例中,回调只是放置一个信号量以通知任务ADC数据可用。另一个示例可能如下所示:

如您所见,由开发人员决定他们要如何在中断处理程序中处理模拟数据,并且它会根据应用程序及其需求而有很大不同。

重要的是要注意,对于这些实际上是中断处理程序的回调函数,遵循中断处理程序最佳实践很重要。这意味着将代码最小化,并使它们尽可能快,以最大程度地减少对其余系统性能的影响。

结论

正如我们在本文中看到的,使用中断驱动的驱动器设计模式可以大大提高驱动器的效率。使用回调可以将中断实现保留在应用程序代码中,并通过驱动程序的回调机制分配给中断。这使解决方案和代码具有高度可重用性,灵活性和可扩展性。

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!(点击找小助理领取)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/801891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【体系认证】ISO27701 隐私信息管理体系

1 认证定义 ISO/IEC 27701 隐私信息管理体系是ISO国际标准化组织和IEC国际电工委员会联合发布的隐私信息管理体系国际标准,它是对SO27001信息安全管理体系的扩展,在全球普遍受到认可,且具国际权威性。 ISO/IEC27701通过对隐私保护的控制对…

【Lua学习笔记】Lua进阶——Table(3) 元表

接上文 文章目录 元表__tostring__call__index__newindex运算符元方法其它元表操作 元表 Q:为什么要使用元表? A:在Lua中,常常会需要表与表之间的操作。元表中提供了一些元方法,通过自定义元方法可以实现想要的功能&…

Linux Day03

一、基础命令(在Linux Day02基础上补充) 1.10 find find 搜索路径 -name 文件名 按文件名字搜索 find 搜索路径 -cmin -n 搜索过去n分钟内修改的文件 find 搜索路径 -ctime -n搜索过去n分钟内修改的文件 1)按文件名字 2)按时间 1.11 grep 在文件中过…

m1 docker安装tomcat

背景 看到有同事尝试使用docker搭建tomcat服务,然后用nginx实现服务的负载均衡,但是遇到了挂载的问题,于是我在我自己的mac上尝试了一下。 实践过程 在本地新建tomcat的目录,下方挂载对应的数据文件和脚本文件。 其中&#xff…

小皮面板新增一个新网页页面

复制到根目录下,根目录 这里查看根目录。 然后点创建网站,基本配置里写入域名,还要刚才的网页文件夹,即index所在文件夹,index就是网页页面。 网址就是:http://xxxx.com/xxxx/ 参考小皮面板官网文章 htt…

【STL】模拟实现反向迭代器

目录 1. 读源码 2. 搭建框架 3. 迭代器的操作 operator*() operator->() operator() operator--() operator!() 4. 实现 list 的反向迭代器 5. 实现 vector 的反向迭代器 6. 源码分享 写在最后: 1. 读源码 我们之前实现的 vector,list…

购物车功能实现(小兔鲜儿)【Vue3】

购物车 流程梳理和本地加入购物车实现 购物车业务逻辑梳理拆解 整个购物车的实现分为两个大分支, 本地购物车操作和接口购物车操作由于购物车数据的特殊性,采取Pinia管理购物车列表数据并添加持久化缓存 本地购物车 - 加入购物车实现 添加购物车 基础思想:如果…

力扣每日一题--2050. 并行课程 III(拓补排序例题)

题目描述: 给你一个整数 n ,表示有 n 节课,课程编号从 1 到 n 。同时给你一个二维整数数组 relations ,其中 r e l a t i o n s [ j ] [ p r e v C o u r s e j , n e x t C o u r s e j ] relations[j] [prevCoursej, nextCou…

【云原生】Docker容器命令监控+Prometheus监控平台

目录 1.常用命令监控 docker ps docker top docker stats 2.weave scope 1.下载 2.安装 3.访问查询即可 3.Prometheus监控平台 1.部署数据收集器cadvisor 2.部署Prometheus 3.部署可视化平台Gragana 4.进入后台控制台 1.常用命令监控 docker ps [rootlocalhost ~…

手把手教你怎么写顺序表

目录 一、顺序表有什么功能? 二、实现顺序表的各个功能 1.前置准备 2.初始化顺序表 3.顺序表扩容 4.打印顺序表 5.增加顺序表成员 5.1尾增 5.2头增 6.删除顺序表中成员的内容 6.1尾删 6.2头删 7.查找成员 8.修改(替换) 9.插入(在目标位置插入成员) 10.定…

Kong Ming Qi hdu7321

Problem - 7321 题目大意&#xff1a;在(n2)*(m2)的棋盘上&#xff0c;中间摆满了n*m个棋子&#xff0c;每个棋子可以向上下左右四个方向移动&#xff0c;对于相邻的三格&#xff0c;移动前后分别为 有 有 无->无 无 有&#xff0c;问最后棋盘上最少能剩下几个棋子 1<n…

论文解读|PF-Net:用于 3D 点云补全的点分形网络

原创 | 文 BFT机器人 01 背景 从激光雷达等设备中获取的点云往往有所缺失&#xff08;反光、遮挡等&#xff09;&#xff0c;这给点云的后续处理带来了一定的困难&#xff0c;也凸显出点云补全作为点云预处理方法的重要性。 点云补全&#xff08;Point Cloud Completion&#x…

Drools用户手册翻译——第四章 Drools规则引擎(七)规则执行模式和线程安全

甩锅声明&#xff1a;本人英语一般&#xff0c;翻译只是为了做个笔记&#xff0c;所以有翻译错误的地方&#xff0c;错就错了&#xff0c;如果你想给我纠正&#xff0c;就给我留言&#xff0c;我会改过来&#xff0c;如果懒得理我&#xff0c;就直接划过即可。 drools的规则执…

HighTec 工程属性介绍2

目录 首先需要创建或导入一个工程&#xff0c;如下图&#xff1a; 有两种方式可以进入工程的属性面板&#xff1a; 选中工程&#xff0c;右键点击 Properies . 选中工程&#xff0c;按键 Alt Enter. 进入工程属性面板之后&#xff0c;左侧是书签标记&#xff0c;右侧是该书…

How to choose WIFI7 IPQ9554- WIFI6 IPQ8072? Who has the better performance?

How to choose WIFI7 IPQ9554- WIFI6 IPQ8072? Who has the better performance? The Wi-Fi standard is Wi-Fi 6, also known as 802.11ax. Wi-Fi 6 brings significant speed, capacity and performance improvements over the previous Wi-Fi 5 (802.11ac) standard. It p…

如何做好项目管理?年薪百万项目大佬一直在用这11张图!

日常工作中&#xff0c;我们会遇到各种大大小小的工作项目&#xff0c;如何能让项目保质保量的完成&#xff0c;就需要项目管理。项目管理是什么&#xff1f;一句话解释&#xff1a;在有限的时间内&#xff0c;在约束的范围中&#xff0c;集合有限资源来完成项目目标。 本周小编…

如何安装mmcv?官网解答

pip install -U openmim mim install mmcv

什么是宏变量和宏替换?

在Java中&#xff0c;宏变量和宏替换通常是与C/C预处理器相关的概念&#xff0c;而不是Java本身的特性。在Java中&#xff0c;我们通常不使用预处理器指令(例如宏定义)来进行代码替换。Java使用的编译器并不支持预处理器指令&#xff0c;因此没有宏替换的概念。 然而&#xff0…

移动硬盘文件或目录损坏且无法读取

早上插上硬盘&#xff0c;拔的时候不太规范&#xff0c;再插进去就显示无法读取了 搜了很多方法&#xff0c;很多让使用什么软件进行恢复 还参考了这个方法&#xff0c;但是我的属性打开跟博主的完全不一样 最后&#xff0c;参考移动硬盘“文件或目录损坏&#xff0c;无法读取…

[NOIP2007 普及组] 守望者的逃离

[NOIP2007 普及组] 守望者的逃离 题目背景 恶魔猎手尤迪安野心勃勃&#xff0c;他背叛了暗夜精灵&#xff0c;率领深藏在海底的娜迦族企图叛变。 题目描述 守望者在与尤迪安的交锋中遭遇了围杀&#xff0c;被困在一个荒芜的大岛上。 为了杀死守望者&#xff0c;尤迪安开始…