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.使用

文档

相关推荐
DKPT2 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
好好研究4 小时前
学习栈和队列的插入和删除操作
数据结构·学习
新中地GIS开发老师5 小时前
新发布:26考研院校和专业大纲
学习·考研·arcgis·大学生·遥感·gis开发·地理信息科学
SH11HF6 小时前
小菜狗的云计算之旅,学习了解rsync+sersync实现数据实时同步(详细操作步骤)
学习·云计算
Frank学习路上6 小时前
【IOS】XCode创建firstapp并运行(成为IOS开发者)
开发语言·学习·ios·cocoa·xcode
Chef_Chen7 小时前
从0开始学习计算机视觉--Day07--神经网络
神经网络·学习·计算机视觉
X_StarX9 小时前
【Unity笔记02】订阅事件-自动开门
笔记·学习·unity·游戏引擎·游戏开发·大学生
MingYue_SSS9 小时前
开关电源抄板学习
经验分享·笔记·嵌入式硬件·学习
weixin_4373982110 小时前
转Go学习笔记(2)进阶
服务器·笔记·后端·学习·架构·golang
慕y27410 小时前
Java学习第十六部分——JUnit框架
java·开发语言·学习