RT-Thread-快速入门-2-时钟与定时器

news2024/11/19 3:50:12

时钟与定时器


在这里插入图片描述


阅读须知

在这里插入图片描述


定义与作用

定义

系统时钟

  • 系统时钟在RT-Thread中用于管理时间,为系统运行提供时间基准。
  • 系统时钟由硬件计时器(通常是CPU的内部定时器或外部定时器)提供时钟节拍,这些时钟节拍通常以固定频率中断CPU,更新系统时间。
  • 在RT-Thread中,系统时钟的节拍频率可以配置,这直接影响了操作系统的调度精度和定时器的分辨率。
  • 例如,如果系统时钟的节拍频率设置为1000Hz,那么系统的时间精度为1ms。

定时器

  • RT-Thread 提供了两种类型的定时器:一次性定时器和周期性定时器。

    • 一次性定时器:设置一定的延迟时间后执行一次指定的回调函数。一次性定时器在执行回调函数后自动停止。
    • 周期性定时器:以固定的周期重复执行回调函数。周期性定时器在启动后会按照预设的周期不断地重复执行,直到被手动停止。
  • 定时器的使用通常包括以下几个步骤:

    • 定义并创建定时器:指定定时器的回调函数、回调函数的参数、定时器的类型(一次性或周期性)、以及定时器的时间周期。
    • 启动定时器:根据定时器的配置,启动定时器。一旦启动,定时器将在指定的延迟或周期后执行其回调函数。
    • 停止定时器(如果需要):可以在任何时候停止定时器,阻止其再次回调。
    • 删除定时器:当不再需要定时器时,可以删除它,释放相关资源。
  • 定时器可用于多种场景,如周期性检查资源状态、延迟执行任务、实现非阻塞等待等。


举例-通俗

  • 在解释系统时钟和定时器之间的关系时,我们可以将其比作 Leon的工作任务和时间管理。

系统时钟

  • Leon有块手表 | 嵌入式系统有个时钟 -> 想象一下,系统时钟就像是办公室里的墙钟,它为整个工作环境提供了统一的时间基准。
  • Leon看着手表确定干活方式 | 嵌入式系统根据时钟安排任务执行 -> 墙钟每走一秒,Leon就会根据这个时间来安排和调整自己的工作和休息。在嵌入式系统中,系统时钟(通常通过硬件定时器实现)为整个系统提供这样的时间基准。
  • Leon的手表每秒走的一样快 | 嵌入式系统的时钟运行在一个可设置的固定的频率 -> 嵌入式系统以固定的频率(称为"时钟节拍")更新系统时间,帮助系统调度任务和管理时间。
  • 系统中的所有时间相关活动,比如任务切换、时间延迟等,都是根据这个系统时钟来进行的。

定时器

  • Leon 有一个任务清单,按照任务清单对照手表执行任务 | 嵌入式板 有一个定时器,按照定时器对照系统时钟 执行任务 -> 定时器是日程安排者,它根据你的代码描述的需求设定特定时间点或时间段来催动嵌入式板卡执行任务
  • Leon的任务清单可以设置每天任务也可以设置一次性任务 -> 定时器可以是一次性的,或者可以是周期性的

两者之间的关系

  • 系统时钟和定时器之间的关系可以看作是时间基准与个人时间管理工具之间的关系。
  • 系统时钟提供了一个持续的时间流,就像不断前进的墙钟,而定时器则利用这个时间流来安排特定的活动或任务。
  • 没有系统时钟(墙钟),定时器就无法准确知道当前时间,也就无法准确地安排活动。
  • 同时,如果没有定时器(日程安排者),你可能会错过重要的任务或会议,因为你没有一个工具来提醒你在特定时间做特定的事情。

在嵌入式系统中,这种关系允许开发者创建可以精确控制何时启动任务或触发事件的应用程序,从而使系统能够有效地管理时间和资源。


示例代码

  • 在这个示例中,创建了一个周期性定时器,每秒钟打印一次"Timeout!"。这展示了如何在RT-Thread系统中使用定时器来实现周期性任务。
#include <rtthread.h>

// 定时器的回调函数
static void timeout_cb(void* parameter)
{
    rt_kprintf("Timeout!\n");
}

int main(void)
{
    // 创建定时器
    static rt_timer_t timer;
    timer = rt_timer_create("demo",   // 定时器名称
                            timeout_cb,   // 定时器回调函数
                            RT_NULL,      // 传递给回调函数的参数
                            RT_TICK_PER_SECOND, // 定时时间,这里是1秒
                            RT_TIMER_FLAG_PERIODIC); // 定时器类型,周期性

    // 启动定时器
    if (timer != RT_NULL)
    {
        rt_timer_start(timer);
    }

    return 0;
}

逐行解释 代码

#include <rtthread.h> // 引入RT-Thread头文件,提供RTOS的功能支持。

// 定时器的回调函数定义。
static void timeout_cb(void* parameter)
{
    rt_kprintf("Timeout!\n"); // 当定时器到时间时,输出"Timeout!"。
}

int main(void)
{
    // 定义一个定时器变量。
    static rt_timer_t timer;
    // 创建一个定时器:
    // "demo"为定时器的名称;
    // timeout_cb为定时到期时调用的回调函数;
    // RT_NULL表示没有传递参数给回调函数;
    // RT_TICK_PER_SECOND定义了定时时间,这里设置为1秒,即每秒触发一次;
    // RT_TIMER_FLAG_PERIODIC表示定时器是周期性的,即会重复触发。
    timer = rt_timer_create("demo", timeout_cb, RT_NULL, RT_TICK_PER_SECOND, RT_TIMER_FLAG_PERIODIC);

    // 启动定时器
    // 检查定时器是否创建成功,如果成功,则启动它。
    if (timer != RT_NULL)
    {
        rt_timer_start(timer); // 启动定时器,定时器开始计时。
    }

    return 0; // 程序正常结束。
}


在这里插入图片描述

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

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

相关文章

opengl 学习纹理

一.纹理是什么&#xff1f; 纹理是一个2D图片&#xff08;甚至也有1D和3D的纹理&#xff09;&#xff0c;它可以用来添加物体的细节&#xff1b;类似于图像一样&#xff0c;纹理也可以被用来储存大量的数据&#xff0c;这些数据可以发送到着色器上。 采样是指用纹理坐标来获取纹…

npm install 失败,需要node 切换到 对应版本号

npm install 失败 原本node 的版本号是16.9&#xff0c;就会报以上错误 node版本问题了&#xff0c;我切到这个版本&#xff0c;报同样的错。降一下node&#xff08;14.18&#xff09;版本就好了 具体的方法&#xff1a;&#xff08;需要在项目根目录下切换&#xff09; 1. …

微服务学习

一、服务注册发现 服务注册就是维护一个登记簿&#xff0c;它管理系统内所有的服务地址。当新的服务启动后&#xff0c;它会向登记簿交待自己的地址信息。服务的依赖方直接向登记簿要Service Provider地址就行了。当下用于服务注册的工具非常多ZooKeeper&#xff0c;Consul&am…

JavaScript从零写网站《一瞬》开发日志20240223

产品介绍 一个无需注册能随时发布图片并配一段文字介绍的app&#xff0c;有时间线&#xff0c;用户在主页面向下滑动&#xff0c;可以看到被发布的若干图片&#xff0c;并且能够在每一个发布处做基本互动——评论&#xff0c;点赞 编程语言 本产品使用htmlcssJavaScript开发…

【Docker】构建pytest-playwright镜像并验证

Dockerfile FROM ubuntu LABEL maintainer "langhuang521l63.com" ENV TZAsia/Shanghai #设置时区 #安装python3依赖与下载安装包 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \&& apt update \&&…

Linux——进程概念

目录 冯诺依曼体系结构 操作系统 管理 系统调用和库函数 进程的概念 进程控制块——PCB 查看进程 通过系统调用获取进程标示符 通过系统调用创建进程 进程状态 运行状态-R ​编辑 浅度睡眠状态-S 深度睡眠状态-D 暂停状态-T 死亡状态-X 僵尸状态-Z 僵尸进程…

Open CASCADE学习|绘制砂轮

今天绘制一个砂轮&#xff0c;其轮廓由两条直线段和两段圆弧构成&#xff0c;圆弧分别与直线相切&#xff0c;两条圆弧之间相交而非相切。建模思路是&#xff1a;先给定两条直线段的起始点及长度&#xff0c;画出直线段&#xff0c;然后给定其中一圆弧的半径及圆心角&#xff0…

Linux之ACL访问控制列表

一、ACL权限的介绍 1.1 什么是ACL 访问控制列表&#xff08;ACL&#xff09;是一种网络安全技术&#xff0c;它通过在网络设备&#xff08;如路由器、交换机和防火墙&#xff09;上定义一系列规则&#xff0c;对进出接口的数据包进行控制。这些规则可以包含“允许”&…

解决IDEA中Maven下载依赖包过慢或报错的问题

由于公司项目迭代&#xff0c;越来越多的项目开始转型新版本&#xff0c;由于我对Java一直不感冒&#xff0c;但要顺应公司项目要求&#xff0c;遂自己要逐步开始完善Java相关的知识层面&#xff0c;此篇是我在学习SpringBoot时对一些不懂地方及遇到问题时的记录。 学习视频链…

Day 1.进程的基本概念、相关命令、函数结口

进程基本概念 一、进程&#xff1a; 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程&#xff0c;包括进程的创建、进程的调度、进程的消亡 二、进程相关的命令 1.top 动态查看当前系统中所有的进程信息&#xff08;根据CPU…

基于PostGIS的慢查询引起的空间索引提升实践

目录 前言 一、问题定位 1、前端接口定位 2、后台应用定位 3、找到问题所在 二、空间索引优化 1、数据库查询 2、创建空间索引 3、geography索引 4、再看前端响应 总结 前言 这是一个真实的案例&#xff0c;也是一个新入门的工程师很容易忽略的点。往往在设计数据库的…

项目管理:如何成功完成一个项目

项目管理是一项重要的技能&#xff0c;它可以帮助你成功地完成一个项目。以下是一些关键的步骤&#xff0c;可以帮助你实现这一目标&#xff1a; 1. 明确项目目标&#xff1a;在开始项目之前&#xff0c;你需要明确项目的目标。这将有助于你制定一个明确的计划&#xff0c;并确…

最长公共前缀【简单】

题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例如下&#xff1a; 所给提示如下&#xff1a; 1 < strs.length < 2000 < strs[i].length < 200strs[i] 仅由小写英文字母组成 解题 根据…

iOS面试:4.多线程GCD

一、多线程基础知识 1.1 什么是进程&#xff1f; 进程是指在系统中正在运行的一个应用程序。对于电脑而已&#xff0c;你打开一个软件&#xff0c;就相当于开启了一个进程。对于手机而已&#xff0c;你打开了一个APP&#xff0c;就相当于开启了一个进程。 1.2 什么是线程&am…

反序列化字符串逃逸 [安洵杯 2019]easy_serialize_php1

打开题目 $_SESSION是访客与整个网站交互过程中一直存在的公有变量 然后看extract()函数的功能&#xff1a; extract($_POST)就是将post的内容作为这个函数的参数。 extract() 函数从数组中将变量导入到当前的符号表(本题的作用是将_SESSION的两个函数变为post传参) function…

MySql-DQL-条件查询

目录 条件查询修改数据 查询 姓名 为 Name10 的员工查询 id小于等于5 的员工信息查询 没有分配职位 的员工信息查询 有职位 的员工信息查询 密码不等于 password1 的员工信息查询 入职日期 在 2000-01-01 (包含) 到 2010-01-01(包含) 之间的员工信息查询 入职时间 在 2000-01-0…

linux之权限管理(实施必会!!!!)

文章目录 一、什么是ACL二、操作步骤2.1. 添加测试目录&#xff0c;用户&#xff0c;组&#xff0c;并将用户添加到组2.2.查看组是否正常建立 cat /etc/group2.3设定权限2.4此时需要为临时用户进行权限&#xff1a; r-x 三、ACL中mask修改最大权限四、ACL权限的删除五、ACL权限…

pclpy KD-Tree K近邻搜索

pclpy KD-Tree K近邻搜索 一、算法原理1.KD-Tree 介绍2.原理 二、代码三、结果1.原点云2.k近邻点搜索后的点云 四、相关数据 一、算法原理 1.KD-Tree 介绍 kd 树或 k 维树是计算机科学中使用的一种数据结构&#xff0c;用于在具有 k 维的空间中组织一定数量的点。它是一个二叉…

MybatisPlus--03--IService、ServiceImpl

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. IService接口1.1 IService、ServiceImpl 接口的使用第一步&#xff1a;实现basemapper接口第二步&#xff1a;编写service类第三步&#xff1a;编写serviceImpl第…

【统计分析数学模型】判别分析(三):Bayes判别法

【统计分析数学模型】判别分析&#xff08;三&#xff09;&#xff1a;Bayes判别法 一、Bayes判别法二、R语言实现Bayes判别法1. 运行NaiveBayes()函数2. 绘制密度曲线3. 计算回判正确率 一、Bayes判别法 Bayes判别法假定对研究对象有一定的认识&#xff0c;这种认识用先验概率…