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处理模块,否则就在屏幕上显示触摸点痕迹。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于RTT的机器人视觉框架将实时传输延迟(RTT)作为主要指标来设计和优化机器人视觉系统。RTT代表了从发送传感器数据到接收并作出响应的时间间隔,它是一个关键的决定性因素,影响着机器人的实时感知和决策能力。 该框架主要包括以下几个组件: 1. 传感器数据采集:通过各种传感器(如摄像头、激光雷达等)采集实时环境数据。采集到的数据以最小的延迟尽快发送到后续处理模块。 2. 数据传输和通信:借助高效的通信协议和网络架构,将采集到的数据实时传输给后续处理模块。此外,为了减小RTT,还可以根据实际需求优化数据传输策略,如压缩数据、设置传输优先级等。 3. 数据处理和分析:接收到传感器数据的后续处理模块对数据进行分析、处理和解释。这些模块使用机器学习、计算机视觉等算法对图像进行分析,从中提取特征和识别目标。同时,它们以尽可能高效的方式进行数据处理,以保证实时性。 4. 决策和控制:基于分析的结果,决策模块对机器人的实时行为作出响应。例如,根据识别的目标,生成相应的控制命令并发送到机器人执行。 在这个基于RTT的机器人视觉框架中,实时性是关键目标。通过尽量减小RTT,提高机器人对环境的实时感知和响应能力,从而实现更高效的机器人操作和应用。同时,优化数据处理和传输策略,提高整个系统的性能和稳定性。这个框架可以广泛应用于机器人导航、智能监控、自动驾驶等领域,为机器人实现更高水准的实时视觉能力提供支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值