FreeRTOS CMSIS系列(7):延时函数详解
目录一、延时函数分类:1.相对延时vTaskDelay2.绝对延时vTaskDelayUntil二、vTaskDelay 与 HAL_Delay 的区别:vTaskDelayFreeRTOSHAL_DelayHAL库一、延时函数分类:相对延时vTaskDelay绝对延时vTaskDelayUntil1.相对延时vTaskDelayvTaskDelay函数实现的是相对延时即从当前时刻开始计算延时时间。这个函数会将任务挂起指定的系统时钟节拍数ticks直到指定的时间过去后任务才会被重新调度执行。vTaskDelay( xTicksToDelay );xTicksToDelay这是要延时的系统时钟节拍数。可以通过pdMS_TO_TICKS宏将毫秒数转换为系统时钟节拍数。vTaskDelay( pdMS_TO_TICKS(100) );这会导致任务挂起直到100毫秒后。2.绝对延时vTaskDelayUntilvTaskDelayUntil函数实现的是绝对延时即从某个特定的未来时刻开始计算延时时间。这个函数会将任务挂起直到从上一次调用vTaskDelayUntil后经过了指定的时间间隔。vTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement );pxPreviousWakeTime这是一个指针指向一个变量该变量保存了任务上一次被唤醒的时间以系统时钟节拍为单位。每次调用vTaskDelayUntil时都应该传入同一个变量的地址。xTimeIncrement这是要延时的系统时钟节拍数。例如如果你想让任务每隔100毫秒执行一次可以这样调用const TickType_t xDelay pdMS_TO_TICKS(100); TickType_t xLastWakeTime; // 初始化xLastWakeTime xLastWakeTime xTaskGetTickCount(); while(1) { // 任务代码... // 延时直到下一个100毫秒 vTaskDelayUntil( xLastWakeTime, xDelay ); }在这个循环中xLastWakeTime会在每次调用vTaskDelayUntil时更新以确保任务每隔100毫秒被唤醒一次。总结来说vTaskDelay是基于当前时间的相对延时而vTaskDelayUntil是基于上一次唤醒时间的绝对延时。使用vTaskDelayUntil可以更容易地实现周期性的任务调度。二、vTaskDelay与HAL_Delay的区别:vTaskDelay和HAL_Delay是两个完全不同的函数它们分别属于不同的系统和库用于不同的上下文和目的。下面是它们的主要区别vTaskDelayFreeRTOSvTaskDelay是FreeRTOS实时操作系统RTOS中的一个函数。它用于实现任务的延时使当前任务挂起指定的系统时钟节拍数ticks让出CPU给其他任务运行。vTaskDelay是协作式的它不会立即阻塞CPU而是让任务进入阻塞状态直到指定的延时时间过去。它允许任务在延时期间被操作系统的其他部分如中断服务例程打断。vTaskDelay的参数是系统时钟节拍数可以通过pdMS_TO_TICKS宏将毫秒数转换为系统时钟节拍数。HAL_DelayHAL库HAL_Delay是硬件抽象层HAL库中的一个函数通常用于STM32等微控制器。它用于实现一个简单的延时通常是通过阻塞CPU来实现的即在延时期间CPU不做其他事情只是等待。HAL_Delay是非协作式的它会阻塞CPU直到指定的毫秒数过去。它不允许在延时期间被中断打断因此可能会影响系统的实时性。HAL_Delay的参数是毫秒数。void vTaskDelay( const TickType_t xTicksToDelay ) { BaseType_t xAlreadyYielded pdFALSE; /* A delay time of zero just forces a reschedule. */ if( xTicksToDelay ( TickType_t ) 0U ) { configASSERT( uxSchedulerSuspended 0 ); vTaskSuspendAll(); { traceTASK_DELAY(); /* A task that is removed from the event list while the scheduler is suspended will not get placed in the ready list or removed from the blocked list until the scheduler is resumed. This task cannot be in an event list as it is the currently executing task. */ prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE ); } xAlreadyYielded xTaskResumeAll(); } else { mtCOVERAGE_TEST_MARKER(); } /* Force a reschedule if xTaskResumeAll has not already done so, we may have put ourselves to sleep. */ if( xAlreadyYielded pdFALSE ) { portYIELD_WITHIN_API(); } else { mtCOVERAGE_TEST_MARKER(); } }__weak void HAL_Delay(uint32_t Delay) { uint32_t tickstart HAL_GetTick(); uint32_t wait Delay; /* Add a freq to guarantee minimum wait */ if (wait HAL_MAX_DELAY) { wait (uint32_t)(uwTickFreq); } while ((HAL_GetTick() - tickstart) wait) { } }vTaskDelay 作用是让任务阻塞任务阻塞后RTOS系统调用其它处于就绪状态的优先级最高的任务来执行。HAL_Delay 一直不停的调用获取系统时间的函数直到指定的时间流逝然后退出故其占用了全部CPU时间。在实际应用中选择使用哪个函数取决于你的系统需求和上下文如果你在使用FreeRTOS并且需要实现任务间的协作和调度那么应该使用vTaskDelay。如果你在使用STM32 HAL库并且需要一个简单的CPU阻塞延时那么可以使用HAL_Delay。需要注意的是HAL_Delay可能会影响RTOS的调度因为它会阻塞CPU所以在使用RTOS的情况下通常推荐使用vTaskDelay或其他RTOS提供的延时函数。此外HAL_Delay通常依赖于系统的时钟配置而vTaskDelay则依赖于FreeRTOS的时钟节拍配置。参考资料1. FreeRTOS官方文档https://www.freertos.org/2. STM32 HAL库开发手册本文为个人学习笔记整理仅供学习交流使用。

相关新闻

AI绘画生成地铁站内景:提示词工程与场景还原实战指南

AI绘画生成地铁站内景:提示词工程与场景还原实战指南

1. 场景拆解:为什么地铁站内景这么难画说句实话,"内景 地铁站内部"这个提示词,看着简单,真正动手生成的时候才知道坑有多深。我拿到这个题目第一反应觉得挺好对付——不就是一个室内场景吗,空间方正、透视明…

2026/10/12 3:31:05 阅读更多 →
Claude Code Projects全面开放:Pro和Max用户如何用项目上下文提升开发效率

Claude Code Projects全面开放:Pro和Max用户如何用项目上下文提升开发效率

1. 这次开放到底改变了什么1.1 从"少数人尝鲜"到"全员可用"的转折点Claude Code Projects 向全部 Pro 和 Max 用户开放,这件事在开发者圈子里引起的讨论热度,远比表面上看起来要大。我第一时间在自己的账号上验证了这个变化&#xf…

2026/10/12 3:31:05 阅读更多 →
语言模型三大约束:事实、安全与上下文相关性实战指南

语言模型三大约束:事实、安全与上下文相关性实战指南

做语言模型应用开发这几年,我有一个越来越强烈的感受:真正让项目卡住的,往往不是模型能力不够,而是模型"太能说了"。它什么话题都能接,什么内容都能往下续,甚至能为一个根本不存在的结论编出全套…

2026/10/12 3:30:04 阅读更多 →

最新新闻

AnyPS5:PS5多主机存档备份与迁移工具实战解析

AnyPS5:PS5多主机存档备份与迁移工具实战解析

说实话,第一次想到做AnyPS5这个小工具,是因为我自己被折腾得够呛。家里两台PS5,一台客厅一台书房,存档、截图、设置散落在两台机器上,打一半想换个地方继续,结果发现进度对不上。官方自带的数据同步功能在多…

2026/10/12 4:27:40 阅读更多 →
秒杀系统落地实践:高并发场景下的分层拦截与异步削峰

秒杀系统落地实践:高并发场景下的分层拦截与异步削峰

做秒杀系统这几年,我踩过的坑比看过的方案多。很多文章一上来就堆架构图,动辄"高可用""最终一致",看完反而不知道怎么落地。这篇我把一个能直接落地的秒杀方案从头到尾拆一遍,争取让你15分钟建立起完整的认知…

2026/10/12 4:27:40 阅读更多 →
基于Spring Boot的服装制造企业综合管理系统设计与实现

基于Spring Boot的服装制造企业综合管理系统设计与实现

每年到了毕业设计选题的时候,总会有同学来问我:有没有适合Java后端、工作量适中、又不容易烂大街的题目?我最常提到的就是“基于Spring Boot的服装制造有限公司综合管理系统”。这类项目热度很高,不是因为名字里有“服装”两个字&…

2026/10/12 4:27:40 阅读更多 →
Pomotroid 自动明暗主题(Auto/Light/Dark)实现全解析:从设置数据模型到 matchMedia 实时联动

Pomotroid 自动明暗主题(Auto/Light/Dark)实现全解析:从设置数据模型到 matchMedia 实时联动

【免费下载链接】pomotroid :tomato: Simple and visually-pleasing Pomodoro timer 项目地址: https://gitcode.com/gh_mirrors/po/pomotroid 点击查看 免费下载 导读:Pomotroid 是一款基于 Tauri Svelte 的番茄钟应用,其主题系统曾长期停…

2026/10/12 4:27:40 阅读更多 →
Apache Beam Java 聚合变换 GroupByKey 深度指南:分组原理、窗口触发与实战示例

Apache Beam Java 聚合变换 GroupByKey 深度指南:分组原理、窗口触发与实战示例

【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址: https://gitcode.com/gh_mirrors/beam18/beam 点击查看 免费下载 导读 GroupByKey 是 Apache Beam Java SDK 中最基础也最重要的聚合原语&…

2026/10/12 4:27:40 阅读更多 →
REA 逆向分析快速上手:4 步跑通第一次本地应用分析

REA 逆向分析快速上手:4 步跑通第一次本地应用分析

REA 逆向分析快速上手:4 步跑通第一次本地应用分析 【免费下载链接】rea Reverse engineer anything with agents, from app behavior down to native binaries. 项目地址: https://gitcode.com/GitHub_Trending/rea2/rea 你在一个应用里看到想复刻的功能&am…

2026/10/12 4:26:39 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →