news 2026/6/10 16:23:24

从零玩转RT-Thread(19):

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零玩转RT-Thread(19):

本课时介绍如何让任务睡眠,从而让任务暂停运行指定的时间。

为什么要延时

在实际项目中,我们经常会用到让任务睡眠相关的接口,从而实现以下功能。

  • 避免CPU占用过多(如忙等)
  • 控制执行节奏(如LED闪烁、采样周期)
  • 给其他任务运行机会

工作原理

当任务需要睡眠时,RT-Thread会将其加入到定时器列表里。这样一来,任务就不会参与调度,无法运行。

只有当任务睡眠时间结束时,任务才会从定时器列表移回就绪队列。

相关接口

在RT-Thread中,与睡眠相关的接口如表所示:

函数名

说明

rt_thread_mdelay(ms)

毫秒级延时(常用)

rt_thread_delay(tick)

等同于rt_thread_sleep()

rt_thread_sleep(tick)

tick数延时,单位为系统节拍数

rt_thread_delay_until(&tick, inc_ticks)

从*tick开始的时间,睡眠inc_ticks时间

其中,rt_thread_mdelay()以毫秒为单位,其余函数以系统时钟节拍周期为单位。该周期由如下配置宏来决定:

#define RT_TICK_PER_SECOND 1000

示例代码:每秒闪烁 LED

下面给出了一个简单的示例,展示了部分睡眠函数的作用。

#include <rtthread.h> #include "base.h" void task1_entry(void *param) { RT_UNUSED(param); while (1) { rt_kprintf("Task 1 is running\n"); rt_thread_delay(RT_TICK_PER_SECOND); // 延时1秒 } } void task2_entry(void *param) { RT_UNUSED(param); rt_tick_t ticks = rt_tick_get(); while (1) { rt_kprintf("Task 2 is running\n"); rt_thread_delay_until(&ticks, RT_TICK_PER_SECOND); } } int main(void) { hardware_init(); rt_thread_t t1 = rt_thread_create( "t1", task1_entry, RT_NULL, 1024, 20, // 相同优先级 20 // 时间片为5个tick ); rt_thread_t t2 = rt_thread_create( "t2", task2_entry, RT_NULL, 1024, 20, // 相同优先级 40 ); if (t1) rt_thread_startup(t1); if (t2) rt_thread_startup(t2); return 0; }

注意事项

睡眠的时间精度取决于系统时钟节拍周期

RT-Thread 使用系统时钟节拍定时器来周期性触发任务调度。该时钟节拍由RT_TICK_PER_SECOND宏配置。

假设RT_TICK_PER_SECOND=1000,那么一个tick时间= 1ms。也就说,此时睡眠的最小单位就是 1 Tick。

如果调用睡眠时间的函数时间点卡得不够好,则可能睡眠过多或过多少,具体如下图所示。

从上图可以看出,实际的睡眠时间比期望的要短或长一些,但是差距不超过一个tick(假设任务在睡眠完之后,能够立即运行)

而如果有其它任何干扰,如更高优先级的任务抢占CPU、同优先级其它任务正在运行,则实际延时时间要更长一些。

因此,在 RTOS 中我们说延时是“近似的、最小保证的延时”,不能用于精密定时(如 1ms 级别的 PWM 控制),而应使用硬件定时器或定时器中断实现更高精度的控制。

课程推荐

  • 全新升级的手写RTOS课程:从原理到实战,一次掌握操作系统的核心

  • 用10000+行代码手写一个TCP/IP协议栈

  • 硬核项目,从0手搓一个RISC-V模拟器!

作者介绍 李述铜,嵌入式系统与底层架构领域讲师,专注于操作系统、CPU 架构、RTOS 内核与系统软件实现原理的教学与研究。 出版作品《从0手写x86计算机操作系统》,主讲课程包括:《从0手写嵌入式操作系统》《从0手写TCP/IP协议栈》《从0手写FAT32文件系统》等。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 15:39:11

永铭环形导轨:从研发到量产,全链条把控精度标准

一.研发阶段精度指标设定&#xff1a;根据市场需求和应用场景&#xff0c;如电子元件装配、半导体制造等对精度要求极高的领域&#xff0c;设定合理的精度指标。通常环形导轨的重复定位精度可达到 0.05mm&#xff0c;永铭可能会在此基础上追求更高精度&#xff0c;如 0.02mm 等…

作者头像 李华
网站建设 2026/6/10 18:13:16

考研数学一知识点终极攻略:30天高效提分方案

考研数学一知识点终极攻略&#xff1a;30天高效提分方案 【免费下载链接】考研数学一知识点全攻略8K打印版分享 本仓库提供了一份珍贵的考研数学资料——《考研数学一全部知识点总结(8K打印).pdf》。这份文档专为准备参加研究生入学考试&#xff08;统考数学一&#xff09;的同…

作者头像 李华
网站建设 2026/6/10 1:08:23

Kubernetes调度优化终极指南:Descheduler实现集群资源自动平衡

Kubernetes调度优化终极指南&#xff1a;Descheduler实现集群资源自动平衡 【免费下载链接】descheduler Descheduler for Kubernetes 项目地址: https://gitcode.com/gh_mirrors/de/descheduler 在Kubernetes集群的日常运维中&#xff0c;你是否遇到过这样的困扰&#…

作者头像 李华
网站建设 2026/6/9 18:34:39

24小时挑战:打造智能输入法切换器原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速开发一个输入法切换器最小可行产品(MVP)&#xff0c;核心功能&#xff1a;1)监听当前窗口变化&#xff1b;2)根据预设规则自动切换输入法&#xff1b;3)简单的规则配置界面。使…

作者头像 李华
网站建设 2026/6/10 16:02:12

3分钟解决Git版本识别问题:新旧方法效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个效率对比工具&#xff0c;分别实现&#xff1a;1. 传统手动排查方案&#xff08;检查PATH、重装Git等&#xff09;2. 使用快马平台AI自动修复方案。要求统计&#xff1a;a)…

作者头像 李华
网站建设 2026/6/10 14:31:59

Dreambooth图像超分辨率技术解析:5步实现AI绘画质量提升

Dreambooth图像超分辨率技术解析&#xff1a;5步实现AI绘画质量提升 【免费下载链接】Dreambooth-Stable-Diffusion Implementation of Dreambooth (https://arxiv.org/abs/2208.12242) with Stable Diffusion 项目地址: https://gitcode.com/gh_mirrors/dr/Dreambooth-Stabl…

作者头像 李华