特点:
1、 高优先级抢占低优先级
2、高优先级任务不停止,低优先级无法运行
3、被抢占的任务会进入就绪态
举例
阐述一下啊Task1 2 3 任务优先级分别为1 2 3 (freertos中数值越大优先级越越大)当Task1就绪Task2 Task3未就绪时Task1 被运行;当Task2 任务就绪后抢占Task1 Task1 变为就绪态;当Task3 就绪后 抢占Task2 Task2变为就绪态;当Task3阻塞时Task2就绪被运行;当Task3 阻塞时间到 抢占Task2。
用于任务优先级相同
什么是时间片:时间片就是系统滴答定时器1个中断的时间间隔。这个时间片只能是1个而且能通过修改系统时钟修改。
举例
过程:Task1 2 3 任务优先级相同,那么他们会顺序运行(我认为应该是看就绪列表中任务的排序,应该是谁先创建谁先)Task1运行1个时间片后Task2运行;Task2行1个时间片后Task3运行;依次类推,如果Task3被阻塞了那直接进入Task1继续运行一个时间片。Task3 之间没用完的时间片就没有了。
特点:
1、同等优先级任务,轮流执行;时间片流转
2、一个时间片大小,取决为滴答定时器中断周期
3、注意没有用完的时间片不会再使用,下次任务Task3得到执行还是按照一个时间片的时钟节拍运行
正在执行的任务,该任务就处于运行态,注意在STM32中,同一时间仅一个任务处于运行态
如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态
延时或等待外部事件 就进入阻塞态
类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume()
才可以进入就绪态
任务状态转化图
分析一下运行态可以进入就绪太*(比如被高优先级任务抢占),就绪态也可以进入运行态(轮到该任务优先级任务运行),运行态可以进入挂起太(调用挂起函数),运行态可以进入阻塞太*(阻塞函数被调用),阻塞态可以进入就绪态(阻塞结束),挂起态可以进入就绪态(解挂)。
总结
1、仅就绪态可转变成运行态
2、任何任务状态都可以转化成就绪态
3、其他状态的任务想运行,必须先转变成就绪态
除了运行态 其他三个状态都有其对应的任务状态列表
就绪列表 pxReadyTasksLists[x],其中x代表任务优先级数值 一般设置为0-31最大为31
阻塞列表pxDelayedTaskList
挂起列表 xSuspendedTaskList
任务会根据任务优先级放入不同的任务就绪列表中,新创建的任务挂载到就绪列表中。比如任务优先级为31那么他就放在任务就绪列表31中。
任务运行前先自上而下遍历就绪列表 当有一个就绪列表前的bit位为1时代表该任务就绪。
这里举两个例子
1、任务优先级不同
任务优先级不同的三个任务task1 task2 task3 当创建任务后task1 2 3 分别被放入pxReadyTasksLists[1]
pxReadyTasksLists[2] pxReadyTasksLists[3]中。任务运行前遍历任务就绪列表这时优先自上而下遍历到pxReadyTasksLists[3]前的bit位为1 task3运行,当task3被挂起或阻塞时pxReadyTasksLists[3]前面的位为0,同时会放到pxDelayedTaskList或xSuspendedTaskList中,此时会遍历到task2 依次类推。task3变回就绪态后又排在task2 1 前面。
任务优先级 相同的 task1 2 3 他们会被放到同一个任务就绪列表中根据时间片依次运行。