深入理解Cortex-M7 SVC和PendSV

1前言

1.1 PendSV

        在ARM V7上,PendSV用来作为RTOS调度器的御用通道,上下文切换,任务调度都是在其ISR中实现的。所谓pend,字面意思即有悬起等待的意思,ARM官方也明确说明,PendSV应该在其他异常处理完毕后执行。

        具体来说,ICSR(Interrupt Control and State Register)专为为PendSV设置了相关控制位段:

        ① 悬起设置位(PENDSVSET,PendSV set-pending bit),该位写0无效,置1则将PendSV设置为pending状态(这也是悬起PendSV的唯一方式);

        ② 悬起清除位(PENDSVCLR,PendSV clear-pending bit,该位写0无效,置1则解除PendSV的悬起状态;

        注意,如果同时向这两个控制位写1,将导致无法预测的行为。在Cortex-M7中,ICSR的物理地址为0xE000ED04,复位后默认值为0x00000000,在特权级下支持读写。

1.2 SVC

        复位后,处理器默认进入线程模式(Thread mode),特权极访问。 在特权级下的程序可以为所欲为,程序可以访问所有范围的存储器(如果有 MPU,还要在 MPU 规定的禁地之外),并且可以执行所有指令。
      一旦进入用户级,再想回来就得走“法律程序”了——用户级的程序不能简简单单地试图改写 CONTROL 寄存器就回到特权级(control寄存器只能在特权级模式下修改),它必须先“申诉”:执行一条系统调用指令(SVC)。这会触发 SVC 异常,然后由异常服务例程(通常是操作系统的一部分,Handler mode)接管,如果批准了进入,则异常服务例程修改 CONTROL 寄存器,才能在用户级线程模式下重新进入特权级
        事实上,从用户级到特权级的唯一途径就是异常:如果在程序执行过程中触发了一个异常,处理器总是先切换入特权级, 并且在异常服务例程执行完毕退出时,返回先前的状态。

 图1 SVC调用示意图

        注意,SVC属于同步异常,没有专门的pending状态位,这就意味着一旦无法被关中断屏蔽掉,系统后续忙完再开中断时,可能就忘记了之前的SVC请求。因此,如果系统的异常可执行优先级(execution priority)小于HardFault(优先级固定为-1)时,如果发生了SVC或fault类型的同步异常,而当前系统的异常可执行优先级较高(或与同步异常相同),无法进行抢占,则会直接触发HardFault异常。

        也就是说,SVC 异常是必须在执行 SVC 指令后立即得到响应的(对于 SVC 异常来说,若因优先级不比异常可执行优先级高,例如PRIMASK被置1,异常可执行优先级位0,则将上访成硬 fault),应用程序执行 SVC 时都是希望所需的请求立即得到响应。这也就意味着,如果在关中断的情况下(同时屏蔽掉了SVC所在优先级),应用程序如果在此情况下调用SVC指令,将会直接酿成一个HardFault异常。        

2 Cortex-M7中断的抢断行为

图2 中断抢占行为分析

3  SVCall和PendSV组合使用实现上下文切换

           通常来说,在进行上下文切换(Context switching)时,RTOS都是通过关中断来进行临界区保护的。关中断会降低中断响应的实时性,严重时甚至会丢失中断请求。

        Armv7-M提供了一种机制,可以在不必关中断的情况下,进行上下文切换:

        ① 将SVCall和PendSV都配置成最低优先级

        ② 在线程中使用SVC进行系统调用,包括上下文切换(比如线程主动让出CPU),也通过SVC进行请求;

        ③ 通过PendSV来执行上下文切换需要临界区保护的代码,包括SVC在内的所有异常都不要染指该临界区,它们最多只能悬起PendSV,并最终通过PendSV来执行上下文切换;

        如此一来,SVC和PendSV优先级相同,无法互相抢占,而这两个异常又是始终处于使能状态的;由于只在线程中调用SVC悬起PendSV,所以SVC的同步性可以得以保证,而具体的上下文切换的代码在PendSV的ISR来执行。上下文切换完成后,程序从PendSV返回线程继续执行。

 4 总结

        将PendSV优先级设为最低,还有一点考虑,如果其优先级比较高,有可能出现以下情况:

        PendSV会抢断其他中断的执行,随后进行上下文切换,而其他中断以尾链机制继续执行,并请求进行上下文切换,这就导致多次重复的上下文切换,而在此过程中,无辜的任务只能眼巴巴的等着,啥都做不了,而内核在忙着来回切换上下文,浪费了很多CPU时间。

        此外,SVC指令要求SVC异常的优先级高于异常可执行优先级,否则将触发错误异常。因此,在NMl或HardFault等优先级高于SVC的异常处理程序中,不能使用SVC。这也意味着,应尽量只在线程中使用SVC指令进行系统调用。

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

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

相关文章

python的算术运算符

python常用算术运算符代码如下: #算术运算符操作 x 10 y 20 z 30 #加法运算 a x y print("a的值为:", a) #减法运算 a x - y print("a的值为:", a) #乘法运算 a x*y print("a的值为:", a) …

计算机网络——ARP协议

前言 本博客是博主用于复习计算机网络的博客,如果疏忽出现错误,还望各位指正。 这篇博客是在B站掌芝士zzs这个UP主的视频的总结,讲的非常好。 可以先去看一篇视频,再来参考这篇笔记(或者说直接偷走)。 …

OpenCV4.9​​​​基本阈值操作

目标 在本教程中,您将学习如何: 使用 OpenCV 函数 cv::threshold 执行基本阈值操作 理论依据 注意 下面的解释属于 Bradski 和 Kaehler 的 Learning OpenCV 一书 阈值? 最简单的分割方法应用示例:分…

步骤大全:网站建设3个基本流程详解

一.领取一个免费域名和SSL证书,和CDN 1.打开网站链接:https://www.rainyun.com/z22_ 2.在网站主页上,您会看到一个"登陆/注册"的选项。 3.点击"登陆/注册",然后选择"微信登录"选项。 4.使用您的…

Claude3和GPT4哪个强?

在短短两个月内,全球最强人工智能的桂冠再次易主。此前,Claude3 Opus以其卓越的表现超越了GPT-4,吸引了无数用户抛弃GPT,转而拥抱Claude3。然而,OpenAI近日强势回归,用实力证明了GPT依然是人工智能领域的霸…

Jmeter杂记:测试计划参数详解

测试计划各参数详解 1,用户自定义变量,是全局变量,供所有线程组使用,可用配置元件:用户自定义变量替代 2,连续的运行线程组,默认不勾选,则随机的运行多个线程组中的取样器&#xff…

图机器学习NetworkX代码实战-创建图和可视化

完整代码见资源,下面列举了其中的几个图 安装networkX及相应工具包 pip install numpy pandas matplotlib tqdm networkx 当安装完成后,输入如下代码验证版本及是否安装成功 import networkx as nxnx.__version__ import matplotlib.pyplot as plt …

国内ai人工智能软件大全

很多人一直在寻找一个稳定且可靠的全球AI大模型测试平台,希望它不仅真实可信,而且能提供稳定、快速的服务,不会频繁出现故障或响应缓慢。迄今为止,我已经尝试了国内外至少10个不同的服务站点。不幸的是,这些站点总是存…

Linux 文件页反向映射

0. 引言 操作系统中与匿名页相对的是文件页,文件页的反向映射对比匿名页的反向映射更为简单。如果还不清楚匿名页反向映射逻辑的,请移步 匿名页反向映射 1. 文件页反向映射数据结构 struct file: 用户进程每open()一次文件,则会生…

分享一个 git stash 的实际使用场景。

当我将新的变更记录提交为 git commit --amend 后,发现这需要修改云端上的提交记录,也就是 vscode 中会出现这张图 于是,我通过 git reset head^ 撤销掉刚刚的提交。 reset 前: reset 后: 但在撤销的同时&#xf…

深入理解计算机网络分层结构

一、 为什么要分层? 计算机网络分层的主要目的是将复杂的网络通信过程分解为多个相互独立的层次,每个层次负责特定的功能。这样做有以下几个好处: 模块化设计:每个层次都有清晰定义的功能和接口,使得网络系统更易于设…

解决Xshell登录云服务器的免密码和云服务器生成子用户问题

Xshell登录云服务器的免密码问题 前言一、Xshell登录云服务器的免密码操作实践 二、centos创建用户创建用户实操删除用户更改用户密码直接删除子用户 前言 Xshell登录云服务器免密码问题的解决方案通常涉及使用SSH密钥对。用户生成一对密钥(公钥和私钥)…

Spring源码刨析之配置文件的解析和bean的创建以及生命周期

public void test1(){XmlBeanFactory xmlBeanFactory new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));user u xmlBeanFactory.getBean("user",org.xhpcd.user.class);// System.out.println(u.getStu());}先介绍一个类XmlBeanFac…

Linux —— FTP服务【从0-1】

目录 一、介绍 1.概述 2.FTP的传输模式 PORT 主动模式 PASV 被动模式 3.FTP服务的作用 二、搭建FTP服务器 FTP服务端配置 1.安装vsftpd文件服务 2.启动服务 3.防火墙配置 4.FTP服务相关文件说明 FTP客户端配置 1.安装FTP客户端工具 lftp 2.访问FTP服务器 Linux系…

深度学习图像处理基础工具——opencv 实战2 文档扫描OCR

输入一个文档,怎么进行文档扫描,输出扫描后的图片呢? 今天学习了 opencv实战项目 文档扫描OCR 问题重构:输入图像 是一个含有文档的图像——> 目标是将其转化为 规则的扫描图片 那么怎么实现呢? 问题分解&#…

Python 复杂密码图形化生成工具,支持选择生成10位和12位复杂密码(初版)

代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2024/3/26 15:22 # Author : wyq # File : 部署测试.py import random import string from tkinter import *def generate_password(length):characters string.ascii_letters string.digits string.p…

【vue】Vue3开发中常用的VSCode插件

Vue - Official:vue的语法特性,如代码高亮,自动补全等 Vue VSCode Snippets:自定义一些代码片段 v3单文件组件vdata数据vmethod方法 别名路径跳转 参考 https://www.bilibili.com/video/BV1nV411Q7RX

学校4-11天梯赛选拔赛

目录 L1-5 6翻了 题目 输入格式: 输出格式: 输入样例: 输出样例: 思路 AC代码 L1-1 嫑废话上代码 题目 输入格式: 输出格式: 输入样例: 输出样例: AC代码 L1-8 刮刮彩…

深入了解边缘AI的发展

人工智能先进功能的融合、物联网设备的广泛采用以及边缘计算的强大性能释放了边缘AI的潜力。这种变革性的协同作用涵盖了辅助医疗诊断、自动驾驶和仓库物流自动化等应用。 边缘计算起源于1990年代的内容分发网络,现在被广泛使用,尤其是在边缘AI领域。企…

Vue入门:天不生Vue,前端万古如长夜 - Vue从入门到放弃

👋 Vue环境搭建 首先,搭一个打代码的环境 1.安装node.js 在使用VS Code之前,需要安装Vue的开发环境。 安装Vue的最简单方法是使用npm包管理器,先安装Node.js和npm。 node官网 ​​ 2.配置环境变量 在nodejs安装目录下新建…