SVC和PendSV
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相关推荐
- cortex-M3 的SVC、PendSV异常,与操作系统(ucos实时系统)
SVC异常是? PendSV异常是? ucos 任务切换时机? ucos 如何满足实时性(实现)? ucos中,systick的优先级? SVC和PendSV SVC(系统服务调用,亦简称系统 ...
- Cortex-M3 的SVC、PendSV异常,与操作系统(ucos实时系统)(转)
Cortex-M3 的SVC.PendSV异常,与操作系统(ucos实时系统) 转载于:https://www.cnblogs.com/LittleTiger/p/10070824.html
- RTOS系列(12):使用SVC或PendSV启动OS流程详细分析
RTOS系列(1):基础知识--中断嵌套 RTOS系列文章(2):PendSV功能,为什么需要PendSV RTOS系列文章(3): 为什么将SysTick和PendSV的优先级设置为最低 RTOS系 ...
- 系统异常SVC与PendSV指令及CM3 处理器内部寄存器分析
参考文献: 1.<[野火®]uCOS-III 内核实现与应用开发实战指南-基于STM32 >: 2.CM3 权威指南CnR2(电子版)/Cortex-M3 权威指南 Joseph Yiu ...
- *关于系统调用我自己再整理一下(系统调用,任务切换,pendsv中断,SVC,整个理顺打通了)
关于系统调用我自己再整理一下 https://www.sohu.com/a/163180953_777180 也就是系统调用之后还要恢复到用户态的,这感觉似乎就像中断,莫非内核态是在中断服务函数中完成 ...
- 姚文详(Joseph Yiu):《ARM Cortex-M0权威指南》中文版目录
JosephYiu是英国ARM公司微控制器系统级设计专家,是ARMCortex-M3和Cortex-M0设计者,作者高屋建瓴,创作了基于Cortex-M0的重量级作品--<ARMCortex-M ...
- Cortex-M3-中断/异常的响应序列
Cortex-M3-中断/异常的响应序列 当CM3开始响应一个中断时,会在它看不见的体内奔涌起三股暗流: 入栈: 把8个寄存器的值压入栈. 取向量:从向量表中找出对应的服务程序入口地址. 选择堆栈指针 ...
- Cortex-M3基础
(一)寄存器 1 寄存器组 R0-R12: 通用寄存器 ------------------------------------------------------------------- ...
- FreeRTOS及其应用,万字长文,基础入门
嵌入式系统不只是ARM+Linux,不是只有安卓,凡是电子产品都可称为嵌入式系统.物联网行业的兴起,也提升了FreeRTOS市场占有率.本文就是介绍FreeRTOS基础及其应用,只是个人整理,可能存在 ...
最新文章
- 前沿|8种面部表情实时追踪,你的喜怒哀乐全被AI看穿了
- 汇编语言 段前缀的使用 复制内存单元数据到指定位置
- ubuntu安装后需了解的基本操作
- Ubuntu下安装Oracle11g(图文教程)
- fasttext 文本分类_一文综述经典的深度文本分类方法
- Ubuntu中的密钥环密码与登陆密码不同
- 使用LBP+SVM,训练识别给定的测试图像
- ajax jsonp post php,※ajax的post方式注意点※及jsonp的封装
- 关于笔记本品牌的笑话!
- IntelliJ IDEA For Mac 快捷键,够骚,速度收藏!
- 归并排序java示例
- Gradle全版本资源下载
- 傅里叶分析之掐死教程(完整版)
- wamp mysql 端口_Wamp修改端口的方法
- 开发人员常用工具最全锦集(持续更新)
- 改后缀名不能导致图片格式的转换,以.png后缀名的图片不一定是png图片
- 淘宝数据库负责人介绍淘宝数据库设计
- 讲个笑话,我工作3年天天人肉提数,还不如一个应届生!
- Jupyter Notebook 开发指南
- JetBrains IDE Support的安装
热门文章
- 一文学会 Maven 的版本发布
- Spring Cloud Gateway(过滤器)
- Win10电脑录屏,视频有杂音,用耳机录音
- Java 基础之 Random类和Math.random()方法
- Android --- SharedPreferences的详细介绍
- rust比java慢,rust为什么跑得比js慢
- php中new运算符的作用,C++_C++编程中new运算符的使用学习教程,new运算符用作从自由存储为 typ - phpStudy...
- matlab计算方程fsolve,matlab中关于fsolve解非线性方程组的问题
- 电厂运维的cis数据_数据中心运维,太难难难了
- 绿色运营,数据中心还得靠自动化