rtt的io设备框架面向对象学习-硬件定时器设备

news2024/9/25 7:26:13

目录

    • 1.硬件定时器设备类对象图全貌
    • 2.stm32硬件定时器设备类及其构造函数
    • 3 硬件定时器设备基类及其构造函数
    • 4 设备基类及其构造函数
    • 5.总结
    • 6.内部调用流程
    • 7.应用程序使用流程

1.硬件定时器设备类对象图全貌

请添加图片描述
设备驱动层的硬件定时器类是实现类,是需要各个BSP实现的。其继承自设备驱动框架层的硬件定时器设备基类。一般设备驱动框架层及以上的类都是rtt官方写好的抽象类

上图采用c++的纯虚函数来表示需要子类实现的父类方法——或者说是父类对子类的约束,当然在rtt的oopc中是通过函数指针实现的。

可以看到设备驱动层是stm32硬件定时器或者别的芯片厂家的硬件定时器类的所在。
rtt的oopc中每类都有对应的构造函数(初始化函数)。

以对象图中stm32硬件定时器设备类为起点分析其类定义和构造函数。

2.stm32硬件定时器设备类及其构造函数

如第1节对象图,在/ bsp / stm32 / libraries / HAL_Drivers / drivers /drv_tim.c中定义了stm32硬件定时器设备类及其构造函数,如下

类定义:

struct stm32_hwtimer
{
    rt_hwtimer_t time_device;
    TIM_HandleTypeDef    tim_handle;
    IRQn_Type tim_irqn;
    char *name;
};

类实例化

static struct stm32_hwtimer stm32_hwtimer_obj[] =

其构造函数

static int stm32_hwtimer_init(void)
{
    int i = 0;
    int result = RT_EOK;

    for (i = 0; i < sizeof(stm32_hwtimer_obj) / sizeof(stm32_hwtimer_obj[0]); i++)
    {
        stm32_hwtimer_obj[i].time_device.info = &_info;
        stm32_hwtimer_obj[i].time_device.ops  = &_ops;//重写父类方法
        if (rt_device_hwtimer_register(&stm32_hwtimer_obj[i].time_device,
            stm32_hwtimer_obj[i].name, &stm32_hwtimer_obj[i].tim_handle) == RT_EOK)
        {
            LOG_D("%s register success", stm32_hwtimer_obj[i].name);
        }
        else
        {
            LOG_E("%s register failed", stm32_hwtimer_obj[i].name);
            result = -RT_ERROR;
        }
    }

    return result;
}
INIT_BOARD_EXPORT(stm32_hwtimer_init);

可以看到,stm32_hwtimer_init是stm32硬件定时器设备类的构造函数,它所干的事,主要是重写父类的方法,如下定义

static const struct rt_hwtimer_ops _ops =
{
    .init = timer_init,
    .start = timer_start,
    .stop = timer_stop,
    .count_get = timer_counter_get,
    .control = timer_ctrl,
};

然后调用其父类——硬件定时器设备基类——的构造函数rt_device_hwtimer_register完成接下来的构造流程。

3 硬件定时器设备基类及其构造函数

在/ components / drivers / include / drivers /hwtimer.h中定义了硬件定时器设备基类:

typedef struct rt_hwtimer_device
{
    struct rt_device parent;
    const struct rt_hwtimer_ops *ops;
    const struct rt_hwtimer_info *info;

    rt_int32_t freq;                /* counting frequency set by the user */
    rt_int32_t overflow;            /* timer overflows */
    float period_sec;
    rt_int32_t cycles;              /* how many times will generate a timeout event after overflow */
    rt_int32_t reload;              /* reload cycles(using in period mode) */
    rt_hwtimer_mode_t mode;         /* timing mode(oneshot/period) */
} rt_hwtimer_t;

其中需要子类实现的方法定义如下

struct rt_hwtimer_ops
{   
     void (*init)(struct rt_hwtimer_device *timer, rt_uint32_t state);    
     rt_err_t (*start)(struct rt_hwtimer_device *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode);    
     void (*stop)(struct rt_hwtimer_device *timer);    
     rt_uint32_t (*count_get)(struct rt_hwtimer_device *timer);    
     rt_err_t (*control)(struct rt_hwtimer_device *timer, rt_uint32_t cmd, void *args);
 };

可以看到第一个形参是本类的指针——这就模拟了面向对象的this指针

在/ components / drivers /hwtimer/hwtimer.c中实现了该类的构造函数rt_device_hwtimer_register,如下:

rt_err_t rt_device_hwtimer_register(rt_hwtimer_t *timer, const char *name, void *user_data)
{
    struct rt_device *device;

    RT_ASSERT(timer != RT_NULL);
    RT_ASSERT(timer->ops != RT_NULL);
    RT_ASSERT(timer->info != RT_NULL);

    device = &(timer->parent);

    device->type        = RT_Device_Class_Timer;
    device->rx_indicate = RT_NULL;
    device->tx_complete = RT_NULL;

#ifdef RT_USING_DEVICE_OPS
    device->ops         = &hwtimer_ops;
#else
    device->init        = rt_hwtimer_init;
    device->open        = rt_hwtimer_open;
    device->close       = rt_hwtimer_close;
    device->read        = rt_hwtimer_read;
    device->write       = rt_hwtimer_write;
    device->control     = rt_hwtimer_control;
#endif
    device->user_data   = user_data;

    return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE);
}

同样的套路,该类的构造函数主要是重写其父类(设备基类)的方法,硬件定时器的父类方法rtt写好了,

device->init        = rt_hwtimer_init;
device->open        = rt_hwtimer_open; 
device->close       = rt_hwtimer_close; 
device->read        = rt_hwtimer_read;   
device->write       = rt_hwtimer_write;

其都是被父类管理接口调用所以其函数的第一个形参都是父类的指针——模拟面向对象的this指针

然后调用其父类——
设备基类——的构造函rt_device_register来继续接下来的构造流程。

4 设备基类及其构造函数

详细参见io设备管理层。https://blog.csdn.net/yhb1206/article/details/136440373

5.总结

参见rtt的oopc实现特点。

6.内部调用流程

参见内部调用流程。

7.应用程序使用流程

参见官方文档。

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

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

相关文章

《数据结构学习笔记---第五篇》---链表OJ练习下

step1:思路分析 1.实现复制&#xff0c;且是两个独立的复制&#xff0c;我们必须要理清指针之间的逻辑&#xff0c;注意random的新指针要链接到复制体的后面。 2.我们先完成对于结点的复制&#xff0c;并将复制后的结点放在原节点的后面&#xff0c;并链接。 3.完成random结点…

Linux常用命令-文件操作

文章目录 ls基本用法常用选项组合选项示例注意事项 cd基本用法示例注意事项 pwd基本用法示例选项总结 cp基本用法常见选项示例注意事项 rm基本用法常见选项示例删除单个文件&#xff1a;交互式删除文件&#xff1a;强制删除文件&#xff1a;递归删除目录&#xff1a;交互式递归…

腾讯云优惠券、代金券、云服务器折扣券领取渠道汇总

目前&#xff0c;云计算市场竞争太激烈了&#xff0c;为了吸引用户上云&#xff0c;腾讯云经常推出各种优惠活动&#xff0c;其中就包括优惠券、代金券和云服务器折扣券等。本文将为大家汇总腾讯云优惠券、代金券及云服务器折扣券的领取渠道&#xff0c;帮助大家轻松获取优惠&a…

蓝桥杯java组 最少砝码

问题描述】 你有一架天平。现在你要设计一套砝码&#xff0c;使得利用这些砝码可以称出任意小于等于 N 的正整数重量。 那么这套砝码最少需要包含多少个砝码&#xff1f; 注意砝码可以放在天平两边。 【输入格式】 输入包含一个正整数 N。 【输出格式】 输出一个整数代表答案…

了解微信小程序开发流程

前言&#xff1a;本文只适合初学者了解大致开发流程&#xff0c;好让后续学习胸有成竹&#xff0c;有条不紊 1、开发准备 ① 在微信公众平台 (qq.com)完成微信小程序账号注册 ②下载安装微信小程序开发者工具 2、创建项目 新建 新建时需要的appid&#xff0c;在微信公众平…

【物联网项目】基于ESP8266的家庭灯光与火情智能监测系统——文末完整工程资料源码

目录 系统介绍 硬件配置 硬件连接图 系统分析与总体设计 系统硬件设计 ESP8266 WIFI开发板 人体红外传感器模块 光敏电阻传感器模块 火焰传感器模块 可燃气体传感器模块 温湿度传感器模块 OLED显示屏模块 系统软件设计 温湿度检测模块 报警模块 OLED显示模块 …

开源AI引擎:自然语言处理技术在人岗匹配中的应用

一、应用场景介绍 如何从海量的求职者中精准地匹配到合适的候选人&#xff0c;是每个人力资源部门都需要解决的问题。自然语言处理&#xff08;NLP&#xff09;技术的发展为人岗匹配提供了新的解决方案。通过信息抽取和文本分类技术&#xff0c;企业可以更高效地分析职位描述和…

【SpringBoot从入门到精通】03_SpringBoot自动配置原理

三、SpringBoot自动配置原理 我们通过编写SpringBoot HelloWorld程序&#xff0c;体会到了其强大与便捷&#xff0c;它的这些功能都是基于SpringBoot的依赖管理与自动配置。 3.1 核心特性 依赖管理 父项目做依赖管理 <!-- 当前项目的父项目&#xff1a;依赖管理 --> &…

JavaScript 常用方法(1):JS日期格式化函数、JS实现并列排序、JS实现数字每三位添加逗号、JS 实现根据日期和时间进行排序

1、JS日期格式化函数 JS日期格式化转换方法 /*** description 格式化时间* param fmt 格式 如&#xff1a;yyyy-MM-dd、yyyy-MM-dd HH:mm:ss、yyyy年MM月dd日 W HH:mm:ss等* param {String} date 时间戳* returns {string|null}* 对 Date 的扩展&#xff0c;将 Date 转化为指…

LangChain教程 | langchain 文本拆分器 | Text Splitters全集

在阅读本文前&#xff0c;建议先看下langchain的基础&#xff0c;最主要的是先看下langchain 文档加载器使用教程有关的内容&#xff0c;会更容易把知识串联起来。 概述 一旦加载了文档&#xff0c;您通常会想要转换它们以更好地适应您的应用程序。最简单的例子是&#xff0c;您…

使用dlv配合goland调试在wsl中运行的go程序

参考文章&#xff1a;https://marksuper.xyz/2021/06/29/dlv-goland/ 首先安装一下dlv这个工具&#xff1a; git clone GitHub - go-delve/delve: Delve is a debugger for the Go programming language. cd delve go install github.com/go-delve/delve/cmd/dlv 我们直接开始配…

数据结构 之 栈与单调栈习题 力扣oj(附加思路版)

#include<stack> --栈的头文件 栈的特点 &#xff1a; 先进后出 &#xff0c; 后进先出 相关函数&#xff1a; top() 获取栈顶元素 ,返回栈顶元素的值 pop() 删除栈顶元素 ,没有返回值 push() 放入元素 ,没有返回值 empty() 为空返回 true 否则返回false size() 元素…

Java毕业设计-基于springboot开发的疫情防控期间外出务工人员信息管理系统-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、后台登录2.1管理员功能2.2用户功能2.3采集员功能2.4分析员功能 四、毕设内容和源代码获取总结 Java毕业设计-基…

文件上传漏洞-客户端检测

本文章仅供学习参考&#xff01;&#xff01;&#xff01; 靶场环境&#xff1a;upload-labs-master/pass-1 客户端检测 客户端检测一般都是在网页上写一段 javascript 脚本&#xff0c;校验上传文件 的后缀名&#xff0c;有白名单形式也有黑名单形式。 判断方式&#xff1…

Advisor 被重复代理问题排查

问题场景 项目中存在多个 AbstractAdvisorAutoProxyCreator 且其持有的 Advisor Bean 重复 问题复现 相关代码 ResponseBodyRequiresPermissions(PermissionConstant.****)GetMapping(value "/query****.json", name "")public List<***> query…

aws 入门篇 01.aws学习的方法论

aws入门篇 01.aws学习的方法论 第1章 aws学习的方法论 aws的服务很多&#xff0c;现在应该有100多个服务了&#xff0c;怎么来学习aws呢&#xff1f; 这几年也使用了一些aws的服务&#xff0c;谈谈自己对学习aws的理解。 1.先横向&#xff0c;后纵深 比如说&#xff0c;aws最…

【Hello,PyQt】控件拖拽

在 PyQt 中实现控件拖拽功能的详细介绍 拖拽功能是现代用户界面设计中常见的交互方式之一&#xff0c;它可以提高用户体验&#xff0c;增加操作的直观性。在 PyQt 中&#xff0c;我们可以很容易地实现控件之间的拖拽功能。本文将介绍如何在 PyQt 中实现控件的拖拽功能。 如何实…

第二百二十九回

文章目录 1. 概念介绍2. 关键信息2.1 程序包名 2.2 程序图标2.3 程序id3. 内容总结 我们在上一章回中介绍了"如何在打包apk时自动签名"相关的内容&#xff0c;本章回中将介绍程序中的包名等关键信息.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…

推荐:便宜幻兽帕鲁Palworld联机游戏服务器优惠价格表

2024年全网最全的幻兽帕鲁服务器租用价格表&#xff0c;阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月&#xff0c;阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全&#xff1a; 阿里云幻…

数据结构——链表(练习题)

大家好&#xff0c;我是小锋我们继续来学习链表。 我们在上一节已经把链表中的单链表讲解完了&#xff0c;大家感觉怎么样我们今天来带大家做一些练习帮助大家巩固所学内容。 1. 删除链表中等于给定值 val 的所有结点 . - 力扣&#xff08;LeetCode&#xff09; 我们大家来分…