当前位置: 首页 > news >正文

rtt的io设备框架面向对象学习-软件模拟rtc设备

目录

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

硬件rtc和软件rtc设备是互斥的。因为它们的名字都叫"rtc",在对象容器中不允许重名。

软件rtc设备比较特殊,不依赖于任何硬件,所以它是硬件无关的,所以不需要各个bsp去实现的所以它没有驱动层,只在设备驱动框架层就完成了。

1.软件rtc设备实现类

软件rtc设备比较特殊,直接设备驱动框架层实现了。

在/ components / drivers / rtc / soft_rtc.c实例化了软件rtc设备类static struct rt_device soft_rtc_dev。

软件rtc设备类可以认为继承自设备基类,只是没有任何自己的私有方法而已。
这就类似c++中一个类继承一个抽象类,这个类重写纯虚方法。
对象图如下:

2.软件rtc设备类的子类

无。
因为软件rtc设备比较特殊,不依赖于任何硬件,所以它是硬件无关的,所以不需要各个bsp去实现的所以它没有驱动层,只在设备驱动框架层就完成了。

3.初始化/构造流程

软件rtc设备对象的构造流程是通用的,且只是从设备驱动框架层到设备io管理层的构造。

3.1 设备驱动框架层

/ components / drivers /rtc/soft_rtc.c实现了实例化了软件rtc设备对象,
rt_soft_rtc_init开启软件rtc设备对象的构造流程:
先重写了rtc设备基类的父类——设备基类——的方法:
#ifdef RT_USING_DEVICE_OPS
soft_rtc_dev.ops = &soft_rtc_ops;
#else
soft_rtc_dev.init = RT_NULL;
soft_rtc_dev.open = RT_NULL;
soft_rtc_dev.close = RT_NULL;
soft_rtc_dev.read = RT_NULL;
soft_rtc_dev.write = RT_NULL;
soft_rtc_dev.control = soft_rtc_control;
#endif

然后调用设备基类的构造函rt_device_register开启设备基类的构造流程。

3.3 设备io管理层

在/ components / drivers / core 下的device.c中实现了rt_device_register,它是io管理层的入口。
它将软件rtc设备对象放到对象容器里管理。

4.总结

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

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

5.使用

文档

相关文章:

  • WebGL中开发科学数据可视化应用
  • 2.20数据结构与算法学习日记(二叉树第一部分)
  • 利用MATLAB/Simulink仿真模型加速嵌入式控制系统的开发——以多学科融合的电机控制为例
  • ubuntu分辨率更改、开机被重置、ubuntu屏幕小
  • 【Git教程】(二)入门 ——关于工作区与版本库、版本提交、查看信息、克隆、推送与拉回的简单介绍 ~
  • Spring Boot项目怎么对System.setProperty(key, value)设置的属性进行读取加解密
  • 02 环境配置
  • 并发编程入门指南
  • Sectigo多域名ssl证书加域名贵吗
  • c# 线性代数 克·施密特(Gram Schmidt)
  • Qt C++春晚刘谦魔术约瑟夫环问题的模拟程序
  • vue3+element Plus+ts 自定义主题色,以及生成主题色各种透明度
  • 【Docker】基于yum安装docker
  • uniapp富文本文字长按选中(用于复制,兼容H5、APP、小程序三端)
  • 代码随想录算法训练营|day32
  • (三)从jvm层面了解线程的启动和停止
  • 78. Subsets
  • Android系统模拟器绘制实现概述
  • co.js - 让异步代码同步化
  • Docker: 容器互访的三种方式
  • Java编程基础24——递归练习
  • nodejs调试方法
  • ReactNative开发常用的三方模块
  • Wamp集成环境 添加PHP的新版本
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 看域名解析域名安全对SEO的影响
  • 强力优化Rancher k8s中国区的使用体验
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (2.2w字)前端单元测试之Jest详解篇
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (一) storm的集群安装与配置
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)iOS字体
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .bashrc在哪里,alias妙用
  • .net CHARTING图表控件下载地址
  • .Net FrameWork总结
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .net访问oracle数据库性能问题
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [asp.net core]project.json(2)
  • [ASP]青辰网络考试管理系统NES X3.5
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [C++基础]-入门知识
  • [EFI]Atermiter X99 Turbo D4 E5-2630v3电脑 Hackintosh 黑苹果efi引导文件
  • [GYCTF2020]Ez_Express
  • [Linux]进程间通信(进程间通信介绍 | 匿名管道 | 命名管道)