Cortex-M3/M4之SVC和PendSV异常

news2024/11/24 18:56:00

一、SVC异常

SVC(系统服务调用,亦简称系统调用)用于产生系统函数的调用请求。例如,操作系统不让用户程序直接访问硬件,而是通过提供一些系统服务函数,用户程序使用 SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件。

因此,当用户程序想要控制特定的硬件时,它就会产生一个 SVC 异常,然后操作系统提供的 SVC 异常服务例程得到执行,它再调用相关的操作系统函数,后者完成用户程序请求的服务。这种“提出要求——得到满足”的方式,很好、很强大、很方便、很灵活、很能可持续发展。

首先,它使用户程序从控制硬件的繁文缛节中解脱出来,而是由 OS 负责控制具体的硬件

第二, OS 的代码可以经过充分的测试,从而能使系统更加健壮和可靠。

第三,它使用户程序无需在特权级下执行,用户程序无需承担因误操作而瘫痪整个系统的风险。

第四,通过 SVC 的机制,还让用户程序变得与硬件无关,因此在开发应用程序时无需了解硬件的操作细节,从而简化了开发的难度和繁琐度,并且使应用程序跨硬件平台移植成为可能。开发应用程序唯一需要知道的就是操作系统提供的应用编程接口(API),并且了解各个请求代号和参数表,然后就可以使用 SVC 来提出要求了。 其实,严格地讲,操作硬件的工作是由设备驱动程序完成的,只是对应用程序来说,它们也是操作系统的一部分,如图所示。

 SVC 异常通过执行” SVC”指令来产生。该指令需要一个立即数,充当系统调用代号。 SVC异常服务例程稍后会提取出此代号,从而解释本次调用的具体要求,再调用相应的服务函数。

例如:SVC 0x3 ; 调用 3 号系统服务

在 SVC 服务例程执行后,上次执行的 SVC 指令地址可以根据自动入栈的返回地址计算出。找到了 SVC 指令后,就可以读取该 SVC 指令的机器码,从机器码中萃取出立即数,就获知了请求执行的功能代号。如果用户程序使用的是 PSP, 服务例程还需要先执行 MRSRn,PSP 指令来获取应用程序的堆栈指针。通过分析 LR 的值,可以获知在 SVC 指令执行时正在使用哪个堆栈。

二、PendSV异常

PendSV(可悬起的系统调用),它和 SVC 协同使用。一方面, SVC 异常是必须立即得到响应的应用程序执行 SVC 时都是希望所需的请求立即得到响应。另一方面, PendSV 则不同,它是可以像普通的中断一样被悬起的(不像 SVC 那样会上访)。 OS 可以利用它“缓期执行” 一个异常,直到其它重要的任务完成后才执行动作。 悬起 PendSV 的方法是:手工往 NVIC 的PendSV 悬起寄存器中写 1。 悬起后, 如果优先级不够高,则将缓期等待执行。PendSV 的典型使用场合是在上下文切换时(在不同任务之间切换)。例如,一个系统中有两个就绪的任务,上下文切换被触发的场合可以是:
1、执行一个系统调用

2、系统滴答定时器(systick)中断(轮转调度中需要)
举个例子来理解:假设有这么一个系统,里面有两个就绪的任务,并且通过SysTick异常启动上下文切换,如下图所示:

上图是两个任务轮转调度的示意图。但若在产生 Sys Tick 异常时正在响应一个中断,则 SysTick 异常会抢占其 ISR。在这种情况下, OS 不得执行上下文切换,否则将使中断请求被延迟,而且在真实系统中延迟时间还往往不可预知——任何有一丁点实时要求的系统都决不能容忍这种事。因此,在 CM3/CM4 中也是严禁没商量——如果 OS 在某中断活跃时尝试切入线程模式,将触犯用法 fault 异常,如图所示。

为解决此问题,早期的 OS 会检测当前是否有中断在活跃中,只有没有任何中断需要响应时,才执行上下文切换(切换期间无法响应中断)。然而,这种方法的弊端在于,它可以把任务切换动作拖延很久(因为如果抢占了 IRQ,本次 SysTick 在执行后不得作上下文切换,只能等待下一SysTick 异常),尤其是当某中断源的频率和 Sys Tick 异常的频率比较接近时,会发生“共振”。现在好了, Pen d SV 来完美解决这个问题了。 Pen d SV 异常会自动延迟上下文切换的请求, 直到其它的 ISR 都完成了处理后才放行。为实现这个机制,需要把 PendSV 编程为最低优先级的异常。如果 O S 检测到某 IRQ 正在活动并且被 SysTick 抢占,它将悬起一个 PendSV异常, 以便缓期执行上下文切换,如图所示。

上图中事件的流水账记录如下:

(1) 任务 A 呼叫 SVC 来请求任务切换(例如,等待某些工作完成)
(2) OS 接收到请求,做好上下文切换的准备,并且 pend 一个 PendSV 异常。
(3) 当 CPU 退出 SVC 后,它立即进入 PendSV,从而执行上下文切换。
(4) 当 PendSV 执行完毕后,将返回到任务 B,同时进入线程模式。
(5) 发生了一个中断,并且中断服务程序开始执行
(6) 在 ISR 执行过程中,发生 SysTick 异常,并且抢占了该 ISR。
(7) OS 执行必要的操作,然后 pend 起 PendSV 异常以作好上下文切换的准备。
(8) 当 SysTick 退出后,回到先前被抢占的 ISR 中, ISR 继续执行
(9) ISR 执行完毕并退出后, PendSV 服务例程开始执行,并且在里面执行上下文切换。
(10) 当 PendSV 执行完毕后,回到任务 A,同时系统再次进入线程模式。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1037947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

更新至2022年上市公司ESG评级评分数据合集(含华证、盟浪、wind、彭博、润灵环球、商道融绿、和讯网、富时罗素数据)

更新至2022年ESG评级评分数据合集(含华证、盟浪、wind、彭博、润灵环球、商道融绿、和讯网、富时罗素及世界各国ESG数据) 1、来源:整理自wind和csmar 2、具体时间: 华证:2009-2022年、盟浪:2018-2022年、…

Python实现猎人猎物优化算法(HPO)优化LightGBM分类模型(LGBMClassifier算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

【教学类-35-02】学号+姓名+班级(小2班)学号字帖(A4横版2份)

图片展示: 背景需求: 突然接到通知,明天下午临时去带小2班。 小班刚入园的孩子,能给他们提供什么样的可操作的学具呢? 思来想去,还是让生成一份学号字帖,让幼儿熟悉自己的学号,让我也熟悉幼儿的名字和学…

苹果手表 Series 6 拆解

步骤 1 苹果手表 Series 6 拆解 Series 6(右)与具有一年历史的姐妹(左)的外部比较仅显示出细微的差异,但这就是拆卸的目的。我们已经知道这些细节: LTPO OLED Retina 显示屏针对常亮功能进行了优化——这次…

Nginx浏览器缓存

浏览器缓存 配置浏览器缓存可以加速静态资源的访问,浏览器对用户访问的资源进⾏存储,下次访问,不⽤再去向服务器寻求资料,直接本地显示,加速访问体验,节省⽹络资源,提⾼效率。Nginx通过 expires…

基于YOLOv8模型的头盔行人检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOv8模型的头盔行人检测系统可用于日常生活中检测与定位头盔与行人目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练…

安全测试之w3af 安装

背景: 学习安全测试时,离不开一些安全扫描工具,在类目众多的工具中,w3af是个绕不开的集成工具。由于没有linux环境,故在windows下利用wsl进行部署。亦可通过其它虚拟机安装亦可。 借鉴:Win10下安装w3af_Da…

kali linux多版本java共存并自由切换 update-alternatives

Kali Linux通过apt和dpkg安装的Java不是一样的。 它们安装的Java版本和管理方式可能不同。 1. **apt 安装 Java:** 当您使用apt包管理器在Kali Linux上安装Java时,您实际上是安装了由Kali Linux官方仓库提供的Java版本。 这个版本通常是经过Kali Linux团…

万字总结HTML超文本标记语言

一、前言:什么是网页? 网站是指在因特网上根据一定的规则,使用 HTML 等制作的用于展示特定内容相关的网页集合。网页是网站中的一“页”,通常是 HTML 格式的文件,它要通过浏览器来阅读。 网页是构成网站的基本元素,它通常由图片、链接、文字、声音、视频等元素组成。通常…

MySQL 中的索引

文章目录 一、索引的创建二、聚簇索引与非聚簇索引三、B 树索引 一、索引的创建 创建索引的方式包括两种: 隐式创建:数据库一般会在创建 PRIMARY KEY 和 UNIQUE 约束列时自动创建索引。显示创建:使用 CREAT INDEX 语句创建,建立…

Java流式编程的使用

流式编程的使用步骤 使用流式编程的步骤就是: 设置数据源, 设置数据处理的方式,设置收集结果的方式。 使用filter方法实现过滤条件 例子为下&#xff08;查询年龄大于18的用户&#xff09;: Testpublic void streamTest1() {List<Student> students Arrays.asList(ne…

【Java 基础篇】Java Function 接口详解

在 Java 编程中&#xff0c;Function 接口是一个非常重要的函数式接口&#xff0c;它允许你定义一个接受一个参数并产生结果的函数。Function 接口通常在各种数据处理和转换操作中使用&#xff0c;例如集合处理、流处理以及函数式编程。 本文将详细介绍 Function 接口的使用方…

基于蚁群算法的航线规划

一、背景 二、代码 main.m clear;clc; r21; %21*21 c21; intau20; xstart1; ystart3; %起点 xend20; yend18; %终点 gd1; xt[5,11,8,16,12,15,17,19]; %障碍物 yt[9,15,7,3,12,8,15,12];threat8; NCmax200; %迭代次数%初始化数据 Gamma_A0.9; Rho_A0.2; Alpha_A1; Beta_A3;…

SpringBoot集成easypoi实现execl导出

<!--easypoi依赖&#xff0c;excel导入导出--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.4.0</version></dependency>通过Exce注解设置标头名字和单…

RocketMQ源码解析(下 )

一、Producer发送消息过程 1、普通发送消息过程 一般发送消息都是new一个DefaultMQProducer&#xff0c;所以先找到DefaultMQProducer类 先进行DefaultMQProducerImpl的初始化&#xff0c;所有Producer的启动过程&#xff0c;最终都会调用到DefaultMQProducerImpl#start方法…

Llama2-Chinese项目:2.3-预训练使用QA还是Text数据集?

Llama2-Chinese项目给出pretrain的data为QA数据格式&#xff0c;可能会有疑问pretrain不应该是Text数据格式吗&#xff1f;而在Chinese-LLaMA-Alpaca-2和open-llama2预训练使用的LoRA技术&#xff0c;给出pretrain的data为Text数据格式。所以推测应该pretrain时QA和Text数据格式…

C++11 - 右值引用

临时空间 临时空间具有常性&#xff0c;什么时候会产生临时空间呢&#xff1f; 1、函数传值返回 把aa拷贝给临时空间&#xff0c;如果是很大的对象并且进行深拷贝&#xff0c;消耗会很大 证明&#xff1a; 这是list模拟实现迭代器的和&#xff01;重载时&#xff0c;while( it…

Secrets

文章目录 主要内容一.命令行创建1.命令行创建代码如下&#xff08;示例&#xff09;: 2.解释 二.环境变量secret1.使用刚才创建的密码&#xff0c;创建Pod并进行尝试。代码如下&#xff08;示例&#xff09;: 2.解释 总结 主要内容 命令行创建环境变量secret 预备知识 Secrets…

车载软件架构 —— AUTOSAR Vector SIP包(二)

车载软件架构 —— AUTOSAR Vector SIP包(二) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在…

【小程序】通过微信提供方法实现条码或二维码的扫描

概述 实现扫码获取信息&#xff0c;对接相应接口 可实现详情查询&#xff0c;已经是完整代码了copy都难么 详细 一、前期准备工作 软件环境&#xff1a;微信开发者工具 官方下载地址&#xff1a;微信开发者工具下载地址与更新日志 | 微信开放文档​编辑 二、程序实现具体步…