任务

任务状态

  • Running:指的是正在运行的任务,在单核系统中,同一时刻只有一个任务处于 Running;
  • Ready:指的是可以被调度运行的任务,也就是处于就绪的任务;
  • Blocked:指的是因为某种原因(等待资源,等待时间)暂时不满足执行条件的任务的状态;
  • Suspend:指的是被挂起的任务,暂时不参与调度的状态;

任务创建

FreeRTOS提供xTaskCreate接口来创建任务(即使在任务调度未开始时也可以创建)。

任务优先级

FreeRTOS 支持的最大优先级由 configMAX_PRIORITIES确定,0 是最低优先级,优先级的范围处于 0 ~ configMAX_PRIORITIES之间。 调度器总会选择优先级最高的处于就绪态的任务执行。

阻塞

当任务运行的某个条件不成立,或者等待某个事件的时候,可以让出CPU。例如等待信号量支配的资源可用,或者等到某个时间唤醒。这样就避免高优先级任务把CPU时间全部占用,导致低优先级任务得不到执行。

挂起

当某个任务被挂起时,它从Ready或者Blocked的链表中被拿出来,然后放到Suspend链表中,不再参与任务调度。

空闲任务

当FreeRTOS开始调度的时候,会创建一个优先级为0的任务,确保至少有一个任务在进行。一般选择在这个任务调用时进入低功耗模式以节约电池。

调度方式

抢占式调度

在当前任务执行的时候,如果有一个更高优先级的任务被唤醒,则会立刻执行高优先级任务。

协作式调度

只有当前执行的任务进入阻塞状态时,调度器才会选择另一个高优先级的任务执行。