vTaskDelayUntil不能和挂起suspend、恢复resume一起使用。
如图,执行两个翻转电平的任务,一个挂起另一个就恢复,在2.78s之后的那个上升沿,B8被恢复,C13被挂起。
然而,将这个图放大会发现,在2.89s,B8不止被翻转了一次,而是连续多次翻转。
原因是:
-
vTaskDelayUntil
的工作机制:-
它基于固定周期执行(如代码中的320tick/180tick)
-
任务挂起期间,系统时钟仍在运行
-
恢复时,
vTaskDelayUntil
发现当前时间已远超预设的唤醒时间(pxPreviousWakeTime + xPeriod
) -
为补偿错过的周期,它会连续执行多次直到赶上当前系统时间
-