0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

操作系统的哼哈二将---SVC和PENDSV

嵌入式BugMaker 来源:嵌入式BugMaker 2023-03-06 09:47 次阅读

ARM芯片中对于需要使用到操作系统的情况,SVC和PendSV是两个很重要的中断。但是在实际使用的过程中,不免会产生几个疑问。一个是这两个中断都是属于由用户来主动触发的中断,他们有什么区别?还有一个就是为什么会是使用SVC来提供系统服务访问入口,而PendSV则是做上下文切换?带着这些疑问,开始本篇的讲解

SVC(Supervisor Call请求管理调用)

调用SVC指令就会触发SVC中断,它的作用乍一看和普通调用函数有点像,不同的是它跳转的不是函数而是SVC中断handler,因此大家可以把它看成是一个交由用户控制的中断源。

它的编写方法如下图所示,资料来自与《Armv7-M Architecture Reference Manual》

d0bc290e-bb5e-11ed-bfe3-dac502259ad0.png

SVC指令构成图

如下实例代码是编号为0的函数来触发Supervisor call

__asm void CallSupervisor( void )
{
  svc 0   
}

那么问题来了,不同的编号触发的是同一个SVCall Handler中断处理函数,那么我们要怎么知道是哪个编号触发的呢?这个知识点就涉及到CortexM内核的异常压栈机制,具体可以参考公众号《如何知道程序是运行到哪里触发的中断》;

如下图范例可以看出,这里调用了一个编码为10的SVC指令,SVC指令地址为0x8001fa0,地址上的内容是0xdf0a。结合SVC指令构成图可知其二进制指令构成0xdf+编号,所以这里看到二进制的数据为0xdf0a,是个编号10的SVC指令。

d1175658-bb5e-11ed-bfe3-dac502259ad0.jpg

根据异常压栈内容可知返回地址为0x8001af2,所以可得SVC指令编号 = 异常压栈后的返回地址-2。之所以减2是因为thumb指令为大小为2 bytes,刚好就是SVC指令的大小(0xdf0a)。可以看出执行完SVC指令立刻就会执行中断动作

d17a87aa-bb5e-11ed-bfe3-dac502259ad0.jpg

PendSV(Pendable Service Call可挂起的系统调用)

PendSV其实和SVC有点像,所以很容易被混淆。其是通过使能中断控制状态寄存器中的PENDSVSET位,来实现触发。一般情况下PendSV的中断优先级都配置比较低,所以可以理解调用PENDSV后,这个中断触发允许被挂起,等没有优先级更高的中断需要运行的时候,才会触发PendSV中断,就是一个允许延时一会再执行的SVC。

/* Interrupt control state register:0xe000ed04
 * Bit 28 PENDSVSET: PendSV Bit
 */
#define NVIC_INT_CTRL_REG( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
#define NVIC_PENDSVSET_BIT( 1UL << 28UL )

#define CallPendSV()
{
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
}

哼哈二将的职责

在操作系统中,通常使用SVC指令来请求系统调用,而PendSV来进行线程切换时上下文保存动作。刚开始学习操作系统的时候,有点困惑为什么要这样做功能划分,这两个中断都让我有点傻傻分不清楚。后来觉得其实这应该也不算是硬性规定,就是约定俗成这么干,理论上用哪个去申请系统调用和切换上下文都是可以的。这也不是随意猜测的,如下可以看几个例子,在FreeRTOS中第一个任务的调用就是用的SVC,后面就一直是使用PENDSV做上下文切换;而在UCOSRT-Thread中则是从第一个任务开始就都是使用的PENDSV。

下图为FreeRTOS调度器首次运行时是使用SVC指令

d1aca7f8-bb5e-11ed-bfe3-dac502259ad0.png

下图示UCOS调度器首次运行时是使用PENDSV

d1ceafd8-bb5e-11ed-bfe3-dac502259ad0.png

下图示RT_Thread调度器首次运行时是使用PENDSV

d1ffc992-bb5e-11ed-bfe3-dac502259ad0.png

那为什么CortexM要出这个SVC和PENDSV这两个由用户用来触发中断的指令,用来辅助操作系统呢?众所周知,CortexM内核有多重模式的,主要分为特权模式非特权模式。默认情况下我们是处于特权模式,所以各位工程师可以愉快的修改各种内核寄存器,配置、开关中断。可以设想一下,如果用户代码可以肆意的开关中断,那对于操作系统就存在失控的隐患。因此出于运行安全上的考虑,操作系统是希望用户运行其代码的时候是处于非特权模式,仅有操作系统来接管内核寄存器的控制。而中断触发后会将非特权模式切换为特权模式,现在就清楚了SVC和PENDSV指令的作用就是提供让非特权模式下的用户层代码可以进入特权模式的接口,将权限交给操作系统进行内核以及寄存器的操作。完成操作后切换回非特权模式并返回用户层代码继续运行。

d2526904-bb5e-11ed-bfe3-dac502259ad0.png

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8653

    浏览量

    361847
  • 寄存器
    +关注

    关注

    30

    文章

    5037

    浏览量

    117764
  • 内核
    +关注

    关注

    3

    文章

    1309

    浏览量

    39862
  • 操作系统
    +关注

    关注

    37

    文章

    6290

    浏览量

    121898
  • SVC
    SVC
    +关注

    关注

    0

    文章

    33

    浏览量

    11930

原文标题:操作系统的哼哈二将---SVC和PENDSV

文章出处:【微信号:嵌入式BugMaker,微信公众号:嵌入式BugMaker】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【RTX操作系统教程】第5章 RTX操作系统库方式移植(超级简单)

    第5章RTX操作系统库方式移植(超级简单) 本章教程为大家介绍RTX操作系统库方式移植,库方式的移植超级简单,应该是所有RTOS里面最简单的了,仅需简单的两步就可以完成。 本章教程含
    发表于 01-19 14:59

    【安富莱】【RTX操作系统教程】第6章 RTX操作系统源码方式移植

    `第6章RTX操作系统源码方式移植本章教程为大家介绍RTX操作系统源码方式移植,移植工作比较简单,只需要用户添加需要的源码文件即可,不需要做任何的底层工作,也不需要用户做任何修改。 本章教程含
    发表于 01-20 14:55

    【安富莱】【RTX操作系统教程】第19章 SVC中断方式调用用户函数

    【安富莱】【RTX操作系统教程】第19章SVC中断方式调用用户函数第19章 SVC中断方式调用用户函数 本章节为大家讲解如何采用SVC中断方式调用用户函数。当用户
    发表于 02-03 17:10

    转:第5章 FreeRTOS操作系统移植(MDK版)

    本章教程将为大家介绍基于MDK的FreeRTOS操作系统移植。移植工作比较简单,只需要用户添加需要的源码文件,不需要做任何的底层工作,再添加三个宏定义即可。本章教程含Cortex-M3内核
    发表于 08-21 15:34

    转:第6章 FreeRTOS操作系统移植(IAR版)

    本章教程为大家介绍基于IAR的FreeRTOS操作系统移植,移植工作比较简单,只需要用户添加需要的源码文件,不需要做任何的底层工作,再添加三个宏定义即可。 本章教程包含Cortex-M3内核
    发表于 08-22 09:58

    第5章 RTX操作系统库方式移植(超级简单)

    转rtx操作系统本章教程为大家介绍RTX操作系统库方式移植,库方式的移植超级简单,应该是所有RTOS里面最简单的了,仅需简单的两步就可以完成。本章教程含Cortex-M3内核的STM32F103
    发表于 10-02 10:01

    第6章 RTX操作系统源码方式移植

    转rtx操作系统本章教程为大家介绍RTX操作系统源码方式移植,移植工作比较简单,只需要用户添加需要的源码文件即可,不需要做任何的底层工作,也不需要用户做任何修改。本章教程含Cortex-M3内核
    发表于 10-02 11:54

    第19章 SVC中断方式调用用户函数

    转rtx操作系统本章节为大家讲解如何采用SVC中断方式调用用户函数。当用户RTX任务设置为工作在非特权级模式时,任务中是不允许访问特权级寄存器的,这个时候使用SVC中断,此问题就迎刃
    发表于 10-08 08:15

    【设计技巧】从单片机到操作系统(6)-FreeRTOS任务切换机制详解

    操作系统函数,后者完成用户程序请求的服务。 另一个相关的异常是 PendSV(可悬起的系统调用),它和 SVC 协同使用。一方面,SVC
    发表于 07-31 08:30

    【原创分享】单片机支持操作系统的特性

    1、支持操作系统的特性概述:就拿M0核的单片机来说,就有一部分特性是针对嵌入式操作系统的(OS),包括:l SysTick定时器,24位向下计数,且周期产生SysTick异常。l 栈指针,即进程栈
    发表于 11-16 10:32

    SVC工作模式优点

    一、SVCSVC(系统服务调用,亦简称系统调用)用于产生系统函数的调用请求。例如,操作系统不让用户程序直接访问硬件,而是通过提供一些系统服务
    发表于 12-13 07:58

    SVCPendSV异常有什么用途?

    延时定时器等。SVCPendSV主要是由操作系统来使用,在FreeRTOS、μC/OS等RTOS中都会使用PendSV异常来实现任务上下文的切换。不过除了需要做OS的移植工作,对OS
    发表于 05-12 10:58

    RTOS操作系统

    RTOS操作系统RTOS操作系统RTOS操作系统RTOS操作系统RTOS操作系统
    发表于 12-28 15:30 0次下载

    支持操作系统的特性概述

    ,即进程栈指针,两个栈指针的结构可以使得应用栈和OS内核栈相互独立。 l SVC异常和SVC指令,通过异常机制,应用程序可以使用SVC访问OS服务。 l PendSV异常,其可以被OS
    的头像 发表于 11-12 11:03 1108次阅读

    单片机支持操作系统的特性概述

    ,即进程栈指针,两个栈指针的结构可以使得应用栈和OS内核栈相互独立。 l SVC异常和SVC指令,通过异常机制,应用程序可以使用SVC访问OS服务。 l PendSV异常,其可以被OS
    的头像 发表于 12-02 15:21 2643次阅读
    单片机支持<b class='flag-5'>操作系统</b>的特性概述