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管理层

在/ components / drivers / core 下的device.c中实现了rt_device_register,它是io管理层的入口。

它将stm32 dac设备对象放到对象容器里管理。

4.总结

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

这样的好处是可扩展,如搭积木似的,也是对内封闭,对外开放,扩展性好,模拟的是面向对象的继承多态机制。

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

5.使用

文档

相关推荐
西岸行者13 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意13 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码13 天前
嵌入式学习路线
学习
毛小茛13 天前
计算机系统概论——校验码
学习
babe小鑫13 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms13 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下13 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。13 天前
2026.2.25监控学习
学习
im_AMBER13 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J13 天前
从“Hello World“ 开始 C++
c语言·c++·学习