0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RTOS为什么用PendSV进行线程调度?

CHANBAEK 来源:硬件工程师干货 作者:硬件工程师干货 2023-03-01 10:47 次阅读

有些操作系统在“心跳”中断(SysTick中断)里进行线程切换,如果处理器正在执行一个ISR,此时SysTick异常到来,且SysTick优先级高,抢占了正在运行的用户ISR,SysTick ISR是不能进行线程切换的,因为SysTick ISR运行完后要返回上一层用户ISR,此时仍然处于异常模式,不能进入线程模式,强行进入线程模式会导致Fault异常。如下图,延时到了第二个SysTick ISR才线程切换,实时性降低。在这种情况下,SysTick ISR中切换任务,这会导致任务切换延后。

pYYBAGP-vBmABjqgAACZDOEhLTs867.png

极端的情况下,SysTick中断和用户中断步调一致,会导致任务切换严重滞后。如下图所示:

pYYBAGP-vC-ARgIWAACHJ2Iqn98501.png

有朋友说了,既然SysTick中断抢占了用户中断不能调度线程,那么在用户ISR即将退出时进行调度就好了呀,确实比上面的情况要好一些,但这就需要在所有中断的末尾都要检查是否需要切换,增加用户中断程序复杂度。

也有朋友说了,把SysTick中断优先级调到最低是不是也可以呢,当然可以,调低了优先级,避免了嵌套,就算用户中断期间产生SysTick中断,但是SysTick中断不能运行,用户中断结束后,SysTick中断“咬尾”,这样是没问题的,可是有一点SysTick的优先级就无法提高了。

鉴于上述原因,我们想到了PendSV异常,这个异常比较特殊,可以理解为一个软中断(软异常),代码中操作寄存器就可以触发此中断,我们把它的优先级调整到最低,当SysTick ISR抢占了用户中断后,发现需要任务调度,就设置寄存器触发PendSV异常,因为它优先级最低,不能响应,等到用户中断执行完立即自动响应,进行任务切换,如下图所示。

poYBAGP-vECAXPiBAAC198jzyNM802.png

一般情况下:

1、PendSV中断优先级设置为最低,用于线程调度。

2、SysTick中断优先级根据自己需求设置,如果想让心跳更准确就调高一些,如果想让用户中断相应更迅速就调低一些。

3、可以和PendSV一样都设置为最低。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 操作系统
    +关注

    关注

    37

    文章

    6352

    浏览量

    122065
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41054
  • RTOS
    +关注

    关注

    20

    文章

    780

    浏览量

    118879
  • 线程
    +关注

    关注

    0

    文章

    494

    浏览量

    19525
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    12963
收藏 人收藏

    评论

    相关推荐

    RTOS中的线程、进程和协程详解

    看到有小伙伴在讨论【RTOS任务属于线程还是进程】的话题,这里就来分析一下OS中的线程、进程和协程的这几个概念,同时一起看看RTOS中的任务到底属于哪一种。
    的头像 发表于 11-09 12:36 1067次阅读
    <b class='flag-5'>RTOS</b>中的<b class='flag-5'>线程</b>、进程和协程详解

    转第16章 FreeRTOS调度锁,任务锁和中断锁

    的作用区分开,调度锁只是禁止了任务调度,并没有关闭任何中断,中断还是正常执行的。而临界段进行了开关中断操作。16.2 中断锁中断锁就是RTOS提供的开关中断函数,FreeRTOS没有专
    发表于 09-01 07:45

    rtthread线程调度

    rtthread线程调度,RT-Thread多线程学习总结多线程是实时操作系统里面最重要的知识点之一,要学习RTOS,多
    发表于 07-20 07:21

    如何合理的进行线程切换与调度

    线程并发情况下,如何合理的进行线程切换与调度,充分发挥芯片性能,解决线程间冲突,是迫切需要解决的问题。MDK5.25版本以后提供了新的Sy
    发表于 08-24 07:33

    RT-Thread的线程简介

    。RT-Thread的线程简介线程(thread)是系统能够进行调度的最小单位,在linux中也是这样定义的,但是和我们RTOS中的thre
    发表于 08-24 07:56

    RTOS进行讲解

    自动化类专业小伙伴最早接触一般都是在接触RTOS后了,然而对于计算机相关专业的小伙伴应该在学《计算机操作系统》老师对这一块讲解的非常清楚了,包括一些性能指标的定义与计算等等,不过作者这里仅仅只针对RTOS进行讲解,大家感兴趣可以
    发表于 11-10 07:24

    RT-Thread代码启动与线程切换过程的实现

    线程的上下文切换可以下图表示:2.2.3 系统调度系统调度就是在就绪列表中寻找优先级最高的就绪线程,然后去执行该
    发表于 04-25 11:38

    RT-Thread系统线程调度器的设计实现

    。RT-Thread内核中也允许创建相同优先级的线程。相同优先级的线程采用时间片轮转方式进行调度(也就是通常说的分时调度器),时间片轮转
    发表于 08-23 15:24

    LEDs状态灯任务(线程)设计 (基于RTOS

    LEDs状态灯任务(线程)设计(基于RTOS
    的头像 发表于 03-12 11:30 2086次阅读

    RTOS线程必须要MMU才行?

    的作用。 但是,并不是所有操作系统都需要MMU才行,我们嵌入式中很多常用的RTOS(实时操作系统)没有MMU一样可以实现多线程。 只是RTOS实现的多线程相对大型操作系统要简单一点,其
    的头像 发表于 10-11 18:56 1928次阅读

    RTOS中的任务是线程?进程?还是协程?

    今天为大家讲解讲解OS中的线程、进程和协程的这几个概念,同时一起看看RTOS中的任务到底属于哪一种。
    的头像 发表于 06-04 17:19 1261次阅读
    <b class='flag-5'>RTOS</b>中的任务是<b class='flag-5'>线程</b>?进程?还是协程?

    什么是虚拟线程?虚拟线程到底是做什么用的呢?

    虚拟线程是在Java并发领域添加的一个新概念,那么虚拟线程到底是做什么用的呢?
    的头像 发表于 10-29 10:23 1649次阅读
    什么是虚拟<b class='flag-5'>线程</b>?虚拟<b class='flag-5'>线程</b>到底是做<b class='flag-5'>什么用</b>的呢?

    SCP线程模型特点

    线程 混合协作调度模型-调度在具有相同优先级的线程之间是协作的。 •无需锁 •使代码更简单,避免了死锁的情况。 •它消除了对执行上下文/RTOS
    的头像 发表于 11-02 17:07 303次阅读
    SCP<b class='flag-5'>线程</b>模型特点

    新手必看的RTOS基础知识

    时间片调度保证每个线程都有一个要执行的槽。这种类型的调度通常不利于实时应用。如果需要,TI-RTOS内核支持使用任务进行时间切片
    的头像 发表于 11-20 16:06 1614次阅读
    新手必看的<b class='flag-5'>RTOS</b>基础知识

    基于RTOS的应用进程中的典型线程

    RTOS中的关键因素是最小的中断延迟和最小的线程切换延迟。RTOS的价值在于它的响应速度或可预测性,而不是它在给定时间段内可以执行的工作量。
    发表于 03-05 09:32 178次阅读
    基于<b class='flag-5'>RTOS</b>的应用进程中的典型<b class='flag-5'>线程</b>