深入理解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指令进行系统调用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GPT国内怎么用?4月最新版本来了

ChatGPT镜像 今天在知乎看到一个问题:“平民不参与内测的话没有账号还有机会使用ChatGPT吗?” 从去年GPT大火到现在,关于GPT的消息铺天盖地,真要有心想要去用,途径很多,别的不说,国内GPT的镜像…

Datax,hbase与mysql数据相互同步

参考文章:datax mysql 和hbase的 相互导入 目录 0、软件版本说明 1、hbase数据同步至mysql 1.1、hbase数据 1.2、mysql数据 1.3、json脚本(hbase2mysql.json) 1.4、同步成功日志 2、mysql数据同步至hbase 1.1、hbase数据 1.2、mysql…

Linux 快问快答

如果对于找 Java 后端开发的话,我感觉会这几个差不多了,面试官应该不会问的这么详细吧。一般就问问 Linux 的几个常用的命令,然后做一些简单的性能排查就好了。如果面试被问到另外的问题,那我再补充进来,现在先掌握这么…

ZISUOJ 数据结构-线性表

题目列表: 问题 A: 逆序链表建立 思路: 可以使用头插法插入所有元素后正序遍历输出或者使用尾插法逆序遍历,推荐使用双链表。这是链表系列的第一个题,那这个题下面的参考题解的各种解法我会尽可能写全一些。 参考题解1&#xff0…

《前端面试题》- JS基础 - 防抖和节流

在界面触发点击,滚动,输入校验等事件时,如果对事件的触发频率不加以限制,会给浏览器增加负担,且对用户不友好。防抖和节流就是针对类似情况的解决方案。 防抖 防抖(debounce):当连续触发事件时&#xff0…

攻防世界:level2[WriteUP]

用checksec、file命令查看文件属性与防护 32位小端序二进制文件 把文件丢进IDA进行逆向分析 在main函数中可以看到一个vulnerable_function函数:易受攻击的函数 双击该函数名称查看里面的内容 按F5显示vulnerable_function的伪代码 可以看到v1数组长度136但最后…

什么是JAVA面向对象

一,什么是面向对象: 我们以前的项目都是面向过程的,一个完整的项目所有的代码都写在一个类里 这就叫面向过程。 面向对象,是指在写大型项目时,多人分工合作,为了代码看上去简洁美观,会将不同的…

量子信息产业生态研究(一):关于《量子技术公司营销指南(2023)》的讨论

写在前面。量子行业媒体量子内参(Quantum Insider)编制的《量子技术公司营销指南》是一本实用的英文手册,它旨在帮助量子科技公司建立有效的营销策略,同时了解如何将自己定位成各自的行业专家。本文对这篇指南的主要内容进行了翻译…

ubuntu安装vulnhub

文章目录 1.下载docker2.申请加速器3.安装pip4.安装docker-compose5.安装git6.安装vulnhub文件7.运行vulhub中的靶机TypeError: kwargs_from_env() got an unexpected keyword argument ssl_version报错8.tomcat-----CVE-2017-12615(任意文件上传)1.访问192.168.9.101:80802.bp…

C++实现AVL树

文章目录 一、平衡树的优势二、二叉平衡搜索树的节点定义三、二叉搜索树的插入3.1 寻找插入位置3.2 开始判定平衡因子,平衡因子有变就开始旋转3.2.1 左旋的情况3.2.2 左旋代码(一定要考虑平衡因子为2或者-2的节点是否有父节点)3.2.2 右旋的情…

mmdetection模型使用mmdeploy部署在windows上的c++部署流程【详细全面版】

0. 前置说明: 该文档适用于:已经使用mmdetection训练好了模型,并且完成了模型转换。要进行模型部署了。 1. 概述 MMDeploy 定义的模型部署流程,如下图所示: 模型转换【待撰写,敬请期待…】 主要功能是:把输入的模型格式,转换为目标设备的推理引擎所要求的模型格式…

2440LED点灯、K1~K6按键、24401中断、2440时钟

我要成为嵌入式高手之4月12日ARM第七天!! ———————————————————————————— 2440GPIO GPIO:通用目的输入输出 LED 要把GPBCON初始化 地址是固定的,可以当做无符号int型 控制所有灯就需要初始化GPBCO…

还原matlab编辑器窗口和主窗口分开的问题

问题 matlab不知道早点的,点击运行后会弹出新的窗口,咋整都恢复不了 解决方案 首先,在编辑器窗口下,按ctrlshiftD,此时编辑器窗口和主窗口就合并了,问题解决。

Andriod设置背景颜色简单教学

首先,打开Android studio的程序应用,找到File,然后点击Settings. 第二步,弹出窗口,点击Appearance,进入Background image... 第三步,选择本地文件夹的图片 选择一张自己合适的图片设为该界面的背景图,完成…

PyQt5结合Yolo框架打包python为exe文件完整流程

一、准备 1.安装 pyinstaller pip install pyinstaller 更新(初次安装忽略) pip install --upgrade pyinstaller 2.安装 auto-py-to-exe 安装 pip install auto-py-to-exe 打开工具 auto-py-to-exe.exe auto-py-to-exe 可视化转换工具&#xff1…

LeetCode 2924.找到冠军 II:脑筋急转弯——只关心入度

【LetMeFly】2924.找到冠军 II:脑筋急转弯——只关心入度 力扣题目链接:https://leetcode.cn/problems/find-champion-ii/ 一场比赛中共有 n 支队伍,按从 0 到 n - 1 编号。每支队伍也是 有向无环图(DAG) 上的一个节…

QT助手翻译【QT 5.14】 -----QPushButton

目录 1 属性 2 公共职能 3 重新实现的公共功能 4 公用插槽 5 受保护的功能 6 保护方法 7 详细说明 1 属性 自动默认值:bool 此属性保存按钮是否为自动默认按钮 如果此属性设置为true,则该按钮为自动默认按钮。 在某些GUI样式中&a…

std::stringstream

std::stringstream 是 C 标准库中的一个类,用于对字符串进行输入输出操作,类似于文件流(std::ifstream 和 std::ofstream)。它允许你像使用 std::cin 和 std::cout 一样使用字符串。 std::stringstream 可以将字符串作为输入源&am…

基于8B/10BGT收发器的PHY层设计(1)

一、PHY层简介 PHY层(Physical Layer)是OSI模型中最低的一层,也是最基本的一层,PHY是物理接口收发器,它实现物理层。包括MII/GMII(介质独立接口)子层、PCS(物理编码子层&#xff09…

N皇后问题(DFS解决)

文章目录 一、题目分析二、对角线判断&#xff08;分两种&#xff09;三、代码演示 先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;^ _ ^<3 ❤️ ❤️ ❤️ 码字不易&#xff0c;大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦&#xff01; 一…