FreeRtos学习笔记
FreeRtos基础知识:
1、什么是任务调度?
2、什么是任务状态?
任务调度:
任务调度有三种模式,分别为抢占式调度,时间片调度,协程式调度。
抢占式调度就是任务优先级越高的任务优先于优先级低的任务,所以叫抢占,而时间片任务是针对优先级相同的任务而言,优先级相同的任务按照时间片的顺序一个接一个的执行,一个时间片的长短就是SysTick的中断周期。
抢占式调度总结:
1、高优先级任务先执行
2、高优先级不停止,低优先级无法执行
3、被抢占的任务进入就绪态
时间片调度总结:
1、同等优先级任务,轮流执行,时间片流转。
2、一个时间片大小,取决于滴答定时器的中断周期。
3、如果一个任务在0.5个时间片内做完,那么剩下的0.5个时间片就不用管了,直接空转,等到下一个时间片执行下一个任务。
任务状态
任务状态分为四种:
1、就绪态
2、运行态
3、阻塞态
4、挂起态
具体任务状态流转图如下:
运行态:任务正处于运行的状态,如小车循迹任务,小车正在循迹,则处于运行态,同一时刻只有一个任务处于运行态。
就绪态:任务已经能够被执行但还未被执行,比如初始化这些。
阻塞态:一个任务因延时或等待信号量或外部事件的发生,则任务处于阻塞态
挂起态:类似于暂停,调用vTaskSuspend()进入挂起态,调用vTaskResume()退出挂起态。
注意:
1、仅就绪态可转变成运行态。
2、优先级高的任务抢占了运行态中的就绪态,此时变为就绪态,只有调用了会发生阻塞的API函数才会进入阻塞态。
四种状态中,除了运行态,其他三种任务状态都有响应的任务状态列表:
如下图:
进入运行态只能由就绪列表中优先级高的进入,其他状态的要先进入就就绪列表中才能有机会进入运行态。
1、就绪列表(pxReadyTasksLists[x]:x代表任务优先级数值),高的优先级的会置一,其他的置零,从31往下找到置为1的任务列表,然后执行相关任务。
2、阻塞列表(pxDelayedTaskList)
3、挂起列表(xSuspendedTaskList)
问:如果三个任务优先级相同会怎样?
答:相同优先级的任务会在同一个就绪列表中,按时间片调度顺序执行/