怎样去理解异常SVC和PendSV

目录

什么是SVC和PendSV


什么是SVC和PendSV

SVC(系统服务调用)和 PendSV( 可悬挂系统调用 )。
 
它们多用于在操作系统之上的软件开发中。
SVC 用于产生系统函数的调用请求。
例如,操作系统不让用户程序直接访问硬件,而是通过提供一些系统服务函数,用户程序使用 SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件。因此,当用户程序想要控制特定的硬件时,它就会产生一个 SVC 异常,然后操作系统提供的 SVC 异常服务例程得到执行,它再调用相关的操作系统函数,后者完成用户程序请求的服务。
 

怎样去理解异常SVC和PendSV_第1张图片

获取数据有两条路线:

  1. 通过SVC。
  2. 绕过SVC(但是不允许)。

实现软件硬件分离。 

另一个相关的异常是 PendSV(可悬挂的系统调用),它和 SVC 协同使用。一方面, SVC异常是必须立即得到响应的(若因优先级不比当前正处理的高, 或是其它原因使之无法立即响应, 将上访成硬 fault),应用程序执行 SVC 时都是希望所需的请求立即得到响应。
另一方面, PendSV 则不同,它是可以像普通的中断一样被悬起的(不像 SVC 那样会上访)。 OS 可以利用它“缓期执行” 一个异常——直到其它重要的任务完成后才执行动作。 悬起 PendSV 的方法是:手工往 NVIC 的 PendSV 悬起寄存器中写 1。 悬起后, 如果优先级不够高,则将缓期等待执行。

PendSV是可悬起异常,如果我们把它配置最低优先级,那么如果同时有多个异常被触发,它会在其他异常执行完毕后再执行,而且任何异常都可以中断它。

 假设任务A、任务B。

怎样去理解异常SVC和PendSV_第2张图片

 任务A,2ms执行结束后延迟500ms再次执行,那么OS在这段500ms内寻找下一个要执行的任务B,任务B,2ms执行结束延迟600ms再次执行(如果还有任务C、E等依次类推)。但是现在任务A并没有延迟到500ms所以此时OS执行空闲任务,到达500ms后执行任务A。

当空闲任务切换到任务A或者任务B时,此时突然中断产生,PendSV执行,PendSV 异常会自动延迟上下文切换的请求,直到其它的 ISR 都完成了处理后才放行。

更多细节参考: 

【FreeRTOS】读书笔记,嵌入式微操作系统 任务管理

【μC/OS-III】读书笔记,嵌入式微操作系统 中断管理 

你可能感兴趣的:(微操作系统)