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

文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/685902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 教程 目录

17.3 图像处理17.3.1 像素处理17.3.1.1 逆反(底片)17.3.1.2 曝光17.3.1.3 灰度17.3.1.4 浮雕17.3.1.5 二值化(黑白)17.3.1.6 自定义处理17.3.2 内存处理17.3.2.1 Bitmap.LockBits方法和Bitmap.UnlockBits方法17.3.2.2 BitmapData类…

Windows11即将停止支持部分旧CPU

Windows11的官方硬件需求高于Windows10,当然网上有很多插件,可以绕过硬件检查,升级win10到win11。 在一些低配的Windows10 PC上运行Windows11基本不会带来任何后果。通过破解插件,一般用户甚至可以在WindowsXP时代的英特尔酷容2&…

【笔记】常用方法

Arrays工具类 使用Arrays.sort( )对自定义类进行排序的时候&#xff0c;这个类需要实现(implements) Comparable<类名>&#xff0c;然后重写compareTo( )这个方法。 Lambda表达式 Lambda表达式&#xff0c;必须要有一个接口类&#xff0c;并且这个接口类中只有有一个抽象…

硬盘合并分区失败显示未格式化怎么办?看这里

在当今数字化时代&#xff0c;硬盘分区已成为计算机存储管理的重要手段。然而&#xff0c;在使用过程中&#xff0c;我们有时会遇到“合并分区失败显示未格式化”的问题&#xff0c;这不仅影响了我们的工作效率&#xff0c;还可能造成数据丢失的风险。下面将根据不同情况给予不…

C语言什么叫逻辑短路?

一、问题 只有电路中才听说过短路。逻辑短路&#xff0c;不像是什么好词⼉。这个词不是描述⼈的&#xff0c;是描述C语⾔程序的。它是程序执⾏时的⼀种特殊的跳跃状态。那么逻辑短路具体是什么呢&#xff1f; 二、解答 C语⾔中&#xff0c;表⽰条件时⽤关系表达式&#xff0c;…

c# BlockingCollection 清空

BlockingCollection<T>在C#中是一个线程安全的集合&#xff0c;用于并发场景。它不提供一个直接的Clear方法&#xff0c;因为这样在多线程环境下可能会引入竞争条件和其他线程安全问题。 如果你真的需要清空这个集合&#xff0c;你可以通过手动取出每一个元素来实现。以下…

数据库事务的4个特性(ACID)

数据库事务具有四个重要的特性&#xff0c;通常称为ACID特性&#xff0c;分别是原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;。下面分别对四种特…

【LeetCode: 107. 二叉树的层序遍历 II + BFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

相机的机身马达有什么用?

新手疑问&#xff1a; 为什么我的尼康D3200相机明明拥有拍视频能力&#xff0c;但是拍摄视频时却不能对焦 科普时间 那是因为你的相机缺少机身马达&#xff0c;并且你所使用的镜头也没有马达!机身马达是用于给镜头提供对焦动力的装置。它的作用是使相机具备自动对焦功能。如…

TCP常见问题详解

本篇文章我们介绍一下 在我们的面试中和实际开发中使用TCP遇到的问题 1.TCP在什么情况下出现大量的time_event 什么是time_event&#xff1f; 我们首先要弄清楚TIME_WAIT状态是什么&#xff1f;TIME_WAIT状态是主动关闭TCP连接的一方&#xff08;即先发起FIN包的一方&#xf…

node+vue3+mysql前后分离开发范式——实现视频文件上传并渲染

文章目录 ⭐前言⭐ 功能设计与实现💖 node上传文件写入file_map映射表💖 vue3前端上传文件回显⭐ 效果⭐结束⭐前言 大家好,我是yma16,本文分享关于 node+vue3+mysql前后分离开发范式——实现视频文件上传并渲染。 技术选型 前端:vite+vue3+antd 后端:node koa 数据库…

有了NULL,为什么C++还需要nullptr?

目录 1.引言 2.类型安全 3.函数重载 4.代码清晰性 5.示例 6.总结 1.引言 在C编程中&#xff0c;nullptr是一个类型安全的空指针常量&#xff0c;自C11起被引入。然而&#xff0c;在此之前&#xff0c;程序员们通常使用NULL或0来表示空指针。那么&#xff0c;为什么有了N…

在 MySQL 数据库中创建新账号并分配权限

本文介绍如何在 MySQL 数据库中创建新账号并为其分配特定数据库实例的权限。 一、连接到 MySQL 数据库 首先&#xff0c;使用 MySQL 客户端或其他数据库管理工具连接到 MySQL 数据库服务器。你可以使用以下命令。 mysql -u root -p 然后输入密码以登录到 MySQL。 二、创建新…

Leetcode 496. 下一个更大元素 I

题意理解&#xff1a; nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 &#xff0c;下标从 0 开始计数&#xff0c;其中nums1 是 nums2 的子集。 对于每个 0 < i < nums1.le…

JVM-垃圾回收(标记算法,收集器)

申明&#xff1a;文章内容是本人学习极客时间课程所写&#xff0c;文字和图片基本来源于课程资料&#xff0c;在某些地方会插入一点自己的理解&#xff0c;未用于商业用途&#xff0c;侵删。 原资料地址&#xff1a;课程资料 垃圾回收的基本原理 1 什么是垃圾&#xff1f; 在…

Linux :sh、可执行文件,无法使用. / 安装执行

问题 1. 我写了个 lib.sh 文件&#xff0c;发现我可以用 sh lib.sh 来执行&#xff0c;都是无法用 ./lib.sh执行。 2. 我发现当这个 lib.sh 文件用 ./lib.sh 无法执行的时候&#xff0c;我在终端打出 "./li " 它是无法帮我自动补全的。 其实就是这个时候 lib.s…

re:从0开始的CSS之旅 20. 渐变(暂完结撒花)

1. 渐变 渐变&#xff1a;使背景颜色有逐渐变化的效果 1. 线性渐变 background-image: linear-gradient(to left top, #c7edcc, #fde6e0, #dce2f1); 第一个参数可选值为&#xff1a; to top/right/left/bottom/top right/…… 第二个参数到第n个参数为需要渐变的颜色&#…

阿里云ECS香港服务器性能强大_安全可靠香港免备案服务器

阿里云香港服务器中国香港数据中心网络线路类型BGP多线精品&#xff0c;中国电信CN2高速网络高质量、大规格BGP带宽&#xff0c;运营商精品公网直连中国内地&#xff0c;时延更低&#xff0c;优化海外回中国内地流量的公网线路&#xff0c;可以提高国际业务访问质量。阿里云服务…

视觉slam十四讲学习笔记(六)视觉里程计 1

本文关注基于特征点方式的视觉里程计算法。将介绍什么是特征点&#xff0c;如何提取和匹配特征点&#xff0c;以及如何根据配对的特征点估计相机运动。 目录 前言 一、特征点法 1 特征点 2 ORB 特征 FAST 关键点 BRIEF 描述子 3 特征匹配 二、实践&#xff1a;特征提取…

《Linux 简易速速上手小册》第2章: 命令行的艺术(2024 最新版)

文章目录 2.1 基本 Linux 命令2.1.1 重点基础知识2.1.2 重点案例&#xff1a;整理下载文件夹2.1.3 拓展案例 1&#xff1a;批量重命名文件2.1.4 拓展案例 2&#xff1a;查找并删除特定文件 2.2 文件和目录管理2.2.1 重点基础知识2.2.2 重点案例&#xff1a;部署一个简单的网站2…