任务状态理论
我们是怎么实现,两个同优先级的任务之间交替执行的呢?
 任务切换的基础: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 可以决定空闲任务是否礼让别的任务;