rtt设备io框架面向对象学习-硬件rtc设备

目录

        • 1.硬件rtc设备基类
        • 2.硬件rtc设备基类的子类
        • 3.初始化/构造流程
          • 3.1设备驱动层
          • 3.2 设备驱动框架层
          • 3.3 设备io管理层
        • 4.总结
        • 5.使用
1.硬件rtc设备基类

此层处于设备驱动框架层。此层的类是抽象类

在/ components / drivers / include / drivers 下的rtc.h定义了如下rtc设备基类

typedef struct rt_rtc_device

{

struct rt_device parent;

const struct rt_rtc_ops *ops;

} rt_rtc_dev_t;

rtc设备基类继承自设备基类,然后增加私有方法成为新的类------rtc设备基类。

rtc设备基类的方法定义如下

struct rt_rtc_ops

{

rt_err_t (*init)(void);

rt_err_t (*get_secs)(time_t *sec);

rt_err_t (*set_secs)(time_t *sec);

rt_err_t (*get_alarm)(struct rt_rtc_wkalarm *alarm);

rt_err_t (*set_alarm)(struct rt_rtc_wkalarm *alarm);

rt_err_t (*get_timeval)(struct timeval *tv);

rt_err_t (*set_timeval)(struct timeval *tv);

};

2.硬件rtc设备基类的子类

此层是设备驱动层,此类是实现类,由各个bsp实现。例如

/ bsp / stm32 / libraries / HAL_Drivers / drivers 下的drv_rtc.c定义的stm32 rtc类。

其他芯片厂家如此这般一样。

3.初始化/构造流程

以stm32为例,从设备驱动层、设备驱动框架层到设备io管理层从下到上的构造/初始化流程如下

3.1设备驱动层

此层是bsp层,可以实例化的终类地。

文件:

/ bsp / stm32 / libraries / HAL_Drivers / drivers 下的drv_rtc.c。

定义了stm32的硬件rtc设备类

struct rtc_device_object

{

rt_rtc_dev_t rtc_dev;

#ifdef RT_USING_ALARM

struct rt_rtc_wkalarm wkalarm;

#endif

};

stm32的硬件rtc设备类继承自rtc设备基类,如果menuconfig开启了rtc的闹钟,还得加上闹钟结构体。

struct rt_rtc_wkalarm

{

rt_bool_t enable; /* 0 = alarm disabled, 1 = alarm enabled /
rt_int32_t tm_sec; /
alarm at tm_sec /
rt_int32_t tm_min; /
alarm at tm_min /
rt_int32_t tm_hour; /
alarm at tm_hour /
rt_int32_t tm_mday; /
alarm at tm_mday /
rt_int32_t tm_mon; /
alarm at tm_mon /
rt_int32_t tm_year; /
alarm at tm_year */

};

实例化了stm32的硬件rtc设备:

static struct rtc_device_object rtc_device;

只有一个rtc设备对象,只支持一个rtc。

重写了硬件rtc设备基类的方法:

static const struct rt_rtc_ops stm32_rtc_ops =

{

stm32_rtc_init,

stm32_rtc_get_secs,

stm32_rtc_set_secs,

stm32_rtc_get_alarm,

stm32_rtc_set_alarm,

stm32_rtc_get_timeval,

RT_NULL,

};

int rt_hw_rtc_init中开启stm32的硬件rtc设备的初始化:

重写rtc设备基类的方法

rtc_device.rtc_dev.ops = &stm32_rtc_ops;

然后调用/ components / drivers /rtc/rtc.c的rt_hw_rtc_register对rtc设备基类进行初始化。

rt_hw_rtc_register(&rtc_device.rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR, RT_NULL);

3.2 设备驱动框架层

/ components / drivers /rtc 下的rtc.c实现了设备驱动框架层接口rt_hw_rtc_register,是硬件rtc设备驱动框架层的入口,开启rtc设备基类的构造/初始化流程。

该层重写了rtc设备基类的父类------设备基类------的方法:

#ifdef RT_USING_DEVICE_OPS

device->ops = &rtc_core_ops;

#else

device->init = rt_rtc_init;

device->open = rt_rtc_open;

device->close = rt_rtc_close;

device->read = RT_NULL;

device->write = RT_NULL;

device->control = rt_rtc_control;

#endif /* RT_USING_DEVICE_OPS */

并最终调用设备基类的构造函rt_device_register。

3.3 设备io管理层

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

它将stm32 硬件rtc设备对象放到对象容器里管理。

4.总结

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

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

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

5.使用

文档

相关推荐
立志成为大牛的小牛1 小时前
数据结构——二十六、邻接表(王道408)
开发语言·数据结构·c++·学习·程序人生
Olrookie2 小时前
若依前后端分离版学习笔记(二十)——实现滑块验证码(vue3)
java·前端·笔记·后端·学习·vue·ruoyi
请你喝好果汁6412 小时前
Conda_bashrc 初始化机制学习笔记
笔记·学习·conda
maxruan3 小时前
PyTorch学习
人工智能·pytorch·python·学习
MYX_3093 小时前
第三章 线型神经网络
深度学习·神经网络·学习·算法
_李小白3 小时前
【Android Gradle学习笔记】第八天:NDK的使用
android·笔记·学习
Jose_lz5 小时前
C#开发学习杂笔(更新中)
开发语言·学习·c#
QT 小鲜肉5 小时前
【个人成长笔记】Qt 中 SkipEmptyParts 编译错误解决方案及版本兼容性指南
数据库·c++·笔记·qt·学习·学习方法
A9better5 小时前
嵌入式开发学习日志41——stm32之SPI总线基本结构
stm32·单片机·嵌入式硬件·学习
Lynnxiaowen6 小时前
今天我们学习python编程常用模块与面向对象
运维·python·学习·云计算