FreeRTOS会创建很多任务,每个任务有相同或不同的优先级,如果让任务全都处于准备执行状态,那么只有优先级最高的任务一直在执行,优先级低的任务全都被 “饿死” 了。为了解决这个问题,添加了“阻塞状态”。 任务分为 “运行态” 和 “非运行态” 非运行态 包含 阻塞状态、挂起状态 和 就绪状态。 如果在一个任务运行结束时,所有任务都处于 就绪状态,那只有优先级最高的任务能运行。所以加入阻塞状态。 voidvTaskDelay( port tickType xTicksToDelay ); xTicksToDelay——延迟多少个心跳周期。调用该延迟函数的任务将进入阻塞态,经延迟指定的心跳周期数后,再转移到就绪态。举个例子,当某个任务调用vTaskDelay( 100 )时,心跳计数值为10,000,则该任务将保持在阻塞态,直到心跳计数计到10,100。常数portTICK_RATE_MS 可以用来将以毫秒为单位的时间值转换为以心跳周期为单位的时间值。 voidvTaskDelayUntil( portTickType * pxPreviousWakeTime, portTickType xTimeIncrement); 设定周期运行绝对时间,用来让任务周期运行的更精确,比使用 vTaskDelay 延迟精确。
|