FreeRTOS中vTaskDelay与vTaskDelayUntil在周期任务里累积漂移的实测对比

· 行业用户 · 15 浏览

回答(4)

用DWT->CYCCNT打时间戳最省事,注意CYCCNT在调试暂停时会停,量产测试建议用硬件定时器捕获。
CortexM老李 · 2026-11-09
如果任务体偶尔超period,vTaskDelayUntil会丢拍,工程上要加超时监控或降级为相对延时并做相位校正。
RTOS小兵 · 2026-11-09
实测时务必关闭tickless并固定tick频率,否则低功耗tick补偿会污染对比数据;建议同时记录最大抖动和均值。
嵌入式老张 · 2026-11-09
在周期任务中,vTaskDelay(period)是相对延时:每次从当前时刻重新计时,任务执行时间、中断抢占、调度延迟都会累加到下一次起点,长期运行会产生累积漂移,漂移量约等于每周期(执行时间+调度抖动)之和。vTaskDelayUntil(&last, period)是绝对延时:以last为基准递增固定周期,只要单周期执行时间小于period,下一次唤醒时刻就是确定的,不会把执行时间累加进去,因此长期无累积漂移(仅有单周期抖动)。实测建议:用GPIO翻转+逻辑分析仪或DWT周期计数器记录唤醒时刻,跑1000~10000个周期统计偏差。典型结果:period=10ms、任务体2ms时,vTaskDelay每周期晚约2ms+抖动,1000周期累积约2s以上;vTaskDelayUntil偏差保持在单周期抖动范围(几十us级),不随时间增长。注意:vTaskDelayUntil要求任务体执行时间必须小于period,否则会连续唤醒甚至触发断言;若周期可变或需动态调整,应改用xTaskDelayUntil并检查返回值。
mcuku 阿沐 · 2026-11-09