目录
一、PendSV异常
PendSV(可挂起的系统调用)其优先级可以通过编程设置。可以通过将中断控制和壮态寄存器 ICSR 的 bit28,也就是 PendSV 的挂起位置 1 来触发 PendSV 中断。
与SVC异常不同,它是不精确的,因此它的挂起壮态可在更高优先级异常处理内设置,且会在高优先级处理完成后执行。利用该特性,若将PendSV设置为最低的异常优先级,可以让PendSV异常处理在所有其他中断处理完成后执行,这对于上下文切换非常有用,也是各种OS设计中的关键。
在具有嵌入式OS的典型系统中,处理时间被划分为了多个时间片。若系统中只有两个任务,这两个任务会交替执行,如下图所示:
二、任务切换场合
1、执行系统调用
执行系统调用就是执行FreeRTOS系统提供的相关API函数,比如任务切换函数taskYIELD(), FreeRTOS有些API函数也会调用函数taskYIELD(),这些API函数都会导致任务切换,这些API函数和任务切换函数taskYIELD()都统称为系统调用。函数taskYIELD()其 实就是个宏,在文件task.h中有如下定义:
在文件portmacro.h中有如下定义:
通过向中断控制和壮态寄存器 ICSR 的 bit28 写入 1 挂起 PendSV 来启动 PendSV 中断;这样就可以在PendSV中断服务函数中进行任务切换了。
2、滴答定时器(SysTick)中断
FreeRTOS中滴答定时器(SysTick)中断服务函数中也会进行任务切换,滴答定时器中断服务函数如下: