2026/2/20 12:25:47
网站建设
项目流程
福建省法冶建设知识有奖网站,万荣网站seo,旅游网站制作视频百度云,cpa建站教程本课时介绍如何让任务睡眠#xff0c;从而让任务暂停运行指定的时间。
为什么要延时
在实际项目中#xff0c;我们经常会用到让任务睡眠相关的接口#xff0c;从而实现以下功能。
避免CPU占用过多#xff08;如忙等#xff09;控制执行节奏#xff08;如LED闪烁、采样…本课时介绍如何让任务睡眠从而让任务暂停运行指定的时间。为什么要延时在实际项目中我们经常会用到让任务睡眠相关的接口从而实现以下功能。避免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_SECOND1000那么一个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文件系统》等。