一、概念
PendSV异常也叫做可悬挂的系统调用,在操作系统中用于缓期执行一个异常,直到其他重要任务完成以后才执行异常动作,使用PendSV的方法是手工往NVIC的PendSV悬起寄存器里边写入1,即可开启PendSV异常。
二、典型场合
PendSV异常一般用于下述场合:如果在普通中断发生以后已经进入其中断程序了,此时又发生定时器中断,那么此时定时器中断会抢占普通中断,然后我们看到定时器中断服务函数里边会发生任务的切换,但是此时os是不会允许你发生任务切换的,因为对任何一款实时操作系统来说,实时性是最重要的,如果你此时发生了任务切换,那么就会发生普通中断得不到及时响应的情况,使得普通中断的实时响应性没有保障。因此就有了引入PendSV异常,它可以做到当发生上述情况时去延迟任务切换,也就是说当定时器中断抢占普通中断以后,此时会挂起一个PendSV中断,然后回到普通中断执行普通中断的服务程序,等待普通中断服务程序执行完以后,才在PendSV里边去执行PendSV的服务程序并进行任务级切换。而要达到延缓任务切换的目的,需要将PendSV异常的优先级调到最低。上述过程如下图所示:
上图表示的是使用PendSV来控制上下文切换,当OS检测到某个普通中断正在执行中断服务程序,但此时被定时器异常所抢占,此时OS将悬起一个PendSV异常,等到普通中断服务程序执行完以后才去执行定时器异常的任务切换请求。具体步骤如下所示:
其中,SVC代表的是系统调用,用于产生系统函数的调用请求。比如在OS中,是不会让用户直接访问硬件的,而是通过一些系统函数来访问硬件,而SVC就是用于发出调用系统函数的请求,用这种方法来间接访问硬件。因此,当用户程序想要控制特定的硬件时,它就会产生一个 SVC 异常,然后操作系统提供的 SVC 异常服务例程得到执行,它再调用相关的操作系统函数,后者完成用户程序请求的服务。