当前位置: 首页 > news >正文

OS 特性之PendSV 异常

上一篇文章我们了解了 SVC 异常,其可以作为一个 API ,使应用任务能够访问到系统资源,对于 OS 的设计来说非常重要。今天我们就来看一下另一个对 OS 设计及其重要的异常 —— PendSV 异常。

PendSV(可挂起的系统调用)的异常编号为 14,同样,其具有可编程的优先级。可以写入中断控制和状态寄存器(ICSR)设置挂起位以触发 PendSV 异常(详见:深入理解用于中断控制的 SCB 寄存器)。但其与 SVC 异常不同,它是不精确的。因此,它的挂起状态可在更高优先级的异常处理内设置,且会在更高优先级处理完成后执行。

利用该特性,若将 PendSV 设置为最低的异常优先级,就可以让其处理在所有其他中断处理任务完成后执行,这对于上下文切换非常有用,也是 OS 设计中的核心。

首先我们来看下上下文切换的几个基本概念。在具有嵌入式 OS 的典型系统中,处理时间被划分为了多个时间片。此时若系统中只有两个任务,那么这两个任务会交替执行,如下图所示:

图片

OS 内核的执行可由以下条件触发:

  • 应用任务中 SVC 指令的执行。例如,当应用任务由于等待一些数据或事件被耽搁时,它可以调用系统服务以便切换到下一个任务。

  • 周期性的 SysTick 异常。

在 OS 代码中,任务调度器可以决定是否执行上下文切换。上图所示的操作假定了 OS 内核的执行由 SysTick 异常触发,且每次触发它都会决定切换到一个不同的任务。

若中断请求(IRQ)在 SysTick 异常前产生,则 SysTick 异常可能会抢占 IRQ 处理。在这种情况下,OS 不应该执行上下文切换,否则,IRQ 的处理就会被延迟,如下图所示:

图片

对于 Cortex-M3 和 Cortex-M4 处理器,当存在活跃的异常服务时,设计默认不允许返回到线程模式(当然存在例外情况,即之前文章中提到的非基本线程使能的情况,以后会对这个概念进行详细的解释)。若存在活跃的中断服务,且 OS 试图返回到线程模式,就会触发使用错误异常。

在一些 OS 设计中,要解决上述问题,可以设计为在运行中断服务时不执行上下文切换,这可以通过检查栈帧中的 xPSR 或 NVIC 中的中断活跃寄存器来实现。但这样的话系统的性能可能会受到影响,特别是中断源在 SysTick 中断前后持续产生请求时,这样上下文切换就可能没有执行的机会。

PendSV 异常则通过将上下文切换请求延迟到所有其他 IRQ 都处理完成后执行来解决上面的这个问题。当然要实现这种效果,需要将 PendSV 的优先级设置到最低。若 OS 需要执行上下文切换,它会设置 PendSV 的挂起状态,并且 PendSV 异常处理中执行上下文切换。下图为利用 PendSV 进行上下文切换的一个实例:

图片

上述实例具有以下的事件流程:

  1. A 任务调用 SVC 进行任务切换(例如要等待一些工作完成)。

  2. OS 收到请求,准备进行上下文切换,此时挂起 PendSV 异常。

  3. 当 CPU 退出 SVC 时,会立即进入 PendSV 并进行上下文切换。

  4. 当 PendSV 完成并返回线程等级时,系统会运行 B 任务。

  5. 中断产生并进入中断处理。

  6. 在运行中断处理函数时产生 SysTick 异常(用于 OS 节拍)。

  7. OS 执行一些重要的操作,然后挂起 PendSV 异常并准备进行上下文切换。

  8. 当 SysTick 异常退出时,会返回到先前执行到一半的中断服务程序中。

  9. 当中断服务程序结束后,PendSV 开始执行实际的上下文切换。

  10. 当 PendSV 完成后,程序返回到线程等级,这时它会回到任务 A 并继续执行。

除了 OS 环境中的上下文切换,PendSV 还可以用于不存在 OS 的环境中。例如,中断服务程序可能需要一些处理时间,要处理的部分可能会需要最高优先级。不过如果整个 ISR 都是在高优先级中执行的,其他中断服务函数就可能在很长时间内都无法执行。在这种情况下,可以将中断服务处理划分为两个部分,如下图所示:

图片

  • 第一部分对时间的要求比较高,需要快速执行,且优先级较高。它位于普通的 ISR 内,在 ISR 结束时,设置 PendSV 的挂起状态。

  • 第二部分包括中断服务所需的剩余处理逻辑,它位于 PendSV 处理内且具有较低的异常优先级。

http://www.dtcms.com/a/593166.html

相关文章:

  • 跆拳道东莞网站建设触屏版网站开发
  • 在电脑端企业微信打开内置浏览器并调试
  • Seata原理与简单示例
  • LeetCode 420 - 强密码检验器
  • 优化学校网站建设方案下载官方网站app
  • Visual Basic 创建状态栏
  • 网站建设的人才怎么称呼wordpress多语言模板
  • LeetCode 分类刷题:876. 链表的中间结点
  • LeetCode 分类刷题:143. 重排链表
  • 分布式专题——51 ES 深度分页问题及其解决方案详解
  • 2025.11.10 力扣每日一题
  • 麻城网站开发同一网站相同form id
  • dede网站制作wordpress长微博工具
  • 专业定制铸铁T型槽地轨,提供稳定的制造、实验基准线
  • PyCharm如何像其他idea软件跨行选择文本
  • 【场景题】线上接口响应慢,应该如何排查问题?
  • Product Hunt 每日热榜 | 2025-11-10
  • 【智能体(Agent)技术深度解析】从架构到实现细节,核心是实现“感知环境→处理信息→决策行动→影响环境”的闭环
  • 网站的登陆注册页面怎么做做水果网站弄个什么名字
  • Advisor与@Aspect
  • Java基础——集合进阶6
  • 网站建设湛江分类信息网站如何做排名
  • 二十七、通信接口
  • 个人网站备案条件个人怎么做网页
  • SQL 相关子查询:性能杀手及其优化方法
  • 一文掌握UI自动化测试
  • 金融保险银行营销AI数字化转型培训讲师培训老师唐兴通讲金融银保团队险年金险市场销售
  • 质效飞跃,优测金融数智质效解决方案全新升级!
  • 智网案例精选|光联云网融合智驱,重塑金融数字化转型新格局
  • 自适应网站建设极速建站WordPress更新emoji