RTOS(6)任务管理

任务状态理论

我们是怎么实现,两个同优先级的任务之间交替执行的呢?
任务切换的基础:tick中断!
RTOS(6)任务管理_第1张图片
RTOS(6)任务管理_第2张图片
RTOS(6)任务管理_第3张图片
RTOS(6)任务管理_第4张图片
tick为1ms一个周期,可以通过修改时钟配置修改;
running:正在进行的任务3为running;
ready:任务1和任务2处于ready;
blocked(阻塞状态):等待某事,比如小孩口中的饭还没吃完,就得等吃完才喂;
suspend(暂停状态):主动休息或者被命令休息;
RTOS(6)任务管理_第5张图片
如何管理这些任务呢?
链表readylist:A->B->C

任务状态实验

创建三个任务
任务一:进入suspend再resume回来
RTOS(6)任务管理_第6张图片

任务二:进入blocked,delay一会,再进入ready状态
RTOS(6)任务管理_第7张图片

RTOS(6)任务管理_第8张图片

RTOS(6)任务管理_第9张图片

vTaskDelay和vTaskDelayuntil

RTOS(6)任务管理_第10张图片
dosomething()的时间不定,如何才能保证它的执行周期是不变的呢?
vTaskDelay只能保证延时的时间,不考虑dosomething的时间;
vTaskDelay:等待指定个数的Tick count才能ready,继续执行;
在这里插入图片描述

vTaskDelayuntil:等待到指定的绝对时刻,才能reday,继续执行;
RTOS(6)任务管理_第11张图片
区别:
RTOS(6)任务管理_第12张图片
RTOS(6)任务管理_第13张图片

空闲任务及其钩子函数

RTOS(6)任务管理_第14张图片
idel task:0
task1:1
task2:2
RTOS(6)任务管理_第15张图片
FreeRtos是封装好的,不会让你随随便便修改它的源代码,所以他开放了钩子函数让用户使用;
RTOS(6)任务管理_第16张图片

任务调度

阻塞状态(blocked)的任务,它在等待“事件”,这个事件有两种类型:时间相关的事件,同步事件;

有三个配置在Freertosconfig中,可以决定我们的调度策略
configUSE_PREEMPTION 可以决定是否可以抢占;
configUSE_TIME_SLICING 可以决定同优先级是否轮流进行,无法进行时间片轮转;
如果置于0,除非任务主动放弃cpu,进入blicked或suspend状态,否则直接霸占,其他任务无法执行;
configIDLE_SHOULD_YIELD 可以决定空闲任务是否礼让别的任务;

你可能感兴趣的:(c++)