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

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

3天内不再提示

具有固定优先级调度程序RTOS的优先级倒置

星星科技指导员 来源:嵌入式计算设计 作者:Johan Kraft 2022-06-22 15:45 次阅读

具有固定优先级调度程序的 RTOS 的核心思想是高优先级任务应该在低优先级任务之前调度。如有必要,RTOS 甚至可以抢占正在运行的任务,迫使它让 CPU 执行更高优先级的任务。然而,作为开发人员,您必须注意可能导致较高优先级任务必须等待较低优先级任务的编程缺陷——这种情况称为优先级倒置。

优先级反转可以与互斥体、消息队列或其他类型的同步对象一起发生。描述问题的最佳方式可能是通过一个示例来逐步说明。

在下面的时间线图中,使用 Tracealyzer 捕获,我们有一个低优先级任务(绿色)正在执行。它需要一个二进制信号量来保护某些临界区并继续在临界区内执行代码。当高优先级任务(红色)进入就绪状态时,RTOS 抢占绿色任务并让红色运行。红色任务尝试获取相同的二进制信号量,但由于低优先级绿色任务持有它而被阻止。

到目前为止,一切都很好——这是预期的行为。一般来说,绿色任务现在会运行并快速释放信号量,此时它再次被抢占,红色任务可以获取信号量并继续。然而,这一次发生了反转。出于某种原因,可能是定时等待已过期,中等优先级(橙色)任务已进入就绪状态并被允许在绿色任务之前执行。由于橙色任务不知道有争议的信号量,它很高兴地运行完成。只有这样,绿色任务才会最终运行,以便它可以释放信号量并将执行权交给红色的高优先级任务。

pYYBAGKyyLGAOwYtAAI9Uvf_ze8142.png

因此,高优先级任务被阻塞,必须等待不确定的时间,而中等优先级任务运行完成。这就是工作中的优先级倒置。

重要的是要意识到这里涉及的三项任务基本上是无能为力的。他们没有人可以做任何事情来避免倒置,至少在没有 RTOS 的支持的情况下是这样。幸运的是,这种支持在许多 RTOS 中以具有优先级继承的互斥锁的形式提供。互斥量(互斥的缩写)是一种用于保护共享资源的信号量。优先级继承意味着如果一个高优先级的任务在试图获得一个低优先级任务当前持有的互斥锁时阻塞,那么持有该互斥锁的任务的优先级会暂时提高到被阻塞任务的优先级。在我们的场景中,当红色任务被阻塞时,绿色任务将被提升为红色优先级,从而有效地阻止了橙色任务的运行。

优先级继承并不能真正治愈优先级倒置,它只是在某些情况下将其影响最小化。硬实时应用程序仍应仔细设计,以便一开始就不会发生优先级反转。

通常,尽可能避免阻塞共享资源。例如,如果您的任务将数据写入消息队列(可能已满),您可以改为使用足够大但未满的队列,作为额外的预防措施,以非阻塞方式写入并检查任何失败写入的返回值。而不是使用分散在代码中的多个关键部分(共享互斥锁),您可以创建一个“服务器”任务,该任务执行对资源的所有直接操作,并使用消息队列从“客户端”任务中获取请求,在非-阻塞方式。服务器可以通过请求中指定的其他消息队列发送任何回复,这些消息队列由客户端任务拥有。

审核编辑:郭婷

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

    关注

    68

    文章

    10824

    浏览量

    211129
  • 服务器
    +关注

    关注

    12

    文章

    9017

    浏览量

    85181
  • RTOS
    +关注

    关注

    21

    文章

    809

    浏览量

    119429
收藏 人收藏

    评论

    相关推荐

    freertos中断优先级在哪设置

    FreeRTOS是一个流行的实时操作系统,它广泛应用于嵌入式系统开发。在FreeRTOS中,中断优先级是一个重要的概念,因为它决定了中断处理的顺序和响应时间。 1. 理解中断优先级 在讨论如何设置
    的头像 发表于 09-02 14:17 552次阅读

    APS智能优化排产软件的优先级应用

    资源、订单需求和约束条件,自动计算出最优的生产计划。在这个过程中,订单排产的优先规则起着至关重要的作用。1.交期优先级交期优先级是订单排产中最基本的优先规则。根据
    的头像 发表于 06-26 17:43 333次阅读
    APS智能优化排产软件的<b class='flag-5'>优先级</b>应用

    ESP32S2如何设置中断优先级

    ESP32S2有六中断, 如何设置中断优先级? 比如在GPIO例程里 ,这种中断优先级是如何设置的呢? 中断寄存器列表里 ,只有简称,哪里能获取这个名称所对应的功能??
    发表于 06-21 07:59

    请问有什么方法降低WIFI中断的优先级

    因为项目对时序输出要求比较严格,WIFI中断优先级比硬件定时器中断优先级要高,在定时器中断里面对GPIO管脚控制被延长执行,请问有什么方法降低WIFI中断的优先级
    发表于 06-19 07:37

    如何在不同优先级安装相同的处理程序

    在不同的优先级中安装相同的处理程序? 我需要一个解决方案,在不同的优先级中安装相同的处理程序(ISR),以便在我的项目中处理 CAT2 中断,但我不能上传项目,因为我签署了 NDA。
    发表于 05-28 08:13

    systick的中断优先级是否应该设置为最高优先级的嵌套中断?

    最近在学习ucosii有这样一个疑问,关于stm32的systick作为ucosii的基准时钟,systick的中断优先级是否应该设置为最高优先级的嵌套中断。理由是什么?各位大侠求指教!!!
    发表于 05-16 06:44

    创建了两个task如果一个优先级高 一个优先级低,高优先级的那个一直在做,什么时候会调度到低优先级的呢?

    创建了两个task如果一个优先级高一个优先级低, 我看到任务的函数都是用死循环做的,那个高优先级的那个一直在做,什么时候会调度到低优先级的呢
    发表于 05-13 07:13

    求助,关于stm32F4中断优先级0无法抢占的问题求解

    抢占优先级具有最高优先级别。 现在我使用两个定时器: 1)TIM2设置优先级为0,TIM4设置优先级为1 2)若先启动TIM4,延时一下再启
    发表于 04-23 07:26

    嵌入式实时操作系统优先级抢占式调度机制解析

    当抢占发生时,任务即使没有完成也会被迫放弃处理器,此时任务并没有被挂起,而是会返回就绪队列。任务在队列中的位置是由优先级决定的,它会在队列中等待到下一次被调度
    的头像 发表于 04-05 05:22 2682次阅读
    嵌入式实时操作系统<b class='flag-5'>优先级</b>抢占式<b class='flag-5'>调度</b>机制解析

    STM32F103的寄存器NVIC_IPRx抢占优先级和子优先级是怎么设置的?

    STM32F103的寄存器NVIC_IPRx有些不明白,抢占优先级和子优先级是怎么设置的? 如果,中断分组2,抢占优先级3,子优先级3 那下面这样写对吗? SCB->AIR
    发表于 03-27 07:48

    Hightec对芯片中断优先级分配时,中断号越高中断优先级越高吗?

    请问大佬,Hightec对芯片中断优先级分配时,中断号越高中断优先级越高吗?看网上的帖子说中断号越低优先级越高。
    发表于 02-27 06:13

    RTTnano的用户main函数中的优先级是多少?

    RTTnano 的用户main函数中的优先级是多少?为什么会出现创建新的task之后,main函数会抢占掉低优先级的task,例如RT_THREAD_PRIORITY_MAX设置为8 ,低于3
    发表于 02-26 08:01

    华为和思科默认路由优先级

    优先级值不同,则优先级值最小的为最优路由(无论开销值是否相同,另一种理解就是对不同路由来源或路由协议之间的比较)。
    的头像 发表于 01-11 10:47 1072次阅读

    GD32如何配置中断优先级分组以及中断优先级

    使用GD32 MCU的过程中,大家可能会有以下疑问:中断优先级如何配置和使用?
    的头像 发表于 01-10 10:30 2933次阅读
    GD32如何配置中断<b class='flag-5'>优先级</b>分组以及中断<b class='flag-5'>优先级</b>

    python中运算符的优先级大小

    Python中运算符的优先级决定了表达式中各个运算符的计算顺序。了解运算符的优先级对于正确理解和编写复杂的表达式非常重要。本文将详细介绍Python中运算符的优先级,并给出一些示例来帮助读者更好地理
    的头像 发表于 11-29 16:21 3238次阅读