本节来讲一讲FreeRTOS的任务调度,这是操作系统最核心的功能。
FreeRTOS支持的任务调度方法有抢占式、协作式、时间片轮转,下面分别来讲解。
1)协作式调度
协作式的调度方式,其本质上是任务在运行一段时间后,自己放弃CPU运行权,让其他任务运行。
在FreeRTOS里,是通过taskYIELD()这个函数实现放弃CPU的。一个典型的协作式任务是在while(1){}大循环的最后,调用taskYIELD()去主动放弃CPU;这时其他处于就绪态的最高优先级的任务才可能运行;如果其他任务都不在就绪状态,那么仍然回到taskYIELD()后面继续运行原来的任务。
在FreeRTOS里taskYIELD()是一种放弃CPU执行权的方法,还可以使用我们前面讲的延时函数vTaskDelay,以及后面会讲到的等待信号量、消息队列等等。
我们以一个例子来试验一下协作式的调度方式。
和前几节一样,我们利用cubemx创建工程,创建三个任务,default任务优先级低,Task02和Task03优先级都为高:
在生成的keil工程中,在FreeRTOSConfig.h文件中,将如下宏configUSE_PREEMPTION定义为0,就使能了协作式调度:
三个任务的执行代码如下所示,都是打印输出,然后延时100ms:
注意这里的延时是HAL库的延时,是不放弃CPU的,也就是一旦某个任务取得了CPU执行权,它就一直占用,不会退出。
执行结果如下图,只有task03在运行,task02和defaulttask都没有执行: