目录
FreeRTOS操作系统支持三种调度方式:抢占式调度,时间片调度和合作式调度。可以通过configUSE_PREEMPTION和configUSE_TIME_SLICING配置调度算法。
1. 基于时间片的抢占式调度
当configUSE_PREEMPTION = 1且configUSE_TIME_SLICING=1时是基于时间片的抢占式调度。
用之前RT Thread的测试代码验证一下。2个任务代码如下:
static void thread1Entry(void *parameter)
{
uint32_t count = 0;
while (1)
{
Printf("1:%d\n", count++);
delayms(600);
}
}
static void thread2Entry(void *parameter)
{
uint32_t count = 0;
while (1)
{
Printf("2:%d\n", count++);
delayms(300);
}
}
创建任务时将任务1的优先级高于任务2。可以看到任务1一直运行。
改为2个任务的优先级相同,则任务1打印1次,而任务2打印2次,循环执行。
测试结果和RT Thread一样。
2. 无时间片的抢占式调度
当configUSE_PREEMPTION = 1且configUSE_TIME_SLICING=0时是无时间片的抢占式调度。
当任务1的优先级高于任务2时,结果和之前的一样,任务1一直运行。
当任务1的优先级等于任务2时,任务1还是一直运行。
3. 合作式调度
当configUSE_PREEMPTION = 0(configUSE_TIME_SLICING无关)时是合作式调度。
这种方式只有任务进入阻塞或者调用rtosThreadYield时才会任务切换,所以不管优先级怎么设置,任务1一直运行。