rtt的io设备框架面向对象学习-触摸设备

目录

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

1.触摸设备基类

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

在/ components / drivers / include / drivers /touch.h定义了如下touch设备基类
struct rt_touch_device
{
struct rt_device parent;
struct rt_touch_info info;
struct rt_touch_config config;
const struct rt_touch_ops *ops;
rt_err_t (*irq_handle)(rt_touch_t touch);
};

触摸设备基类是继承自设备基类,再增加私有属性和方法而成。

触摸设备基类中抽象出的共性操作方法定义如下
struct rt_touch_ops
{
rt_size_t (*touch_readpoint)(struct rt_touch_device *touch, void *buf, rt_size_t touch_num);
rt_err_t (*touch_control)(struct rt_touch_device *touch, int cmd, void *arg);
};
抽象出了读取坐标点方法和控制方法。
在这里插入图片描述

该类的构造函数:rt_hw_touch_register。

2.触摸设备基类的子类

此层是设备驱动层,此类是实现类,由各个bsp实现。例如
/bsp / stm32 / stm32f407-atk-explorer / board / ports / touch /drv_touch_xpt.h定义的xpt2046触摸设备类。
其他芯片厂家如此这般一样。

3.初始化/构造流程

以stm32正点原子探索者bsp的电阻屏上的触摸设备为例,从设备驱动层、设备驱动框架层到io设备管理层从下到上的构造/初始化流程如下

3.1设备驱动层

此层是驱动层,是bsp所在,也是可以实例化的实现类所在。

/bsp / stm32 / stm32f407-atk-explorer / board / ports / touch / drv_touch_xpt.h中

定义了stm32的xpt2046触摸设备类
struct rt_xpt2046
{
struct rt_touch_device parent;
struct rt_spi_device *spi;
rt_uint16_t min_raw_x;
rt_uint16_t min_raw_y;
rt_uint16_t max_raw_x;
rt_uint16_t max_raw_y;
};

xpt2046触摸设备类的组成:
继承自触摸设备基类,
又关联了spi设备类,因为它这个开发板的触摸设备是spi通信的,所以要关联下,
然后又记录下触摸屏输出得最小最大xy值,用以计算并限制输出范围。

其构造函数: xpt2046_hw_init。

/ bsp / stm32 / stm32f407-atk-explorer / board / ports / touch / drv_touch_xpt.c中

实现了其构造函数 xpt2046_hw_init。

在其构造函数中实例化了xpt2046触摸设备类:
rt_xpt2046_t dev_obj = rt_malloc(sizeof(struct rt_xpt2046));

然后初始化其私有属性和父类(触摸设备基类)部分属性,然后重写父类(触摸设备基类)的方法:
dev_obj->parent.ops = &xpt2046_ops;

重写的方法定义如下:
static struct rt_touch_ops xpt2046_ops =
{
.touch_readpoint = xpt2046_touch_readpoint,
.touch_control = xpt2046_touch_control,
};
然后调用父类(触摸设备基类)的构造函数rt_hw_touch_register继续后续的初始化。
请添加图片描述

3.2 设备驱动框架层

/ components / drivers / touch / touch.c中实现了设备驱动框架层接口rt_hw_touch_register——也是触摸设备基类的构造函数——开启触摸设备基类的构造/初始化流程。

该层重写了触摸设备基类的父类——设备基类——的方法:
#ifdef RT_USING_DEVICE_OPS
device->ops = &rt_touch_ops;
#else
device->init = RT_NULL;
device->open = rt_touch_open;
device->close = rt_touch_close;
device->read = rt_touch_read;
device->write = RT_NULL;
device->control = rt_touch_control;
#endif

并最终调用触摸设备基类的父类——设备基类——的构造函数rt_device_register进行设备基类的初始化。
在这里插入图片描述

3.3 io设备管理层

在/ components / drivers / core 下的device.c中实现了设备基类的构造函数rt_device_register,它是io设备管理层的入口。
它将xpt2046触摸设备对象放到对象容器里管理。

详细参见io设备管理层。
https://blog.csdn.net/yhb1206/article/details/136440373

4.总结

整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值——它这个结构体是包含一个个的结构体——模拟的是面向对象的继承机制。跟套娃似的,层层进行初始化。这样的好处是什么?每层有每层的初始化(构造)函数,就模拟了面向对象的构造函数——按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。
这样的好处是可扩展,如搭积木似的,也是对内封闭,对外开放,扩展性好,模拟的是面向对象的继承多态机制。

其实每个类的注册函数模拟的是面向对象的构造函数。

其构造整体的实质,是对结构体进行初始化,在C中没有面向对象语言层面的机制,只能采用结构体套用结构体来模拟,这样原先定义好的结构体以及其对象构造函数对新扩展的(包含它的)结构体是解耦的,你新增一个新扩展(包含它的)新结构体,初始化它(面向对象叫父类)时只需要调用它对应的构造函数即可,对于新结构体来说原先的结构体是固定不变的,解耦了。所以这个方式的初始化不像那种把结构体成员挨个赋值这么繁琐,因为rtt规定了这些结构体以及封装了其初始化函数(在c++面向对象中叫构造函数),只需调用即可。

5.使用

文档

5.1实例

以上面xpt2046触摸设备为例,在/bsp / stm32 / stm32f407-atk-explorer / board / ports / touch /下面3个相关文件:
drv_touch_xpt.c
drv_touch_xpt.h
drv_xpt2046_init.c

其中drv_touch_xpt.c和drv_touch_xpt.h实现了定义xpt2046触摸设备类及其实例化,并实现了该类的构造函数xpt2046_hw_init,前面第3节讲过。而drv_xpt2046_init.c是使用xpt2046触摸设备的。

该类对象是讲的触摸LCD屏上的触摸设备对象xpt2046,先澄清下这个。

drv_xpt2046_init.c中的使用如下:
static int touch_xpt2046_init(void)
{
xpt2046_init_hw();
rt_thread_t tid = rt_thread_create(“xpt2046”, xpt2046_entry, RT_NULL, 1024, 8, 20);
RT_ASSERT(tid != RT_NULL);
rt_thread_startup(tid);
return RT_EOK;
}
INIT_COMPONENT_EXPORT(touch_xpt2046_init);

可以看到它采用的rtt的自动初始化机制,在main_entry线程里自动调用。

xpt2046_init_hw();主要是获取第3节讲的xpt2046设备对象指针,然后又拿到硬件原理图链接的spi设备对象(相关的软件spi总线和spi设备早自动初始化了),然后查找lcd设备,启动lcd,然后触摸屏矫正。

而xpt2046_entry这个线程呢,就是检查触摸的线程,如果开启了LVGL就告诉lvgl处理模块,否则就在屏幕上显示触摸点痕迹。

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

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

相关文章

C语言----冒泡排序进阶

冒泡排序大家应该到写过吧。但大家可能知道到的冒泡排序有两种方法。而我呢,最近学习到了另外一种方法,现在知道三种方法了。所以想与大家分享一下。但是缺点是第三种是第二种的自实现版。第一种就是我们平常写的普通冒泡排序。第二种就是qsort。第三种就…

Matlab梁单元有限元编程 | 铁木辛柯梁 | 欧拉梁 | Matlab源码 | 理论文本

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

如何恢复edge的自动翻译功能

介绍:对于英文不好的小伙伴,把英语翻译成中文是有帮助的,而edge可以直接对英文页面翻译这一功能更是受人喜爱,但是,最近发现这一项功能消失了。 原始界面: 下面展示如何恢复该功能。 1.打开edge&#xff…

day06-网路编程

#include <myhead.h>int do_add(sqlite3 *ppDb) {int numb;char name[20];int age;int salary;printf("请输入要插入的信息:");scanf("%d %s %d %d", &numb, name, &age, &salary);char sql[128] "";sprintf(sql, "INSE…

Flutter(四):SingleChildScrollView、GridView

SingleChildScrollView、GridView 遇到的问题 以下代码会报错: class GridViewPage extends StatefulWidget {const GridViewPage({super.key});overrideState<GridViewPage> createState() > _GridViewPage(); }class _GridViewPage extends State<GridViewPage&g…

vscode 通义灵码 插件自动写代码

安装插件 通义灵码安装教程-阿里云 点击立即安装 我是已经安装成功了&#xff0c;所以如下图&#xff0c;没安装的会显示安装&#xff0c;点击安装即可 安装成功之后 侧边栏会出现图标 登录 使用 在编辑框中输入 问题 &#xff0c;会自动生成代码和对应的说明

Cloud+Consul

Cloud整合Zookeeper代替Eureka-CSDN博客 Consul简介 Consul是一套开源的分布式服务发现和配置管理系统 What is Consul? | Consul | HashiCorp DeveloperConsul is a service networking solution that delivers service discovery, service mesh, and network security ca…

Redis中的RDB和AOF持久化机制(一)

Redis持久化 RDB快照(snapshot). 在默认情况下&#xff0c;Redis将内存数据库快照保存在名字为dump.rdb的二进制文件中.Redis可以进行设置,让它在"N秒内数据集至少有M个改动"这一条件被满足时&#xff0c;自动保存一次数据集。比如说&#xff0c;以下设置会让Redis…

TypeScript常见面试题第一节

题目一&#xff1a;是否了解TypeScript&#xff1f;TypeScript比JavaScript 有哪些优势&#xff1f; 一、讲解视频 CSDN视频&#xff1a; TS面试题一&#xff1a;介绍TS及TS的优势&#xff1f; B站视频&#xff1a; TS面试题一&#xff1a;介绍TS及TS的优势&#xff1f; 二、…

关于Spark中OptimizeShuffleWithLocalRead 中自己的一些理解

背景 本文基于 Spark 3.5 关于ShuffleLocalRead的作用简单的来说&#xff0c;就是会按照一定的规则&#xff0c;从一个 map Task 中连续读取多个 reduce数据 的任务&#xff0c;&#xff08;正常的情况下是读取所有map Task中特定的一个reduce数据任务&#xff09;&#xff0c…

Effective C++ 学习笔记 条款13 以对象管理资源

假设我们使用一个用来塑模投资行为&#xff08;如股票、债券等等&#xff09;的程序库&#xff0c;其中各式各样的投资类型继承自一个root class Investment&#xff1a; class Investment { /* ... */ }; // “投资类型”继承体系中的root class进一步假设&#xff0c;这个…

机器视觉 /从bottle.hdev示例程序开启HalconHDevelop征程

文章目录 概述示例程序bottle.hdev源码Step 0: PreparationsStep 1: Segmentation - 读取并显示图片Step 1: Segmentation - 创建并设置OCR模型Step 1: Segmentation - 文本分割与识别计算结果显示内存释放 导出为C代码导出为C代码配置 VS Halcon 环境VS程序执行结果HTuple hv…

LeetCode刷题---填充每个节点的下一个右侧节点指针

官方题解:LeetCode官方题解 解题思想: 因为是一棵满二叉树&#xff0c;所以除了叶子节点外的其他节点都有两个子节点。 可以根据每一层来依次遍历 从根节点开始&#xff0c;根节点的左子节点的next节点就指向根节点的右子节点 因为根节点的next节点为NULL&#xff0c;开始从根…

centOS7操作系统安装说明

一、安装前准备 在安装CentOS 7之前&#xff0c;确保你已经下载了CentOS 7的ISO镜像文件。你可以从CentOS官网下载&#xff1a;The CentOS Project 1. 安装环境准备 确保你的计算机满足CentOS 7的最低系统要求。CentOS 7支持的最低系统要求如下&#xff1a; x86-64或x86架构…

DR模式下LVS负载均衡聚集部署实验

目录 1、实验准备 2、配置负载调度器&#xff08;ens33&#xff1a;192.168.80.9 VIP:192.168.80.188&#xff09; 2.1 配置虚拟ip地址&#xff08;VIP&#xff1a;192.168.80.188&#xff09; 2.2 调整proc响应参数 2.3 设置负载分配策略 3、部署共享存储&#xff08;NF…

LeetCode1394. Find Lucky Integer in an Array

文章目录 一、题目二、题解 一、题目 Given an array of integers arr, a lucky integer is an integer that has a frequency in the array equal to its value. Return the largest lucky integer in the array. If there is no lucky integer return -1. Example 1: Inp…

【算法可视化】搜索算法专题

运行平台 Algorithm Visualizer 选数 [NOIP2002 普及组] 选数 // 导入可视化库 { const { Tracer, Array1DTracer, LogTracer, Layout, VerticalLayout } require(algorithm-visualizer); // }const N 4, K 3; //从包含4个元素的集合中选出3个数 let ans 0 //方案数 co…

static详解

前言 大家好我是jiantaoyab&#xff0c;这篇文章来谈一谈c中的static&#xff0c;根据对static的使用&#xff0c;我分为类内和类外2种情况 static简介 static是c常用的修饰符&#xff0c;它用来控制变量的存储方式和可见性&#xff0c;在变量前面加上一个static&#xff0c…

代码随想录算法训练营第五十二天 300.最长递增子序列 、674. 最长连续递增序列 、718. 最长重复子数组

代码随想录算法训练营第五十二天 | 300.最长递增子序列 、674. 最长连续递增序列 、718. 最长重复子数组 300.最长递增子序列 题目链接&#xff1a;300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int lengthOfLIS(int[] nums) {int l…

ECMAScript 语法

ECMAScript 语法 一、ECMAScript1.ECMAScript简介2.ECMAScript历史 二、ECMAScript 语法区分大小写变量是弱类型的每行结尾的分号可有可无注释与 Java、C 和 PHP 语言的注释相同括号表示代码块 一、ECMAScript ECMAScript是一种由Ecma国际&#xff08;前身为欧洲计算机制造商协…