FreeRTOS中的任务状态

一个任务可为下面中的一个:
运行:如果一个任务正在执行,那么说这个任务处于运行状态。此时它占用处理器。
就绪:就绪的任务已经具备执行的能力(不同于阻塞和挂起),但是因为有一个同优先级或者更高优先级的任务处于运行状态而还没有真正执行。
阻塞:如果任务当前正在等待某个时序或外部中断,我们就说这个任务处于阻塞状态。比如一个任务调用vTaskDelay()后会阻塞到延时周期到为止。任务也可能阻塞在队列或信号量事件上。进入阻塞状态的任务通常有一个“超时”周期,当事件超时后解除阻塞。
挂起:处于挂起状态的任务同样对调度器无效。仅当明确的分别调用vTaskSuspend() 和xTaskResume() API函数后,任务才会进入或退出挂起状态。不可以指定超时周期事件(不可以通过设定超时事件而退出挂起状态)。

其调用关系如下图:

FreeRTOS中的任务状态_第1张图片

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






你可能感兴趣的:(stm32的学习,FreeRTOS)