了解和使用无操作系统和平台驱动程序

快速发展的技术需要软件支持(固件驱动程序和示例代码)来简化设计过程。本文介绍了如何使用 no-OS(无操作系统)驱动程序和平台驱动程序来构建具有 Analog Devices 模数转换器和数模转换器的应用固件,这些转换器在以下方面提供了高水平的性能速度、功率、尺寸和分辨率。

ADI 提供基于无操作系统驱动程序的嵌入式固件示例,以支持AD转换器。无操作系统驱动程序负责设备配置、从转换器捕获数据、执行校准等,而基于无操作系统驱动程序的固件示例则有助于将数据传输到主机 PC 以进行显示、存储和进一步处理。

无操作系统和平台驱动程序简介

顾名思义,无操作系统驱动程序设计用于通用(或非特定)操作系统。该名称还意味着这些驱动程序可以在没有任何操作系统支持的 BareMetal 系统上使用。无操作系统驱动程序旨在为给定精度转换器的数字接口访问提供高级 API。使用这些 API 的无操作系统驱动程序与设备连接以访问、配置、读取和写入数据,而无需了解寄存器地址(内存映射)及其内容。

无操作系统驱动程序利用平台驱动程序层,允许在多个硬件/软件平台上重复使用相同的无操作系统驱动程序,从而使您的固件具有高度可移植性。平台驱动程序层的使用使无操作系统驱动程序无法了解平台特定接口(例如 SPI、I 2 C、GPIO 等)的低级详细信息,这使得无操作系统驱动程序可以跨多个平台重用,而无需任何操作。改变他们。


图 1. AD转换器固件架构。

使用无操作系统驱动程序

图 2 显示了无操作系统驱动程序的典型代码结构。

图 2. 无操作系统驱动程序代码结构。

图 3. 设备配置枚举、结构和 API。

AD转换器的无操作系统驱动程序代码通常包含在两个用 C 编程语言编写的源文件中:adxxxx.c和adxxxx.h,其中 xxxx 代表设备名称(例如 AD7606、AD7124 等)。设备头文件 ( adxxxx.h ) 包含设备特定结构、枚举、寄存器地址和位掩码的公共编程接口,通过将此文件包含到所需的源文件中,可以供公共访问。设备源文件 ( adxxxx.c ) 包含用于初始化和删除设备、读/写设备寄存器、从设备读取数据、获取/设置设备特定参数等接口的实现。

典型的无操作系统驱动程序是围绕一组通用功能构建的:

设备特定寄存器地址、位掩码宏、设备配置枚举以及用于读/写设备特定参数(例如,过采样、增益、参考等)的结构的声明。
通过无操作系统驱动程序的设备初始化/删除函数以及设备特定的 init 和驱动程序结构和描述符来初始化/取消初始化物理设备。
使用设备寄存器读/写函数访问设备内存映射或寄存器详细信息;例如,adxxxx_read_register()或adxxxx_write_register()。


无操作系统驱动程序代码使用

使用设备特定地址、位掩码以及参数配置枚举和结构

如前所述,adxxxx.h头文件包含所有设备特定枚举和结构的声明,这些枚举和结构将传递给设备特定函数或 API 以配置或访问设备参数。图 3 对此进行了说明。

图 3 中所示的adxxxx_config结构允许用户选择多路复用器通道并为其设置过采样率。该结构的两个成员(afe_mux_channel和oversampling)都是存在于同一头文件中的枚举,其中包含用户可以选择的两个字段的所有可能值的数字常量。

adxxxx.c文件中定义的adxxxx_set_adc_config ()函数通过配置结构获取用户传递的配置/参数,并进一步调用 adxxxx_spi_reg_write ()函数通过数字接口将数据写入ADXXXX_REG_CONFIG设备寄存器(在前面的情况下, SPI)。

使用无操作系统驱动程序设备结构和初始化函数初始化设备

图 4. 设备初始化和驱动程序结构的声明。

除了设备配置枚举和结构之外,无操作系统驱动程序还提供两个附加结构:

  •         设备初始化结构
  •         设备驱动程序结构。

设备初始化结构允许用户在用户应用程序代码中定义设备特定的参数和配置。init 结构包含其他特定于设备的参数结构和枚举的成员。图 5 显示了设备初始化结构的定义方式。

图 5. 用户应用程序中的设备初始化结构定义。

设备驱动结构体通过设备初始化函数adxxxx_init()加载设备初始化参数。设备驱动程序结构是在运行时(动态)内存中从堆空间分配的。设备驱动程序结构和设备初始化结构中声明的参数几乎彼此相同。设备驱动程序结构是设备 init 结构的运行时版本。

典型的设备初始化函数和初始化流程描述如下:

步骤 1:在应用程序中创建设备 init 结构的定义(或实例)(例如 struct adxxxx_init_params),以初始化用户特定的设备参数和平台相关的驱动程序参数。这些参数是在编译时定义的。


注意:init 结构体中定义的参数因设备而异。

步骤2:在应用程序代码中创建设备驱动程序结构体的指针实例(变量)。
用户应用程序需要创建设备驱动程序结构的单个指针实例。该实例被传递给所有无操作系统驱动程序 API/函数以访问设备特定参数。应用程序代码中定义的此指针实例指向堆中动态分配的内存,这是通过设备初始化函数(例如在无操作系统驱动程序中定义的adxxxx_init() )完成的。

步骤 3:通过调用设备 init 函数来初始化设备和其他特定于平台的外设。


无操作系统驱动程序中定义的 adxxxx_init() 函数使用通过 adxxx_init_param 结构传递的用户特定参数来初始化设备。设备驱动程序结构的指针实例和设备 init 结构的实例作为两个参数传递给此 init 函数。用户应用程序代码可以多次调用adxxxx_init()函数,前提是 init 调用通过对设备删除函数的调用来平衡。

通过设备寄存器读/写函数访问存储器映射(寄存器内容)如图 6 所示。

图 6. 访问寄存器内容。

用户可以通过无操作系统驱动程序设备特定的adxxx_read/write()函数访问设备寄存器内容(例如产品 ID、暂存器值、OSR 等)。

大多数时候,用户不直接使用寄存器访问函数。设备特定函数通过这些寄存器访问函数进行调用,例如adxxxx_ spi_reg_read/write()。建议尽可能使用设备配置和状态 API 来访问设备内存映射,而不是使用直接寄存器访问函数,因为这可以确保设备驱动程序结构与设备中的配置保持同步。

平台驱动程序

平台驱动程序是包装特定于平台的 API 的硬件抽象层 (HAL) 之一。它们由无操作系统设备驱动程序或用户应用程序代码调用,以提供独立于底层硬件和软件平台的独立性。平台驱动程序封装了低级平台特定的硬件功能,例如 SPI/I 2 C 初始化和读/写、GPIO 初始化和读/写、UART 初始化和接收/发送、用户特定的延迟、中断等。

SPI平台驱动模块的典型文件结构如图7所示。

图 7. SPI 平台驱动程序代码结构。

使用平台驱动程序

平台驱动程序代码通常合并在用 C/C++ 编程语言编写的三个源文件中。

1) spi.h:这是一个与平台无关的文件,包含 SPI 功能所需的设备结构和枚举。此头文件中定义的 C 编程接口没有平台依赖性。

init 和 device 结构中声明的所有参数对于任何平台上的 SPI 接口都是通用的。

设备初始化结构中使用的void *extra参数允许用户传递附加(额外)参数,这些参数可能特定于所使用的平台。

SPI 驱动程序结构和 SPI init 结构中声明的参数几乎彼此相同。SPI 驱动程序结构是 SPI init 结构的运行时版本。

2) spi.cpp/.c:该文件包含spi.h文件中声明的函数的实现,这些函数用于初始化 SPI 外设并针对特定平台从其读取/写入数据。从更广泛的意义上讲,术语“平台”是指硬件微控制器(目标设备)和软件(例如 RTOS 或 Mbed-OS)的组合。该文件与平台相关,在移植到其他平台时需要进行修改。

图 9 详细介绍了 Mbed 平台的 SPI 接口,并展示了如何使用这些接口和设备初始化/驱动程序结构来初始化 SPI 和读/写数据。

图 8. SPI 初始化和驱动程序结构。

图 9. SPI API 或函数。注意:为 spi_init() 和 spi_write_and_read() 添加的代码是缩写代码,为了清楚起见,省略了详细信息。

图 10. SPI 额外初始化和驱动程序结构。

3) spi_extra.h:该文件包含特定于给定平台的附加设备结构或枚举。这允许用户应用程序代码提供通用spi.h文件中未涵盖的配置。例如,SPI 引脚可能因平台而异,因此可以将其添加为这些平台特定的额外结构的一部分。

移植平台驱动程序

通常可以通过创建特定于平台的.cpp/.c和_extra.h文件,将平台驱动程序从一个平台(微控制器)移植到另一平台。平台驱动程序位于微控制器单元供应商提供的设备特定硬件抽象层 (HAL) 之上的一层。因此,将平台驱动程序从一个平台移植到另一个平台需要对与调用其供应商提供的 HAL 中存在的函数或 API 相关的平台驱动程序代码进行一些最小的更改。

图 12 中的图表区分了基于 Mbed 的 SPI 平台驱动程序和ADuCM410 SPI 平台驱动程序。

ADI 的无操作系统存储库和平台驱动程序的 GitHub 源代码链接https://github.com/analogdevicesinc/no-OS

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

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

相关文章

Docker之docker compose!!!!

一、概述 是 Docker 官方提供的一款开源工具,主要用于简化在单个主机上定义和运行多容器 Docker 应用的过程。它的核心作用是容器编排,使得开发者能够在一个统一的环境中以声明式的方式管理多容器应用的服务及其依赖关系。 也就是说Docker Compose是一个…

docker安装WireGuard服务

启动 WireGuard 如下异常 则是linux内核需要升级 $ wg-quick down wg0 $ wg-quick up wg0 Error: WireGuard exited with the error: Cannot find device "wg0" This usually means that your hosts kernel does not support WireGuard!at /app/lib/WireGuard.js:65…

unicloud 云函数 介绍及使用

普通云函数 callFunction方式云函数,也称之为普通云函数。 uni-app的前端代码,不再执行uni.request联网,而是通过uniCloud.callFunction调用云函数。 callFunction方式避免了服务器提供域名,不暴露固定ip,减少被攻击…

机器学习(一)

经典定义: 利用经验改善系统自身的性能。 经典的机器学习过程: 基本术语: 数据集:训练集、测试集 示例、样例、样本 属性、特征:属性值 属性空间、样本空间、输入空间 特征向量 标记空间、输出空间 归纳偏好(偏置): 任何一个有效的机器学习算法必有其偏好 学习算法的…

数据库系统概论-练手题集合【期末复习|考研复习】

前言 总结整理不易,希望大家点赞收藏。 给大家整理了一下数据库系统概论中的练手题,以供大家期末复习和考研复习的时候使用。 数据库系统概论系列文章传送门: 第一章 绪论 第二/三章 关系数据库和标准语言SQL 第四/五章 数据库安全性和完整性…

【Flutter学习笔记】10.3 组合实例:TurnBox

参考资料:《Flutter实战第二版》 10.3 组合实例:TurnBox 这里尝试实现一个更为复杂的例子,其能够旋转子组件。Flutter中的RotatedBox可以旋转子组件,但是它有两个缺点: 一是只能将其子节点以90度的倍数旋转二是当旋转…

Web前端全栈HTML5通向大神之路

本套课程共三大阶段,六大部分,是WEB前端、混合开发与全栈开发必须要掌握的技能,从基础到实践,是从编程小白成长为全栈大神的最佳教程! 链接:https://pan.baidu.com/s/1S_8DCORz0N2ZCdtJg0gHsw?pwdtjyv 提取…

4G/5G视频记录仪_联发科MTK6765平台智能记录仪方案

视频记录仪主板采用了联发科MT6765芯片,该芯片采用12nm FinFET制程工艺,8*Cortex-A53架构,搭载安卓11.0/13.0系统,主频最高达2.3GHz,待机功耗可低至5ma,并具有快速数据传输能力。配备了2.4英寸高清触摸显示…

C语言---------strlen的使用和模拟实现

字符串是以‘\0’作为结束标志&#xff0c;strlen函数的返回值是‘\0’前面的字符串的个数&#xff08;不包括‘\0’&#xff09; 注意 1&#xff0c;参数指向的字符串必须以‘\0’结束 2&#xff0c;函数的返回值必须以size_t,是无符号的 使用代码 ​ #include<stdio.…

图论基础|417. 太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙

目录 417. 太平洋大西洋水流问题 827.最大人工岛 127. 单词接龙 417. 太平洋大西洋水流问题 题目链接(opens new window) 有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界…

数据分析POWER BI之power query

1.导入数据 ctrla全选--数据--获取数据--其他来源--来自表格/区域 导入数据&#xff0c;进入编辑模式 2.整理与清除 清除&#xff1a;删除所选列的非打印字符 转换--格式--清除 修整&#xff1a;删除前面和后面的空格 转换---格式---修整&#xff08;修整后前面后面的空格没有了…

程序汪若依微服务华为云Linux部署保姆教程

若依官方有3个版本&#xff0c;程序汪以前已经出了对应的安装部署视频教程 单应用版本 前后分离版本 微服务版本 本视频是若依微服务版本&#xff0c;如果基础的环境软件都不会安装建议看下程序汪的单应用和前后端分离版本教程&#xff0c; 欢迎点击进入 &#xff08;单应…

【VALL-E-02】核心原理

本文系个人知乎专栏文章迁移 VALL-E 网络是GPT-SOVITS很重要的参考 知乎专栏地址&#xff1a; 语音生成专栏 相关文章链接&#xff1a; 【VALL-E-01】环境搭建 【VALL-E-02】核心原理 【参考】 【1】Neural Codec Language Models are Zero-Shot Text to Speech Synthesiz…

部署单节点k8s并允许master节点调度pod

安装k8s 需要注意的是k8s1.24 已经弃用dockershim&#xff0c;现在使用docker需要cri-docker插件作为垫片&#xff0c;对接k8s的CRI。 硬件环境&#xff1a; 2c2g 主机环境&#xff1a; CentOS Linux release 7.9.2009 (Core) IP地址&#xff1a; 192.168.44.161 一、 主机配…

C++ 子序列

目录 最长递增子序列 摆动序列 最长递增子序列的个数 最长数对链 最长定差子序列 最长的斐波那契子序列的长度 最长等差数列 等差数列划分 II - 子序列 最长递增子序列 300. 最长递增子序列 子数组是连续的&#xff0c;子序列可以不连续&#xff0c;那么就要去[0, i - 1]…

GuLi商城-商品服务-API-三级分类-查询-树形展示三级分类数据

1、网关服务配置路由 2、商品服务 3、启动本地nacos&#xff0c;打开nacos地址看nacos服务列表 4、编写VUE <template> <el-tree :data"menus" :props"defaultProps" node-click"handleNodeClick"></el-tree> </template…

下载网页上的在线视频 网络视频 视频插件下载

只需要在浏览器上安装一个插件&#xff0c;就可以下载大部分的视频文件&#xff0c;几秒到一两个小时的视频&#xff0c;基本都不是问题。详细解决如下&#xff1a; 0、因为工作需要&#xff0c;需要获取某网站上的宣传视频&#xff0c;我像往常一样&#xff0c;查看视频的url…

802.1X网络访问控制协议

802.1X是一种由IEEE&#xff08;电气和电子工程师协会&#xff09;制定的网络访问控制协议&#xff0c;主要用于以太网和无线局域网&#xff08;WLAN&#xff09;中基于端口的网络接入控制。802.1X协议通过认证和授权机制&#xff0c;确保只有合法的用户和设备才能够接入网络&a…

VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准

文章目录 VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准总结摘要介绍相关工作单视角指静脉识别多视角指静脉识别Transformer 数据库基本信息 方法总体结构静脉掩膜生成VPC编码器视角内相关性的提取视角间相关关系提取输出融合IFFN近邻感知模块(NPM) patch嵌…