1.SVC

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

SVC指令带一个8位的立即数,可以视为是它的参数,被封装在指令自身,如:

SVC    3:呼叫3号系统服务

则3被封装在这个SVC指令中。因此在SVC服务例程中,需要读取本次触发SVC异常的SVC指令,并提取出8位立即数所在的位段,从而判断系统调用号,工作流程如图7-7所示。

实现上图功能的代码如下所示:
svc_handler
 TST       LR,   #0x4;  ;测试EXC_RETURN的比特2
 ITE       EQ;    ;如果为0
 MRSEQ   R0,   MSP;   ;则使用的是主堆栈,故把MSP的值取出
 MRSNE   R0,   PSP;   ;否则,使用的是进程堆栈,故把PSP的值取出
 LDR      R1,   {R0,#24}; ;从栈中读取PC值
 LDRB     R0,  {R1,#-2};  ;从SVC指令中读取立即数放到R0
; 准备调用系统服务函数。这需要适当调整入栈的PC值及LR(EXC_RETURN)来进入OS内部
  BX        LR;     ;借异常返回的形式,进入OS内部,最终调用系统服务函数

一旦获取了调用号,就可以用它来调用系统服务函数了。有理由相信,操作系统应该使用TBB/TBH查表跳转指令来加速定位正确的服务函数。然而,如果读者是设计OS的人员,则必须检查这个参数的合法性,以免因数字超出跳转表的范围而跳飞。因为不能在SVC服务例程中嵌套使用SVC,所以如果有需要,就要直接调用SVC函数,如使用BL指令。

2.PendSV

PendSV是为系统级服务提供的中断驱动。在一个操作系统环境中,当没有其他异常正在执行时,可以使用PendSV来进行上下文的切换。

在进入PendSV处理函数时:

(1)xPSR、PC、LR、R12、R0~R3已经在处理栈中被保存。

(2)处理模式切换到线程模式。

(3)栈是主堆栈。

由于PendSV在系统中被设置为最低优先级,因此只有当没有其他异常或者中断在执行时才会被执行。

SVC和PendSV相关推荐

  1. cortex-M3 的SVC、PendSV异常,与操作系统(ucos实时系统)

    SVC异常是?  PendSV异常是?  ucos 任务切换时机?  ucos 如何满足实时性(实现)?  ucos中,systick的优先级? SVC和PendSV SVC(系统服务调用,亦简称系统 ...

  2. Cortex-M3 的SVC、PendSV异常,与操作系统(ucos实时系统)(转)

    Cortex-M3 的SVC.PendSV异常,与操作系统(ucos实时系统) 转载于:https://www.cnblogs.com/LittleTiger/p/10070824.html

  3. RTOS系列(12):使用SVC或PendSV启动OS流程详细分析

    RTOS系列(1):基础知识--中断嵌套 RTOS系列文章(2):PendSV功能,为什么需要PendSV RTOS系列文章(3): 为什么将SysTick和PendSV的优先级设置为最低 RTOS系 ...

  4. 系统异常SVC与PendSV指令及CM3 处理器内部寄存器分析

    参考文献: 1.<[野火®]uCOS-III 内核实现与应用开发实战指南-基于STM32 >: 2.CM3 权威指南CnR2(电子版)/Cortex-M3 权威指南 Joseph Yiu ...

  5. *关于系统调用我自己再整理一下(系统调用,任务切换,pendsv中断,SVC,整个理顺打通了)

    关于系统调用我自己再整理一下 https://www.sohu.com/a/163180953_777180 也就是系统调用之后还要恢复到用户态的,这感觉似乎就像中断,莫非内核态是在中断服务函数中完成 ...

  6. 姚文详(Joseph Yiu):《ARM Cortex-M0权威指南》中文版目录

    JosephYiu是英国ARM公司微控制器系统级设计专家,是ARMCortex-M3和Cortex-M0设计者,作者高屋建瓴,创作了基于Cortex-M0的重量级作品--<ARMCortex-M ...

  7. Cortex-M3-中断/异常的响应序列

    Cortex-M3-中断/异常的响应序列 当CM3开始响应一个中断时,会在它看不见的体内奔涌起三股暗流: 入栈: 把8个寄存器的值压入栈. 取向量:从向量表中找出对应的服务程序入口地址. 选择堆栈指针 ...

  8. Cortex-M3基础

    (一)寄存器 1 寄存器组      R0-R12: 通用寄存器 ------------------------------------------------------------------- ...

  9. FreeRTOS及其应用,万字长文,基础入门

    嵌入式系统不只是ARM+Linux,不是只有安卓,凡是电子产品都可称为嵌入式系统.物联网行业的兴起,也提升了FreeRTOS市场占有率.本文就是介绍FreeRTOS基础及其应用,只是个人整理,可能存在 ...

最新文章

  1. 前沿|8种面部表情实时追踪,你的喜怒哀乐全被AI看穿了
  2. 汇编语言 段前缀的使用 复制内存单元数据到指定位置
  3. ubuntu安装后需了解的基本操作
  4. Ubuntu下安装Oracle11g(图文教程)
  5. fasttext 文本分类_一文综述经典的深度文本分类方法
  6. Ubuntu中的密钥环密码与登陆密码不同
  7. 使用LBP+SVM,训练识别给定的测试图像
  8. ajax jsonp post php,※ajax的post方式注意点※及jsonp的封装
  9. 关于笔记本品牌的笑话!
  10. IntelliJ IDEA For Mac 快捷键,够骚,速度收藏!
  11. 归并排序java示例
  12. Gradle全版本资源下载
  13. 傅里叶分析之掐死教程(完整版)
  14. wamp mysql 端口_Wamp修改端口的方法
  15. 开发人员常用工具最全锦集(持续更新)
  16. 改后缀名不能导致图片格式的转换,以.png后缀名的图片不一定是png图片
  17. 淘宝数据库负责人介绍淘宝数据库设计
  18. 讲个笑话,我工作3年天天人肉提数,还不如一个应届生!
  19. Jupyter Notebook 开发指南
  20. JetBrains IDE Support的安装

热门文章

  1. 一文学会 Maven 的版本发布
  2. Spring Cloud Gateway(过滤器)
  3. Win10电脑录屏,视频有杂音,用耳机录音
  4. Java 基础之 Random类和Math.random()方法
  5. Android --- SharedPreferences的详细介绍
  6. rust比java慢,rust为什么跑得比js慢
  7. php中new运算符的作用,C++_C++编程中new运算符的使用学习教程,new运算符用作从自由存储为 typ - phpStudy...
  8. matlab计算方程fsolve,matlab中关于fsolve解非线性方程组的问题
  9. 电厂运维的cis数据_数据中心运维,太难难难了
  10. 绿色运营,数据中心还得靠自动化