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

文档

相关推荐
知识分享小能手1 天前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
茯苓gao1 天前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾1 天前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT1 天前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa1 天前
HTML和CSS学习
前端·css·学习·html
看海天一色听风起雨落1 天前
Python学习之装饰器
开发语言·python·学习
speop1 天前
llm的一点学习笔记
笔记·学习
非凡ghost1 天前
FxSound:提升音频体验,让音乐更动听
前端·学习·音视频·生活·软件需求
ue星空1 天前
月2期学习笔记
学习·游戏·ue5
萧邀人1 天前
第二课、熟悉Cocos Creator 编辑器界面
学习