FreeRTOS基础之任务调度机制
1 、什么是任务的调度机制
调度算法决定了哪个就绪(Ready)状态任务转换到运行(Running)状态。
对于单个内核而言,由于每个时刻,只能有一个任务是实际处于运行状态的,其它任务只能处理运行态以外的其它态(阻塞态blocked,就绪态Ready,暂停态Suspended)。因此,当FreeRTOS在任务调度时必须以一种规则来决定选择哪一个Ready状态的任务来进入Running状态。
2、任务调度算法
FreeRTOS有三种调度算法,分别是:
第一种:具有时间片的优先级抢先调度 Prioritized Pre-emptive Scheduling with Time Slicing
第二种:优先级抢先调度(无时间片)Prioritized Pre-emptive Scheduling (without Time Slicing)
第三种:合作调度Co-operative Scheduling
configUSE_PREEMPTION
该算法是配置任务是否具有可抢占的功能,即当高优先级的任务就绪时能否打断低优先级的任务而执行。
定义为 1 代表具有抢占功能,定义为 0 代表不具有抢占功能。
configUSE_TIME_SLICING
该算法是配置 同等 优先级的任务是否具备轮流执行的功能。如果不配置的话,意味着获得执行权限的任务在不结束的情况下会一直执行下去。
定义为 1 代表具有轮流执行的功能,定义为 0 代表不具有轮流执行的功能。
configIDLE_SHOULD_YIELD
该算法是配置空闲任务是否具有 让步 于其他任务的功能。如果配置的话,空闲任务在执行完自己的任务后会立即释放,让其他任务执行,而不会循环执行,即空闲任务占用的时间比较少;否则在时间片轮转的情况下会与其他任务轮流执行。
定义为 1 代表具有让步于其他任务的功能,定义为 0 代表不具有让步于其他任务的功能。
配置项 | A | B | C | D | E |
---|---|---|---|---|---|
configUSE_PREEMPTION | 1 | 1 | 1 | 1 | 0 |
configUSE_TIME_SLICING | 1 | 1 | 0 | 0 | x |
configIDLE_SHOULD_YIELD | 1 | 0 | 1 | 0 | x |
说明 | 常用 | 很少用 | 很少用 | 很少用 | 几乎不用 |
- A:可抢占+时间片轮转+空闲任务让步
- B:可抢占+时间片轮转+空闲任务不让步
- C:可抢占+非时间片轮转+空闲任务让步
- D:可抢占+非时间片轮转+空闲任务不让步
- E:合作调度
对于任务调度算法,通过在文件 FreeRTOSConfig.h
中进行配置。