当前位置: 首页 > news >正文

rtt设备io框架面向对象学习-dac设备

目录

        • 1.dac设备基类
        • 2.dac设备基类的子类
        • 3.初始化/构造流程
          • 3.1设备驱动层
          • 3.2 设备驱动框架层
          • 3.3 设备io管理层
        • 4.总结
        • 5.使用

1.dac设备基类

此层处于设备驱动框架层。也是抽象类。

在/ components / drivers / include / drivers 下的dac.h定义了如下dac设备基类
struct rt_dac_device
{
struct rt_device parent;
const struct rt_dac_ops *ops;
};

dac设备基类的方法定义如下
struct rt_dac_ops
{
rt_err_t (*disabled)(struct rt_dac_device *device, rt_uint32_t channel);
rt_err_t (*enabled)(struct rt_dac_device *device, rt_uint32_t channel);
rt_err_t (*convert)(struct rt_dac_device *device, rt_uint32_t channel, rt_uint32_t *value);
rt_uint8_t (*get_resolution)(struct rt_dac_device *device);
};

抽象出来dac设备的共性成为dac设备基类的方法。
共性:失能dac,使能dac,转换,分辨率。

2.dac设备基类的子类

各个看dac设备基类的子类已经是在bsp的驱动层来实现了,例如
/ bsp / stm32 / libraries / HAL_Drivers / drivers 下的drv_dac.c定义的stm32 dac类,这些都是可以实例化的终类。其他芯片厂家如此这般一样。

3.初始化/构造流程

以stm32为例,从设备驱动层、设备驱动框架层到设备io管理层从下到上的构造/初始化流程如下

3.1设备驱动层

此层是bsp层,可以实例化的终类地。

c文件:
/ bsp / stm32 / libraries / HAL_Drivers / drivers 下的drv_dac.c。

定义了stm32的dac类
struct stm32_dac
{
DAC_HandleTypeDef DAC_Handler;
struct rt_dac_device stm32_dac_device;
};
总感觉不舒服,和rtt设备io框架类继承机制不一致,应该改成这样
struct stm32_dac
{
struct rt_dac_device stm32_dac_device;
DAC_HandleTypeDef DAC_Handler;
};
这就是舒服许多了。

实例化了stm32的dac设备:
static struct stm32_dac stm32_dac_obj[sizeof(dac_config) / sizeof(dac_config[0])];

重写了dac设备基类的方法:
static const struct rt_dac_ops stm_dac_ops =
{
.disabled = stm32_dac_disabled,
.enabled = stm32_dac_enabled,
.convert = stm32_set_dac_value,
.get_resolution = stm32_dac_get_resolution,
};

stm32_dac_init中开启stm32的dac设备的初始化:
调用/ components / drivers / misc /dac.c的rt_hw_dac_register函数来初始化adc设备基类对象: rt_hw_dac_register(&stm32_dac_obj[i].stm32_dac_device, name_buf, &stm_dac_ops, &stm32_dac_obj[i].DAC_Handler)
注意把重写的dac设备基类方法传递进去了。

3.2 设备驱动框架层

rt_hw_dac_register是dac设备驱动框架层的入口,开启dac设备基类的构造/初始化流程。
其主要是重写设备基类对象的方法,如下

/ components / drivers / misc 下的dac.c实现了设备驱动框架层接口。
重写dac设备基类的父类设备基类的方法如下
#ifdef RT_USING_DEVICE_OPS
device->parent.ops = &dac_ops;
#else
device->parent.init = RT_NULL;
device->parent.open = RT_NULL;
device->parent.close = RT_NULL;
device->parent.read = RT_NULL;
device->parent.write = _dac_write;
device->parent.control = _dac_control;
#endif

同时,重写dac设备基类的方法。
device->ops = ops;

并最终调用设备基类的初始化/构造函数rt_device_register。

3.3 设备io管理层

rt_device_register是io管理层的入口。从框架章节可以知道所有设备类都继承自设备基类rt_device,自然都要实现设备基类rt_device的约束方法,上面已经重写。
在/ components / drivers / core 下的device.c中实现了rt_device_register,由它将pin设备放到容器里管理。

4.总结

整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值,按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。

5.使用

文档

相关文章:

rtt设备io框架面向对象学习-dac设备

目录 1.dac设备基类2.dac设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.dac设备基类 此层处于设备驱动框架层。也是抽象类。 在/ components / drivers / include / drivers 下的dac.h定义了如下dac设备基类 struct rt_da…...

腾讯云幻兽帕鲁服务器配置怎么选择合适?

腾讯云幻兽帕鲁服务器配置怎么选?根据玩家数量选择CPU内存配置,4到8人选择4核16G、10到20人玩家选择8核32G、2到4人选择4核8G、32人选择16核64G配置,腾讯云百科txybk.com来详细说下腾讯云幻兽帕鲁专用服务器CPU内存带宽配置选择方法&#xff…...

796. 子矩阵的和

Problem: 796. 子矩阵的和 文章目录 思路解题方法复杂度Code 思路 这是一个二维前缀和的问题。二维前缀和的主要思想是预处理出一个二维数组,使得每个位置(i, j)上的值表示原数组中从(0, 0)到(i, j)形成的子矩阵中所有元素的和。这样,对于任意的子矩阵(x…...

如何在 Python 中处理 Unicode

介绍 Unicode 是世界上大多数计算机的标准字符编码。它确保文本(包括字母、符号、表情符号,甚至控制字符)在不同设备、平台和数字文档中显示一致,无论使用的操作系统或软件是什么。它是互联网和计算机行业的重要组成部分&#xf…...

CSDN文章导出PDF整理状况一览

最近CSDN有了导出文章PDF功能,导出的PDF还可以查询, 因此,把文章导出PDF,备份一下自己的重要资料。 目前整理内容如下 No.文章标题整理时间整理之后 文章更新Size (M)10001_本地电脑-开发相关软件保持位…...

jmeter-05变量(用户定义变量,用户参数,csv文档参数化)

文章目录 一、jmeter有三种变量二、用户定义变量(这个更多的可以理解为全局变量)1、设置2、引用三、用户参数(可以理解为局部变量)1、设置2、引用3、用户参数化要配合线程组的线程数使用4、结果五、csv文档参数1、创建csv文件2、设置2、引用csv文件可以配合线程组的线程数,…...

CSS之水平垂直居中

如何实现一个div的水平垂直居中 <div class"content-wrapper"><div class"content">content</div></div>flex布局 .content-wrapper {width: 400px;height: 400px;background-color: lightskyblue;display: flex;justify-content:…...

2.8日学习打卡----初学RabbitMQ(三)

2.8日学习打卡 一.springboot整合RabbitMQ 之前我们使用原生JAVA操作RabbitMQ较为繁琐&#xff0c;接下来我们使用 SpringBoot整合RabbitMQ&#xff0c;简化代码编写 创建SpringBoot项目&#xff0c;引入RabbitMQ起步依赖 <!-- RabbitMQ起步依赖 --> <dependency&g…...

Unity学习笔记(零基础到就业)|Chapter02:C#基础

Unity学习笔记&#xff08;零基础到就业&#xff09;&#xff5c;Chapter02:C#基础 前言一、复杂数据&#xff08;变量&#xff09;类型part01&#xff1a;枚举数组1.特点2.枚举&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;申明枚举变量&#xff08;3&#xff…...

容器化的基础概念:不可变基础设施解释:将服务器视为乐高积木,而非橡皮泥。

不可变基础设施解释&#xff1a;将服务器视为乐高积木&#xff0c;而非橡皮泥。 想象一下用乐高积木代替橡皮泥进行搭建。使用橡皮泥时&#xff0c;您可以直接塑形和改变它。而使用乐高积木&#xff0c;您需要逐个零件搭建特定结构&#xff0c;并在需要时整体替换它们。这就是…...

智胜未来,新时代IT技术人风口攻略-第二版(弃稿)

文章目录 抛砖引玉 鸿蒙生态小科普焦虑之下 理想要落到实处校园鼎力 鸿蒙发展不可挡培训入场 机构急于吃红利企业布局 鸿蒙应用规划动智胜未来 技术人风口来临 鸿蒙已经成为行业的焦点&#xff0c;未来的发展潜力无限。作为一名程序员兼UP主&#xff0c;我非常荣幸地接受了邀请…...

Git分支和迭代流程

Git分支 feature分支&#xff1a;功能分支 dev分支&#xff1a;开发分支 test分支&#xff1a;测试分支 master分支&#xff1a;生产环境分支 hotfix分支&#xff1a;bug修复分支。从master拉取&#xff0c;修复并测试完成merge回master和dev。 某些团队可能还会有 reale…...

数据库管理-第150期 Oracle Vector DB AI-02(20240212)

数据库管理150期 2024-02-12 数据库管理-第150期 Oracle Vector DB & AI-02&#xff08;20240212&#xff09;1 LLM2 LLM面临的挑战3 RAG4 向量数据库LLM总结 数据库管理-第150期 Oracle Vector DB & AI-02&#xff08;20240212&#xff09; 作者&#xff1a;胖头鱼的鱼…...

MySQL双写机制

双写机制 问题的出现 在发生数据库宕机时&#xff0c;可能Innodb正在写入某个页到表中&#xff0c;但是这个页只写了一部分&#xff0c;这种情况被称为部分写失效&#xff0c;虽然innodb会先写重做日志,在修改页&#xff0c;但是重做日志中记录的是对页的物理操作&#xff0c;但…...

uniapp的配置和使用

①安装环境和编辑器 注册小程序账号 微信开发者工具下载 uniapp 官网 HbuilderX 下载 首先先下载Hbuilder和微信开发者工具 &#xff08;都是傻瓜式安装&#xff09;&#xff0c;然后注册小程序账号&#xff1a; 拿到appid&#xff1a; ②简单通过demo使用微信开发者工具和…...

【ES】--Elasticsearch的分词器深度研究

目录 一、问题描述及分析二、analyze分析器原理三、 multi-fields字段支持多场景搜索(如同时简繁体、拼音等)1、ts_match_analyzer配置分词2、ts_match_all_analyzer配置分词3、ts_match_1_analyzer配置分词4、ts_match_2_analyzer配置分词5、ts_match_3_analyzer配置分词6、ts…...

【Langchain Agent研究】SalesGPT项目介绍(三)

【Langchain Agent研究】SalesGPT项目介绍&#xff08;二&#xff09;-CSDN博客 上节课&#xff0c;我们介绍了salesGPT项目的初步的整体结构&#xff0c;poetry脚手架工具和里面的run.py。在run.py这个运行文件里&#xff0c;引用的最主要的类就是SalesGPT类&#xff0c;今天我…...

Java安全 URLDNS链分析

Java安全 URLDNS链分析 什么是URLDNS链URLDNS链分析调用链路HashMap类分析URL类分析 exp编写思路整理初步expexp改进最终exp 什么是URLDNS链 URLDNS链是Java安全中比较简单的一条利用链&#xff0c;无需使用任何第三方库&#xff0c;全依靠Java内置的一些类实现&#xff0c;但…...

【网站项目】026校园美食交流系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…...

使用raw.gitmirror.com替换raw.githubusercontent.com以解决brew upgrade python@3.12慢的问题

MacOS系统上&#xff0c;升级python3.12时&#xff0c;超级慢&#xff0c;而且最后还失败了。看了日志&#xff0c;发现是用curl从raw.githubusercontent.com上下载Python安装包超时了。 解决方案一&#xff1a;开启翻墙工具&#xff0c;穿越围墙 解决方案二&#xff1a;使用…...

多模态模型中图像生成器使用的扩散模型的组件

多模态模型中图像生成器使用的扩散模型组件 多模态模型中的图像生成器&#xff0c;通常不是一个单独网络&#xff0c;而是一套 条件扩散生成系统。典型输入是文本、图像、mask、bbox、姿态、深度图、边缘图、语义图、视频帧或多模态 embedding&#xff0c;输出是目标图像。 最常…...

技术赋能:ROS机器人仿真平台的虚拟试炼场

技术赋能&#xff1a;ROS机器人仿真平台的虚拟试炼场 【免费下载链接】wpr_simulation 项目地址: https://gitcode.com/gh_mirrors/wp/wpr_simulation 想象这样一个场景&#xff1a;你正在设计一款能够自主导航的家庭服务机器人&#xff0c;但面对高昂的硬件成本、漫长…...

手把手教你配置STC15F2K60S2的PCA引脚映射,灵活切换P1/P3/P2口输出PWM信号

STC15F2K60S2单片机PCA模块实战&#xff1a;三端口PWM信号自由切换指南 当你在蓝桥杯CT107D开发板上调试电机控制时&#xff0c;是否遇到过P1口被数码管占用却需要输出PWM的困境&#xff1f;STC15F2K60S2的PCA模块引脚重映射功能正是解决这类硬件冲突的利器。本文将带你深入掌…...

如何5分钟快速上手Mayo:新手入门完全教程

如何5分钟快速上手Mayo&#xff1a;新手入门完全教程 【免费下载链接】mayo 3D CAD viewer and converter based on Qt OpenCascade 项目地址: https://gitcode.com/gh_mirrors/ma/mayo Mayo是一款基于Qt和OpenCascade开发的免费开源3D CAD查看器和转换器&#xff0c;支…...

从‘马鞍波’到‘圆形磁场’:深入浅出图解SVPWM如何让电机转得更平滑、更省电

从‘马鞍波’到‘圆形磁场’&#xff1a;深入浅出图解SVPWM如何让电机转得更平滑、更省电 想象一下&#xff0c;当你按下电动车的加速踏板时&#xff0c;电机如何从静止状态平稳过渡到高速旋转&#xff1f;这背后隐藏着一项关键技术——空间矢量脉宽调制&#xff08;SVPWM&…...

还在熬夜改论文格式?okbiye 本科毕业论文写作功能,一键搞定你的毕业难题

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT毕业论文 - Okbiye智能写作https://www.okbiye.com/ai/bylw 当查重报告里飘红的句子、学校格式手册里密密麻麻的排版要求、凌晨三点还没理顺的论文大纲&#xff0c;成为每个本科生毕业季的共同记忆时&…...

保姆级教程:用Ucinet和Data数据园搞定CNKI文献关键词共现分析(附数据清洗技巧)

学术研究者的文献计量分析实战指南&#xff1a;从CNKI数据到知识图谱可视化 在当今信息爆炸的时代&#xff0c;学术研究者面临的最大挑战之一是如何从海量文献中快速识别研究热点和知识结构。文献计量分析作为一种量化研究方法&#xff0c;能够帮助学者们系统性地梳理领域发展脉…...

手把手教你用正点原子RV1126开发板玩转RKMedia:从录音到RTSP推流保姆级教程

手把手教你用正点原子RV1126开发板玩转RKMedia&#xff1a;从录音到RTSP推流保姆级教程 第一次拿到正点原子ATK-DLRV1126开发板时&#xff0c;那种既兴奋又忐忑的心情至今记忆犹新。作为一款基于Rockchip RV1126芯片的嵌入式开发平台&#xff0c;它强大的多媒体处理能力让人跃…...

阿里云ECS新手避坑指南:搞定校园网、安全组和SSH端口映射(附XShell连接测试)

阿里云ECS新手全流程配置手册&#xff1a;从安全组到SSH连接的深度实践 第一次接触云服务器时&#xff0c;那种既兴奋又忐忑的心情我至今记忆犹新。看着控制台里各种陌生的术语和选项&#xff0c;明明按照教程一步步操作却总是卡在连接阶段&#xff0c;这种经历想必不少技术爱好…...

保姆级教程:在Windows上用Python连接CoppeliaSim远程API(附避坑指南)

从零开始掌握CoppeliaSim与Python的远程控制&#xff1a;Windows环境实战指南 在机器人仿真领域&#xff0c;CoppeliaSim&#xff08;原V-REP&#xff09;因其强大的功能和友好的用户界面而广受欢迎。对于希望将Python的灵活性与CoppeliaSim的仿真能力结合的研究者和工程师来说…...