vTaskDelay 与 vTaskDelayUntil 对比
vTaskDelay相对延时从调用时开始延时周期不精准受任务执行时间影响vTaskDelayUntil绝对延时让任务固定周期精准运行不受任务执行时间影响一、底层核心原理1.vTaskDelay( xTicksToDelay )→相对延时作用调用后任务阻塞指定的 Tick 数时间到了恢复就绪计时起点调用函数的那一刻致命特点任务执行时间 延时时间 总周期周期会飘移、不精准本质我要睡多久就睡多久。2.vTaskDelayUntil( pxPreviousWakeTime, xTicksToWait )→绝对 / 周期延时作用让任务每隔固定周期执行一次强制对齐时间轴计时起点上一次任务唤醒的时间核心优势自动扣除任务执行时间无论任务执行耗时多久总周期绝对固定本质我要每隔多久执行一次。二、直观对比1Tick 1ms默认配置假设任务内部执行代码耗时2ms用vTaskDelay(5ms)总周期 2ms执行 5ms延时 7ms→ 周期不固定长时间运行会严重飘移用vTaskDelayUntil(5ms)总周期 固定 5ms任务执行 2ms → 自动只阻塞 3ms严格保证每 5ms 运行一次→ 周期 100% 精准三、极简代码示例1. vTaskDelay 写法简单不精准void TestTask(void *pvParameters) { while(1) { // 执行任务代码耗时2ms LCD_PrintTask(); // 相对延时5ms vTaskDelay(5); } }2. vTaskDelayUntil 写法精准固定周期void TestTask(void *pvParameters) { // 1. 定义变量保存上一次唤醒时间 TickType_t xLastWakeTime; // 2. 周期5ms const TickType_t xFrequency 5; // 3. 初始化起始时间必须写一次 xLastWakeTime xTaskGetTickCount(); while(1) { // 执行任务代码耗时任意不影响周期 LCD_PrintTask(); // 4. 绝对延时固定5ms周期执行 vTaskDelayUntil(xLastWakeTime, xFrequency); } }四、适用场景✅vTaskDelay适用场景90% 日常开发你之前写的所有代码都用这个就够了简单放弃 CPU触发任务切换比如你之前的 LCD 多任务交替显示按键消抖、LED 闪烁、普通延时等待对运行周期没有精准要求的任务入门开发、简单业务逻辑。✅vTaskDelayUntil适用场景精准需求必须固定周期运行的场景音乐播放你的MUSIC_Analysis需要精准节拍传感器定时采集温湿度、陀螺仪10ms 采集一次PID 电机控制、步进电机驱动串口 / 网络定时上报数据任何不能飘移、必须严格周期的任务。五、关键注意事项两者都会让任务进入阻塞态放弃 CPU和你之前学的一样调用后都会触发任务切换不会霸占 CPU只能在任务中调用不能在中断函数里使用vTaskDelayUntil 必须初始化起始时间xLastWakeTime xTaskGetTickCount();只在循环前写一次单位都是系统 Tick默认configTICK_RATE_HZ1000→1Tick 1ms。六、总结vTaskDelay 相对延时→ 调用后开始睡周期不精准适合普通延时vTaskDelayUntil 绝对周期→ 固定频率运行周期 100% 精准适合音乐、采集、控制你的项目LCD 打印、LED 闪烁 → 用vTaskDelay音乐播放、精准节拍 → 用vTaskDelayUntil。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2425868.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!