Cortex-M3/M4之SVC和PendSV异常

一、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.rhkb.cn/news/140610.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“源启2.0”:从自上而下的解构,到自下而上的重构

从垂直打穿、到应用重构,中电金信赋能行业数字化转型之路既“向下走”、也“向上看”。“向上”先理解和吃透客户的企业战略,进而自上而下地将企业战略拆解为业务架构,“向下”再将业务架构拆解为应用架构和数据架构,并进一步对齐…

【Acwing1027】方格取数(动态规划)题解

题目描述 思路分析 错误思路: 贪心法,先走一次求出最大值,把走过的路上面的数值清零,然后用同样的方法再走一遍求最大值,然后让这两个最大值相加就是最后的结果。 很多人在看到这个题目的时候会有上面的思路&#x…

Jmeter接口测试

前言: 本文主要针对http接口进行测试,使用Jmeter工具实现。 Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对Http接口的测试。 1.介绍什么是…

停车场系统源码

源码下载地址(小程序开源地址):停车场系统小程序,新能源电动车充电系统,智慧社区物业人脸门禁小程序: 【涵盖内容】:城市智慧停车系统,汽车新能源充电,两轮电动车充电,物…

Linux下ThinkPHP5实现定时器任务 - 结合crontab

实例一&#xff1a; 1.在/application/command创建要配置的PHP类文件&#xff0c;需要继承Command类&#xff0c;并重写configure和execute两个方法&#xff0c;例如: <?php namespace app\command; use think\console\Command; use think\console\Input; use think\cons…

“降本”是关键,FCU1104打造低成本工商业储能EMS

在不久前举行的EESA中国国际储能展上&#xff0c;“工商业储能”成为了热度最高的话题之一&#xff0c;几乎每家展出工商业储能系统的展商都收获了大量观众的驻足围观&#xff0c;热度非凡。究竟是怎样的原因让工商业储能如此瞩目呢&#xff1f; 通过与多家储能厂家沟通并查阅…

【音视频】ffplay源码解析-PacketQueue队列

包队列架构位置 对应结构体源码 MyAVPacketList typedef struct MyAVPacketList {AVPacket pkt; //解封装后的数据struct MyAVPacketList *next; //下一个节点int serial; //播放序列 } MyAVPacketList;PacketQueue typedef struct PacketQueue {MyAVPacketList …

论文精读(2)—基于稀疏奖励强化学习的机械臂运动规划算法设计与实现(内含实现机器人控制的方法)

目录 1.作者提出的问题及解决方向 2.延深-用如何用强化学习对机器人进行控制 2.1思路 2.2DQN和DDPG在机器人控制中的应用 3.解决方案 3.1思路 3.2实验 3.3创新点 4.展望 1.作者提出的问题及解决方向 目的&#xff1a;使机械臂在非结构化环境下实现端到端的自主学习控制…

MySQL学习笔记6

MySQL数据库如何存放数据&#xff1f; 注明&#xff1a;我们平常说的MySQL&#xff0c;其实主要指的是MySQL数据库管理软件。 一个MySQL DBMS可以 同时存放多个数据库&#xff0c;理论上一个项目就对应一个数据库。 如博客项目blog数据库&#xff0c;商城项目shop数据库&#…

(Vue2)智慧商城项目

新增两个目录api、utils api接口模块&#xff1a;发送ajax请求的接口模块 utils工具模块&#xff1a;自己封装的一些工具方法模块 第三方组件库vant-ui PC端&#xff1a;element-ui&#xff08;element-plus&#xff09; ant-design-vue 移动端&#xff1a;vant-ui Mint UI…

【计算机网络 - 自顶向下方法】计算机网络和因特网

目录 1. What is the Internet? 1.1 因特网的具体构成 1.2 因特网的功能 2. Network core 2.1 基本介绍 2.2 分组交换 2.2.1 序列化时延 2.2.2 排队延迟和丢包 2.2.3 分组交换的优缺点 2.3 电路交换 2.3.1 基本概念 2.3.2 电路交换网络中的复用 2.3.3 电路交换文件…

中秋国庆内卷之我爱学习C++

文章目录 前言Ⅰ. 内联函数0x00 内联函数和宏的比较0x01 内联函数的概念0x02 内联函数的特性 Ⅱ. auto&#xff08;C 11)0x00 auto的概念0x01 auto的用途 Ⅲ. 范围for循环(C11)0x00 基本用法0x01 范围for循环(C11)的使用条件 Ⅳ. 指针空值nullptr(C11)0x00 概念 前言 亲爱的夏…

Lnmp架构之mysql数据库实战2

4、mysql组复制集群 一主多从的请求通常是读的请求高于写 &#xff0c;但是如果写的请求很高&#xff0c;要求每个节点都可以进行读写&#xff0c;这时分布式必须通过&#xff08;多组模式&#xff09;集群的方式进行横向扩容。 组复制对节点的数据一致性要求非常高&#xff…

人工智能驱动的自然语言处理:解锁文本数据的价值

文章目录 什么是自然语言处理&#xff1f;NLP的应用领域1. 情感分析2. 机器翻译3. 智能助手4. 医疗保健5. 舆情分析 使用Python进行NLP避免NLP中的陷阱结论 &#x1f389;欢迎来到AIGC人工智能专栏~人工智能驱动的自然语言处理&#xff1a;解锁文本数据的价值 ☆* o(≧▽≦)o *…

1791_树莓派bash入门杂志_Essentials_Bash_v1

全部学习汇总&#xff1a; GreyZhang/little_bits_of_raspberry_pi: my hacking trip about raspberry pi. (github.com) 拿到一份树莓派早期的宣传电子杂志资料&#xff0c;看了一下感觉还是有一些帮助。针对里面多少有一些共鸣的地方&#xff0c;做一个简单的整理。 1. 命令行…

【kohya】训练自己的LoRA模型

文章目录 序言准备环境准备图片处理图片下载kohya_ss代码修改pyvenv.cfg启动界面访问地址生成字幕准备训练的文件夹配置训练参数开始训练遇到的问题&#xff1a; 序言 在把玩stable diffusion的webUI和comfyUI后&#xff0c;思考着自己也微调一个个性化风格的checkpoint、LyCO…

FPGA的DQPSK调制解调Verilog

名称&#xff1a;DQPSK调制解调 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; 使用Verilog语言进行DQPSK调制和解调&#xff0c;并进行仿真 代码下载&#xff1a;DQPSK调制解调verilog&#xff0c;quartus_Verilog/VHDL资源下载 代码网&#xff1a;h…

机试算法学习

又到了一年一度的校招干饭环节&#xff0c;本人不得已以应届生的身份卷入了这场洪流&#xff0c;让我们各自加油吧&#xff01; 蛇形矩阵 xx机考编程题 题目描述 输入两个整数 n和 m&#xff0c;输出一个 n 行 m 列的矩阵&#xff0c;将数字 1到 nm按照回字蛇形填充至矩阵中…

【数据开发】数据全栈知识架构,数据(平台、开发、管理、分析)

文章目录 一、数据全栈知识架构1、数据方法&#xff08;思维&#xff0c;统计学&#xff0c;实践&#xff0c;北极星&#xff09;2、数据工具&#xff1a;数据仓库3、数据规范 二、数据分析工具1、大数据平台2、数据开发&#xff1a;入库计算&#xff08;重点&#xff09;3、数…

AI AIgents时代 - (三.) AutoGPT和AgentGPT

前两篇讲解了Agent的原理和组件&#xff0c;这节我将给大家介绍两个agent项目&#xff0c;给出它们的工作原理和区别&#xff0c;并教大家亲手尝试使用 Agents&#x1f389; &#x1f7e2; AutoGPT&#x1f916;️ 我们的老朋友&#xff0c;之前文章也专门写过。AutoGPT 是一…