news 2026/6/8 21:20:37

从零玩转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/9 19:49:57

K8S系列之6.2:调度进阶(污点、容忍、亲和性与自定义调度器)

Kubernetes调度器被称为集群的"大脑",负责将Pod分配到合适的节点。本章将从基础调度深入到高级调度策略,让你从"能调度"进阶到"调度好",实现资源的最优利用和业务的最佳性能。 引言:调度器的进化之路 从简单的随机调度到智能的感知调度,Ku…

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

vmtools在企业虚拟化环境中的5个实战场景

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个演示项目&#xff0c;展示vmtools在以下场景的应用&#xff1a;1) 自动扩展虚拟机磁盘空间 2) 跨主机迁移虚拟机 3) 批量更新虚拟机工具 4) 监控虚拟机性能指标 5) 自动化备…

作者头像 李华
网站建设 2026/6/6 7:04:58

Zotero行高设置:三招解决阅读体验优化难题

Zotero行高设置&#xff1a;三招解决阅读体验优化难题 【免费下载链接】zotero-better-notes Everything about note management. All in Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-better-notes 你是否曾经在Zotero-Better-Notes中阅读长篇笔记时感…

作者头像 李华
网站建设 2026/6/9 20:03:37

终极指南:Mirai Console Loader配置全攻略

终极指南&#xff1a;Mirai Console Loader配置全攻略 【免费下载链接】mirai-console-loader 模块化、轻量级且支持完全自定义的 mirai 加载器。 项目地址: https://gitcode.com/gh_mirrors/mi/mirai-console-loader Mirai Console Loader&#xff08;简称MCL&#xff…

作者头像 李华
网站建设 2026/6/8 12:28:20

5个kubectl exec -it在生产环境的实用案例

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个Kubernetes故障排查沙盒环境&#xff0c;包含5个预设的问题场景&#xff1a;1) Pod启动失败 2) 服务不可用 3) 配置文件错误 4) 资源不足 5) 网络连接问题。每个场景提供使…

作者头像 李华
网站建设 2026/6/7 19:01:49

Kazumi跨设备观影同步:5步实现无缝追番体验

Kazumi跨设备观影同步&#xff1a;5步实现无缝追番体验 【免费下载链接】Kazumi 基于自定义规则的番剧采集APP&#xff0c;支持流媒体在线观看&#xff0c;支持弹幕。 项目地址: https://gitcode.com/gh_mirrors/ka/Kazumi 还在为不同设备间追番进度不统一而烦恼吗&…

作者头像 李华