嵌入式传感器的接口:轮询的ADC驱动器

嵌入式开发工程师如何在现代嵌入式应用程序中创建一个接口,该接口将低级驱动程序实现细节与应用程序代码分离。该接口提供了一种体系结构抽象,它通过减少对硬件的依赖来提高应用程序代码的可伸缩性和可移植性。

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

要阻止还是不阻止,这就是问题

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

当您拨打电话时,例如:

printf(“ Hello World!”);

嵌入式开发工程师知道,该语句之后的任何代码行都不会执行,直到整个“ 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调用包括:

AdcError_t Adc_Init(const AdcConfig_t * Config);

AdcError_t Adc_StartConversion(void);

bool Adc_ConversionComplete(void);

void Adc_RegisterWrite(uint32_t const Address,uint32_t const Value);

uint32_t Adc_RegisterRead(uint32_t地址);

void Adc_CallbackRegister(AdcCallback_t const Function,TYPE(* CallbackFunction)(type));

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

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

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

如您在此代码中所见,while循环阻塞执行,直到ADC硬件完成其转换,然后将值存储在应用程序缓冲区中。

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

将阻塞驱动程序转换为非阻塞代码非常简单,但是这需要更改更高级别的应用程序代码。例如,现在,如果应用程序要对传感器进行采样,则嵌入式开发工程师将调用:

Adc_Sample();

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

结论

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

更新页面无法回显

需求与问题: 在菜品管理开发中,我需要修改菜品,第一步是回显页面,但在我再三确认代码无误的情况下依旧无法回显内容 问题发现与解决: 经过排查,我发现我的DishDTO内容如下: Data public clas…

基于Dlib库+SVM+Tensorflow+PyQT5智能面相分析-机器学习算法应用(含全部工程源码)+训练及测试数据集

目录 前言总体设计系统整体结构图系统流程图模型流程 运行环境Python 环境TensorFlow环境界面编程环境 模块实现1. 数据预处理2. 模型构建1)定义模型结构2)交叉验证模型优化 3. 模型训练及保存4. 模型测试1)摄像头调用2)模型导入及…

CentOS虚拟机 NAT模式连网

1、查看本地VMnet8的网络信息 cmd ipconfig2、编辑VMware虚拟网络编辑器 (1)打开网络编辑器 (2)打开NET设置 (3)修改网络配置 修改子网ip和windows查到的ip的最后一位不一样就行和子网掩码照抄 3、在VMw…

一生一芯1——windows与Ubuntu双系统安装

UltraISO下载 下载链接:https://pan.baidu.com/s/18ukDs6yL64qU6thYyZEo-Q?pwdo8he 提取码:o8he 一路傻瓜安装,安装后点击继续试用 Ubuntu系统下载 这里我使用的是官网的22.04版本,由于大于4G,无法上传至百度网盘…

windows .gitignore 加入文件名后 依然可以从git status中看到文件问题

最近在学git,对着b站的视频操作,结果很简单的添加.gitignore文件操作,up主的正常隐藏,我的却一直出问题。 百思不得其解,网上各种啥啥啥清缓存都没讲到点上。 最后发现是.gitignore文件有问题,windows默认…

Detector定位算法在FPGA中的实现——section1 原理推导

关于算法在FPGA中的实现,本次利用业余的时间推出一个系列章节,专门记录从算法的推导、Matlab的实现、FPGA的移植开发与仿真做一次完整的FPGA算法开发,在此做一下相关的记录和总结,做到温故知新。 这里以Detector在Global Coordina…

Llama 2:开放基础和微调聊天模型

介绍 大型语言模型(llm)作为高能力的人工智能助手,在复杂的推理任务中表现出色,这些任务需要广泛领域的专家知识,包括编程和创意写作等专业领域。它们可以通过直观的聊天界面与人类进行交互,这在公众中得到了迅速而广泛的采用。 法学硕士的能力是显著的考虑到训练的表面上…

两种方法(JS方法和Vue方法)实现页面渲染

一、需求 根据数据渲染如下页面 二、JS方法 <body><!-- 4. box核心内容区域开始 --><div class"box w"><div class"box-hd"><h3>精品推荐</h3><a href"#">查看全部</a></div><div cl…

国内首届“熵密杯”密码应用安全竞赛 | 赛宁网安全面保障

​​为进一步提升商用密码合规、正确、有效的应用意识&#xff0c;提高密码应用安全防护水平&#xff0c;由中国密码学会支持&#xff0c;2023商用密码大会执委会主办&#xff0c;南京赛宁信息技术有限公司提供技术支撑的首届“熵密杯”密码应用安全竞赛将于8月10日在郑州举办。…

使用 POI 在 Word 中重新开始编号、自定义标题格式

效果图 引入依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><!-- https…

基于连续Ziegler_Nichols的频域响应pid整定

连续Ziegler_Nichols的频域响应pid整定 Ziegler_Nichols频域响应pid整定的方法是基于稳定性分析的频域响应pid整定方法。该方法整定的思想是&#xff1a;对于给定的被控对象传递函数&#xff0c;可以得到其根轨迹&#xff0c;对应穿越Jw轴的点&#xff0c;增益即为Km&#xff…

Redis探索之旅

目录 今日良言&#xff1a;有志者自有千计万计&#xff0c;无志者只感千难万难 一、简介 二、Redis的安装 三、Redis的简单使用 四、Redis相关知识点 1.缓存分类 2.五大基本数据类型使用 3.持久化 4.常见面试题 今日良言&#xff1a;有志者自有千计万计&#xff0c;无…