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

[嵌入式系统-21]:RT-Thread -7- 内核组件编程接口 - 定时器

目录

一、RT-Thread定时器

1.1 概述

1.2 定时器的种类

1.2.1 周期性

1.2.2 实时性

1.2.3 功能

二、 RT-Thread 定时器的一般步骤

2.1 步骤

2.2 Flag

2.3 示例


一、RT-Thread定时器

1.1 概述

在 RT-Thread 中,定时器是一种常用的机制,用于在指定的时间间隔内执行回调函数或发送消息

1.2 定时器的种类

在 RT-Thread 中,有多种类型的定时器可供使用。下面是几种常见的 RT-Thread 定时器类型:

1.2.1 周期性

  1. 周期性定时器(Periodic Timer):周期性定时器是一种重复触发的定时器,在每次超时后自动重新启动,并按照指定的时间间隔周期性地触发回调函数

  2. 单次定时器(One-shot Timer):单次定时器只在超时后触发一次回调函数,不会自动重启。

1.2.2 实时性

  1. 软件定时器(Software Timer):软件定时器是由软件实现的定时器,可以在任意时刻激活和停止。它通常使用计数器的方式来进行定时,并通过循环判断计数器值是否超过设定的阈值来进行超时判断。

  2. 硬件定时器(Hardware Timer):硬件定时器是通过硬件设备实现的定时器,使用硬件内部的计数器和触发机制来进行定时。硬件定时器通常具有更高的准确性和稳定性,并可以在后台运行,不受 CPU 负载的影响。

1.2.3 功能

  1. 通用定时器:实现通用功能的定时器。

  2. 软件看门狗定时器(Software Watchdog Timer):软件看门狗定时器用于监控系统的运行情况,确保系统在规定的时间内响应并进行相应操作。当系统未能在规定时间内重置看门狗定时器时,系统将被认为发生故障,并执行相应的错误处理操作。

具体选择何种类型的定时器取决于你的应用需求。对于较简单的定时任务,可以选择周期性定时器或单次定时器;对于需要更高精度和稳定性的定时要求,可以考虑使用硬件定时器。软件定时器适用于需要灵活控制的定时任务,而软件看门狗定时器则适用于系统监控和应对错误的场景。

需要根据实际需求来选择合适的定时器类型,并结合 RT-Thread 提供的接口进行配置和使用。

二、 RT-Thread 定时器的一般步骤

2.1 步骤

RT-Thread 提供了丰富的定时器接口,使得用户可以方便地管理和使用定时器。

以下是使用 RT-Thread 定时器的一般步骤:

  1. 定义回调函数:首先,你需要定义一个函数作为定时器的回调函数,该函数将在定时器超时时执行。回调函数可以完成你想要的特定任务。

  2. 创建定时器:使用 rt_timer_create 函数来创建一个新的定时器对象。需要指定定时器的回调函数、超时时间和定时器的自动重启模式。

    rt_err_t rt_timer_create(rt_timer_t timer, const char* name, rt_timer_cb_t timeout,void* parameter, rt_tick_t time, rt_uint8_t flag);
    
    • timer:指向定时器对象的指针。
    • name:定时器的名称,是一个字符串。
    • timeout:定时器超时时调用的回调函数。
    • parameter传递给回调函数的参数。
    • time:定时器的超时时间,以 tick 为单位。
    • flag:定时器的属性标志,用于控制定时器的行为。
  3. 启动和停止定时器:可以使用 rt_timer_start 函数启动定时器,使其开始计时并在超时时触发回调函数;使用 rt_timer_stop 函数停止(暂停)定时器,停止后的定时器永远不会超时,也不会调用回调函数了。

    rt_err_t rt_timer_start(rt_timer_t timer);
    rt_err_t rt_timer_stop(rt_timer_t timer);
    
  4. 修改定时器超时时间:如果需要修改定时器的超时时间,可以使用 rt_timer_control 函数。

    rt_err_t rt_timer_control(rt_timer_t timer, int cmd, void* arg);
    
    • cmd:控制命令,可以使用 RT_TIMER_CTRL_SET_TIME 命令来设置定时器的超时时间。
    • arg:参数,用于传递新的超时时间值。
  5. 销毁定时器:在不再需要定时器时,使用 rt_timer_delete 函数释放定时器。

    rt_err_t rt_timer_delete(rt_timer_t timer);
    

2.2 Flag

RT_TIMER_FLAG_PERIODIC 是实时操作系统 (RTOS) 中用于定时器的一种标志位,表示定时器是周期性的,即会重复触发。

除了 RT_TIMER_FLAG_PERIODIC,还有一些其他与之对应的定时器标志位,包括但不限于:

  1. RT_TIMER_FLAG_SOFT_TIMER:软件定时器,表示定时器由软件或操作系统内部触发,而不是由硬件触发。这种定时器通常用于实现延时、定时任务等功能。

  2. RT_TIMER_FLAG_HARD_TIMER:硬件定时器,表示定时器由硬件设备触发。硬件定时器通常由处理器或计时器芯片提供,可以用于实现精确的时间控制。

  3. RT_TIMER_FLAG_PERIODIC:周期性定时器

  4. RT_TIMER_FLAG_ONE_SHOT:一次性定时器,表示定时器只会触发一次,不会重复执行。一次性定时器在到达设定的时间后触发,然后停止计时。

  5. RT_TIMER_FLAG_AUTO_ACTIVATE:自动激活定时器,表示定时器在创建后立即激活,无需要单独Start,开始计时。通常用于需要立即开始定时操作的场景。

  6. RT_TIMER_FLAG_POWER_PIN:电源引脚定时器,表示定时器与设备的电源引脚相关联。这种定时器可用于在设定的时间内控制设备的电源状态。

        这些定时器标志位可以根据具体的需求和应用场景选择使用,以实现所需的定时功能和控制。具体使用哪些标志位取决于实时操作系统或开发平台的支持和定义。

2.3 示例

下面是一个示例,展示了如何使用 RT-Thread 定时器:

#include <rtthread.h>static void timer_timeout(void* parameter)
{rt_kprintf("Timer timeout.\n");
}int main(void)
{rt_timer_t my_timer;my_timer = rt_timer_create("my_timer", timer_timeout, RT_NULL, 1000, RT_TIMER_FLAG_PERIODIC);if (my_timer != RT_NULL){rt_timer_start(my_timer);}/* 其他代码... */return 0;
}

在上述示例中,我们定义了一个名为 timer_timeout 的回调函数,在定时器超时时被调用。然后,我们使用 rt_timer_create 函数创建了一个名为 “my_timer” 的定时器对象,并设置超时时间为 1000 个 tick,标志为周期性定时器。最后,我们使用 rt_timer_start 函数启动定时器。

需要注意定时器的回调函数应尽量保持简洁和高效,避免长时间的阻塞操作,以确保定时器的准确性和及时性。并且,在不再需要使用定时器时,应通过调用 rt_timer_delete 函数销毁定时器,以释放相关资源。

相关文章:

[嵌入式系统-21]:RT-Thread -7- 内核组件编程接口 - 定时器

目录 一、RT-Thread定时器 1.1 概述 1.2 定时器的种类 1.2.1 周期性 1.2.2 实时性 1.2.3 功能 二、 RT-Thread 定时器的一般步骤 2.1 步骤 2.2 Flag 2.3 示例 一、RT-Thread定时器 1.1 概述 在 RT-Thread 中&#xff0c;定时器是一种常用的机制&#xff0c;用于在指…...

Python Matplotlib 的学习笔记

Python Matplotlib 的学习笔记 0. Python Matplotlib 简介1. 为什么要用 Matplotlib&#xff1f;2. Matplotlib 基础类详解2-1. Line&#xff08;线&#xff09;2-2. Marker&#xff08;标记&#xff09;2-3. Text&#xff08;文本&#xff09;2-4. Legend&#xff08;图例&…...

SQL语言1

创建数据库 CREATE DATABASE 展示数据库 SHOW DATABASE 整数 INT 有小数点的数 DECIMA(m, n) #m是有几位数&#xff0c;n是有几位小数 字符串 VARCHAR(n) &#xff08;Binary Large Object&#xff09;图片 影片 BLOB ‘YYYY-MM-DD’日期 DATA YYYY-MM-DD HH:MM:SS 记…...

PowerShell搭建vue起始项目

Windows PowerShell搭建vue起始项目 搜索PowerShell,以管理员身份运行。 复制文件夹路径 cd 到这个文件夹位置 命令行创建项目&#xff1a;vue create 项目名 这里写自己的项目名就行&#xff0c;我写的yeb vue create yeb 创建成功后是这样的 有颜色的就是选中的&#xff…...

jmeter遇到连接数据库的问题

jmeter连接mysql或者oracle简单&#xff0c;但是连接过inceptor吗&#xff1f; 上货 1、下载驱动inceptor 5.1.2.jar包 2、在添加驱动那里导入 3、在JBC request中的写法 PS:没什么可说的...

应急响应实战笔记02日志分析篇(3)

第3篇:Web日志分析 ox01 Web日志 Web访问日志记录了Web服务器接收处理请求及运行时错误等各种原始信息。通过对WEB日志进行的安全分析&#xff0c;不仅可以帮助我们定位攻击者&#xff0c;还可以帮助我们还原攻击路径&#xff0c;找到网站存在的安全漏洞并进行修复。 我们来…...

常见性能优化策略

对于经常接触高并发服务的同学来学&#xff0c;会经常涉及到性能优化&#xff0c;但是由于平时很少总结&#xff0c;内容会比较分散&#xff0c;这里简单做一些总结 1&#xff1a;空间换时间 比如一些数据的访问需要很快返回结果&#xff0c;原本在磁盘上的数据&#xff0c;需…...

【微信小程序】微信小程序开发:从入门到精通

微信小程序开发&#xff1a;从入门到精通 一、开发准备二、小程序开发流程1、注册与创建项目2、开发页面3、配置4、调试与预览5、发布与审核 随着移动互联网的普及&#xff0c;微信小程序成为了越来越多企业和个人开发者的首选。小程序是一种无需下载安装即可使用的应用&#x…...

【经验】STM32的一些细节

这两天 碰到的奇葩问题是 STM32定时器同步的问题。 我的设计本意是&#xff1a;使用定时器T3以100us的周期来定时发送命令给 FPGA。由于编码器出结果的最长时间为51us。因此&#xff0c;希望PWM中断要滞后于T3 约60us 。 调试过程&#xff1a;分别在T3和PWM中断中置IO1&#…...

ubuntu22.04安装部署03: 设置root密码

一、前言 ubuntu22.04 安装完成以后&#xff0c;默认root用户是没有设置密码的&#xff0c;需要手动设置。具体的设置过程如下文内容所示&#xff1a; 相关文件&#xff1a; 《ubuntu22.04装部署01&#xff1a;禁用内核更新》 《ubuntu22.04装部署02&#xff1a;禁用显卡更…...

【lesson56】生产者消费者模型

文章目录 学习生产者消费者模型过程中要回答的两个问题生产者消费者模型的概念基于阻塞队列的生产者消费者模型编码实现Common.hLockGuard.hppCondtion.hppBlockQueue.hppTask.hppConProd.cc 学习生产者消费者模型过程中要回答的两个问题 1.条件变量是在条件满足的时候&#x…...

MySQL5.7升级到MySQL8.0的最佳实践分享

一、前言 事出必有因&#xff0c;在这个月的某个项目中&#xff0c;我们面临了一项重要任务&#xff0c;即每年一次的等保测评整改。这次测评的重点是Mysql的一些高危漏洞&#xff0c;客户要求我们无论如何必须解决这些漏洞。尽管我们感到无奈&#xff0c;但为了满足客户的要求…...

Rust 数据结构与算法:5栈:用栈实现前缀、中缀、后缀表达式

3、前缀、中缀和后缀表达式 计算机是从左到右处理数据的&#xff0c;类似(A (B * C))这样的完全括号表达式&#xff0c;计算机如何跳到内部括号计算乘法&#xff0c;然后跳到外部括号计算加法呢&#xff1f; 一种直观的方法是将运算符移到操作数外&#xff0c;分离运算符和操…...

作业day6

数据库 sqlite3 sq.db 如果sq.db存在则直接打开sq.db数据库&#xff0c;如果不存在则先创建再打开; ​ 系统命令 需要以 . 开头&#xff0c;不需要以 ; 结尾 .quit 退出数据库 .exit 退出数据库 .help 显示帮助信息&#xff0c;获取所有系统命令; ​ .table 查看当前数据…...

前方预警!2024年七大网络安全威胁

新颖创新技术的兴起和迅速采用已极大地改变了各行各业的全球网络安全和合规格局&#xff0c;比如生成式人工智能、无代码应用程序、自动化和物联网等新技术。 网络犯罪分子正转而采用新的技术、工具和软件来发动攻击&#xff0c;并造成更大的破坏。因此&#xff0c;《2023年网…...

绿色化 数据库 MongoDB 和 mysql 安装

绿色化 数据库 MongoDB 和 mysql 安装 【1.1】 前言 为什么要绿色化 安装呢&#xff1f;因为系统老升级&#xff0c;老重装&#xff01;&#xff01;也方便了解下数据库配置和库在那 绿色软件喜欢一般放在 D盘tools目录里 D:\tools\ 数据库 MongoDB D:\tools\MongoDB 数…...

npm install 一直卡着不动如何解决

目录 方式一&#xff1a;方式二&#xff1a; 方式一&#xff1a; npm cache clean --force npm config set registry https://registry.npmmirror.com npm install下面是简单的解释&#xff1a; &#x1f340;1、强制清理 npm 缓存 npm cache clean --force&#x1f340;2、设…...

电路设计(15)——篮球赛24秒违例倒计时报警器的proteus仿真

1.设计要求 设计、制作一个篮球赛24秒违例倒计时报警器。要求&#xff1a; &#xff08;1&#xff09;具有倒计时功能。可完整实现从“24”秒开始依序倒计时并显示倒计时过程&#xff0c;显示时间间隔为1秒。 &#xff08;2&#xff09;具有消隐功能。当“24”秒倒计时…...

golang 集成sentry:http.Client

http.Client 是 Go 标准库 HTTP 客户端实现&#xff0c; sentry-go也没有这个组件&#xff0c;所以需要自己实现。 我们只需要对 http.Transport 进行包装即可&#xff0c; 完整代码如下 package mainimport ("bytes""fmt""io""log"&…...

设计链表(不难,代码稍微多一点)

设计链表 在链表类中实现这些功能&#xff1a; get(index)&#xff1a;获取链表中第 index 个节点的值。如果索引无效&#xff0c;则返回-1。addAtHead(val)&#xff1a;在链表的第一个元素之前添加一个值为 val 的节点。插入后&#xff0c;新节点将成为链表的第一个节点。ad…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...