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

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

3天内不再提示

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

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

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

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

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

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

pYYBAGKyyLGAOwYtAAI9Uvf_ze8142.png

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

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

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

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

审核编辑:郭婷

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

    关注

    68

    文章

    10301

    浏览量

    206119
  • 服务器
    +关注

    关注

    12

    文章

    7968

    浏览量

    82142
  • RTOS
    +关注

    关注

    20

    文章

    761

    浏览量

    118663
收藏 人收藏

    评论

    相关推荐

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

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

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

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

    M0516中断优先级怎么设置?

    新唐M0516中断优先级的设置,有没有示例,没找到相关接口,谢谢!
    发表于 01-16 07:25

    单片机的中断优先级是怎么确定的?

    单片机的中断优先级是怎么确定的,如果设定优先级后怎么确定设定的对不对?
    发表于 11-03 06:32

    freertos中的任务优先级通过什么函数设置?

    任务优先级怎么设置成最高
    发表于 11-02 07:40

    ucos怎么设置任务的优先级

    这个优先级怎么设置的
    发表于 10-30 06:18

    STM8中断优先级怎么设置?

    STM8中断优先级怎么设置
    发表于 10-25 06:49

    STM32中断没有子优先级

    比如,有时候你在使用STM32CubeMX配置时,你会发现只有Preemption Priority【抢占优先级】,而没有Sub Priority【次优先级
    的头像 发表于 10-17 15:50 364次阅读
    STM32中断没有子<b class='flag-5'>优先级</b>?

    freertos怎么在任务中修改任务的优先级

    freertos怎么在任务中修改任务的优先级
    发表于 10-11 07:56

    基于优先级调度的嵌入式实时操作系统内核详解(上)

    今日分享参加瑞萨RA MCU创意氛围赛的选手项目——基于优先级RTOS内核。本项目为基于优先级调度的嵌入式实时操作系统内核,其中调度部分使
    发表于 09-04 14:12 276次阅读

    PLIC管理的中断的优先级和RISC-V本身的机器定时器以及软中断的中断优先级问题

    请问PLIC管理的外设中断的优先级和RISC-V本身的机器定时器以及软中断谁的优先级会更高? 机器定时器中断和软中断不归PLIC管(PLIC管理其他外设的中断优先级),那么机器定时器中断和软中断可以嵌套其他PLIC管理的外设中断
    发表于 06-25 19:05

    优先级执行了75s怎么办?它会被杀死吗?

    态持续运行了60s)就判断它时异常了吗?2-这个超时时间是指再延迟个15s确定他为异常线程,也就是总共经过75s这个抢占住CPU的线程会被杀死或者重新载入。 综合来看,即使是用户的最高优先级线程,也
    发表于 05-17 14:41

    什么是优先级反转

    假设现在有三个任务TaskA(优先级高)、TaskB(优先级中)、TaskC(优先级低),一个信号量(Semaphore),此信号量用于任务之间争夺某个资源。在某一时刻,高优先级的Ta
    的头像 发表于 04-24 13:01 1351次阅读
    什么是<b class='flag-5'>优先级</b>反转

    rt1165优先级为0的中断被阻塞了怎么处理?

    我正在使用 rt1165 来实现具有 2 个中断的设计。快速中断设置为优先级0,慢速中断设置为优先级1。但是快速中断触发受慢速中断的影响,如图所示。黄色波浪是在快速中断中触发的 GPIO,紫色波浪
    发表于 04-06 07:18

    STM32中断中设置的先占式优先级与从优先级如何理解?

    STM32中断中设置的先占式优先级与从优先级如何理解?
    发表于 03-24 17:55