任务状态理论
我们是怎么实现,两个同优先级的任务之间交替执行的呢?
任务切换的基础:tick中断!
tick为1ms一个周期,可以通过修改时钟配置修改;
running:正在进行的任务3为running;
ready:任务1和任务2处于ready;
blocked(阻塞状态):等待某事,比如小孩口中的饭还没吃完,就得等吃完才喂;
suspend(暂停状态):主动休息或者被命令休息;
如何管理这些任务呢?
链表readylist:A->B->C
任务状态实验
创建三个任务
任务一:进入suspend再resume回来
任务二:进入blocked,delay一会,再进入ready状态
vTaskDelay和vTaskDelayuntil
dosomething()的时间不定,如何才能保证它的执行周期是不变的呢?
vTaskDelay只能保证延时的时间,不考虑dosomething的时间;
vTaskDelay:等待指定个数的Tick count才能ready,继续执行;
vTaskDelayuntil:等待到指定的绝对时刻,才能reday,继续执行;
区别:
空闲任务及其钩子函数
idel task:0
task1:1
task2:2
FreeRtos是封装好的,不会让你随随便便修改它的源代码,所以他开放了钩子函数让用户使用;
任务调度
阻塞状态(blocked)的任务,它在等待“事件”,这个事件有两种类型:时间相关的事件,同步事件;
有三个配置在Freertosconfig中,可以决定我们的调度策略
configUSE_PREEMPTION 可以决定是否可以抢占;
configUSE_TIME_SLICING 可以决定同优先级是否轮流进行,无法进行时间片轮转;
如果置于0,除非任务主动放弃cpu,进入blicked或suspend状态,否则直接霸占,其他任务无法执行;
configIDLE_SHOULD_YIELD 可以决定空闲任务是否礼让别的任务;