0%

STM32的PendSV和SVC

STM32中的SVC_Handler

SVC:Supervisor Call,指令用于产生一个SVC异常。它是用户模式代码中的主进程,用于创造对特权操作系统代码的调用。SVC是用于呼叫操作系统所提供API的正道。用户程序只需知道传递给操作系统的参数,而不必知道各API函数的地址。
用途:

  1. 用于在Unprivileged模式下执行Privileged的代码
  2. 中断优先级较高,用于执行一些不能被中断打断的代码(也可以用CPSIE,CPSID指令完成)

参考:https://blog.stratifylabs.co/device/2013-10-12-Effective-Use-of-ARM-Cortex-M3-SVCall/
实例:http://www.keil.com/download/files/stm32_svc.zip

STM32中的PendSV

可悬挂异常。在进入中断后,如果当前没有更高优先级的异常或者中断需要执行,那么就执行pendsv的异常服务函数。
可以看出它有个特点,就是缓期执行。cpu先执行比它高的服务函数,然后在执行它(即为CPU在退出中断回到main函数前执行的最后一个函数)
OS 可以利用它“缓期执行”一个异常——直到其它重要的任务完成后才执行动 作。悬起 PendSV 的方法是:手工往 NVIC的PendSV悬起寄存器中写 1。悬起后,如果优先级不够高,则将缓期等待执行。