建设网站需要哪些流程图,网站建设有哪些类型,wordpress 可以做什么,即时设计网页目录 1.触摸设备基类2.触摸设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 io设备管理层 4.总结5.使用5.1实例 1.触摸设备基类
此层处于设备驱动框架层。此层的类是抽象类。
在/ components / drivers / include / drivers /touch.h定义了如下touch设备… 目录 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处理模块否则就在屏幕上显示触摸点痕迹。