以下内容看完应该可以回答下面这几个问题
1、轮流创建任务:
Task1
Task2
Task3
开启任务调度之后,为什么先运行Task3?
2、同优先级如何切换任务?
3、不同优先级如何切换任务?
猜测:创建任务的时候,freertos会判断当前创建的任务优先级是否更高,如果更高,就运行高优先级的
4、创建任务的过程中做了什么事情?
如图,在xTaskCreate时,会把新建任务加入对应优先级的ReadyLists中,并且有个pxCurrentTCB指针指向它,当开启任务调度后,就会从pxCurrentTCB指向的任务开始运行。
如图,freertos有一个Tick中断,默认频率是1000,也即没过1ms中断一次。进入中断后,会先查询DelayLists,看是否Delay够了,如果够了就把他放到ReadyLists中,然后再不断查询ReadLists,从最高优先级开始,这样进行调度。
为什么需要空闲任务?
如果有任务自杀(vTaskDelete),需要回收栈,空闲任务会负责回收自杀任务的栈空间。
但是空闲任务的优先级是最高的,因此如果其他任务都在running或者ready的话,空闲任务就永远没有办法运行,所以,建议不要使用Delay函数,而是使用vTaskDelay函数使任务进入阻塞态,CPU可以运行空闲任务“收尸”。
两个Delay函数
vTaskDelay
不能保证函数周期性运行,因为可能每次运行的时间不一样
vTaskDelayUntil(&preTime, 15Ticks)
(其中preTime = xTaskGetTickCount()获得)
该延时函数可以保证任务周期性运行