RTOS的核心是任务管理,任务管理的核心是任务切换。任务切换的效率高低决定了一个实时系统的性能。
FreeRTOS 支持时间片轮序和优先级抢占。系统调度器通过调度算法确定当前需要获得CPU 使用权的任务并让其处于运行状态。对于嵌入式系统,某些任务需要获得快速的响应,如果使用时间片,该任务可能无法及时被运行,因此抢占调度是必须的,高优先级的任务一旦就绪就能及时运行;而对于同优先级任务,系统根据时间片调度,给予每个任务相同的运行时间片,保证每个任务都能获得CPU 。
系统在任务切换和中断处理过程中的流程:
1、优先级高的task1正在执行。
2、系统产生中断,cpu使用权交给中断任务,任务一被挂起。
3、中断处理完成,task1继续执行,task1运行到阻塞或者被挂起
4、cpu使用权交给优先级低的任务task2,和task2同优先级的task3准备就绪,时间片调度
5、没有用户任务运行,cpu执行空闲任务
可见执行任务切换的有两种情况:
1、同等级任务时间片用完,提前挂起触发切换在 SysTick 节拍计数器中断中触发异常
2、高优先任务恢复就绪(如信号量,队列等阻塞、挂起状态下退出)时抢占
最终都是通过调用移植层提供的 portYIELD() 宏悬起 PendSV 异常
1、PendSV异常
pendSV(可挂起的系统调用)由于它是不精确的,所以它的挂起状态可以在更高级的异常处理中进行设置并在高优先级的异常处理完成后执行,因此他常常被被设置为优先级最低。