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

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

3天内不再提示

开发过程中是什么原因导致优先级翻转的?

RTThread物联网操作系统 来源:Rice嵌入式开发技术分享 作者:Rice嵌入式开发技术 2021-05-28 15:28 次阅读

最近在开发过程中,遇到一个问题线程优先级翻转的问题。那什么原因导致优先级翻转呢?

RTOS开发中,优先级翻转问题也是值得我们去关注留意的。避免代码瘫痪。

什么是优先级翻转

所谓的优先级翻转问题:即当一个高优先级线程通过信号量机制访问共享资源时,该型号量以被一个低优先级线程占有,而这个低优先级的任务在访问共享资源时可能又被一个中等优先级任务抢占。从上面的描述,高优先级线程被许多较低优先级的任务阻塞,导致高优先级的实时性得不到保证。

举例:有三个线程分别为:A、B、C。优先级A 》 B 》 C,线程A和B处于挂起状态,等待某一事件发生,线程C正在运行,此时任务C开始使用共享资源Source。在使用Source时,线程A等待事件到来,线程A转为就绪态,因为线程A优先级比线程C高,所以线程A会立即执行。当线程A要使用共享资源Source时,由于共享资源Source正在被线程C使用,因此线程A被挂起,线程C开始运行。如果此时中等优先级线程B等待事件到来,则线程B转为就绪态。由于线程B优先级比线程C高,因此线程B开始运行,直到其运行完毕,线程C才开始运行。直到线程C释放共享资源Source后,线程A才得以执行。在这种情况下,优先级发生了翻转,线程B先于线程A运行。

如何解决优先级翻转

解决优先级翻转的方法:优先级天花板、优先级继承。那么这两种方法有什么?

优先级天花板优先级天花板是当线程申请某资源时,把该线程的优先级提升到可访问这个资源的所有线程中的最高优先级,这个优先级称为该资源的优先级天花板。这种方法简单易行,不必进行复杂的判断,不管线程是否阻塞了高优先级线程的运行, 只要线程访问共享资源都会提升线程的优先级。

优先级继承优先级继承是当线程A申请共享资源Source时,如果共享资源Source正在被线程C使用,通过比较线程C与自身的优先级,如发现线程C的优先级小于自身的优先级, 则将线程C的优先级提升到自身的优先级,线程C释放资源Source后,再恢复线程C的原优先级。这种方法只在占有资源的低优先级线程阻塞了高优先级线程时才动态的改变线程的优先级。

RT-Thread是如何解决线程优先级翻转呢?

在官方的文档中,对线程优先级翻转有相对应的说明及解决方法。下面我把RT-THREAD官方的描述及解决方法贴出来。

使用信号量会导致的另一个潜在问题是线程优先级翻转问题。所谓优先级翻转,即当一个高优先级线程试图通过信号量机制访问共享资源时,如果该信号量已被一低优先级线程持有,而这个低优先级线程在运行过程中可能又被其它一些中等优先级的线程抢占,因此造成高优先级线程被许多具有较低优先级的线程阻塞,实时性难以得到保证。如下图所示:有优先级为 A、B 和 C 的三个线程,优先级 A 》 B 》 C。线程 A,B 处于挂起状态,等待某一事件触发,线程 C 正在运行,此时线程 C 开始使用某一共享资源 M。在使用过程中,线程 A 等待的事件到来,线程 A 转为就绪态,因为它比线程 C 优先级高,所以立即执行。但是当线程 A 要使用共享资源 M 时,由于其正在被线程 C 使用,因此线程 A 被挂起切换到线程 C 运行。如果此时线程 B 等待的事件到来,则线程 B 转为就绪态。由于线程 B 的优先级比线程 C 高,因此线程 B 开始运行,直到其运行完毕,线程 C 才开始运行。只有当线程 C 释放共享资源 M 后,线程 A 才得以执行。在这种情况下,优先级发生了翻转:线程 B 先于线程 A 运行。这样便不能保证高优先级线程的响应时间。

c24609a4-be57-11eb-9e57-12bb97331649.png

在 RT-Thread 操作系统中,互斥量可以解决优先级翻转问题,实现的是优先级继承算法。优先级继承是通过在线程 A 尝试获取共享资源而被挂起的期间内,将线程 C 的优先级提升到线程 A 的优先级别,从而解决优先级翻转引起的问题。这样能够防止 C(间接地防止 A)被 B 抢占,如下图所示。优先级继承是指,提高某个占有某种资源的低优先级线程的优先级,使之与所有等待该资源的线程中优先级最高的那个线程的优先级相等,然后执行,而当这个低优先级线程释放该资源时,优先级重新回到初始设定。因此,继承优先级的线程避免了系统资源被任何中间优先级的线程抢占。

c2536888-be57-11eb-9e57-12bb97331649.png

说明

对于我们开发来说,要避免发生优先级翻转的问题。

优先级翻转的危害:

任务调度时,时间不确定性,破坏实时系统的实时性,严重时可能导致系统崩溃。

优先级低的任务比优先级高的任务更先执行,导致任务的错乱,逻辑的错乱。

原文标题:线程优先级翻转,如何避免?

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

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

    关注

    4981

    文章

    18274

    浏览量

    288360
  • RTOS
    +关注

    关注

    20

    文章

    775

    浏览量

    118783

原文标题:线程优先级翻转,如何避免?

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

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

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

    关于stm32cubefreertos的优先级设置问题求解

    在用stm32cubefreertos,在配置界面里设置为12任务优先级,但是在cube配置每个任务优先级时还是只能选择7种
    发表于 04-22 07:25

    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

    M0516优先级怎么设置?

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

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

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

    stm32的DMA使用过程中经常没有数据刷新会是什么原因导致

    stm32的DMA使用过程中经常没有数据刷新会是什么原因导致
    发表于 10-31 06:08

    STM8优先级怎么设置?

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

    步进电机在驱动的过程中发热严重是什么原因导致的?

    驱动的过程中发热严重,可能是什么原因导致
    发表于 10-13 07:11

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

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

    到底该把喂狗任务优先级设置成最高还是最低好?

    一个学员在学习 uCOS 系统过程中,对看门狗任务的优先级产生了疑惑,到底该把喂狗任务优先级设置成最高还是最低好?
    的头像 发表于 09-13 09:10 600次阅读

    I2C子系统优先级翻转优先级继承

    运行。 某一时刻任务 L 想要访问共享资源,在此之前它必须先获得对应该资源的信号量。 任务 L 获得信号量并开始使用该共享资源。 由于任务 H 优先级高,它等待的事件发生后便剥夺了任务 L 的 CPU 使用权。 任务 H 开始运行。 任务 H 运行过程中也要使用任务 L
    的头像 发表于 07-22 15:08 434次阅读
    I2C子系统<b class='flag-5'>优先级</b><b class='flag-5'>翻转</b>与<b class='flag-5'>优先级</b>继承

    如何读懂FPGA开发过程中的Vivado时序报告?

    FPGA开发过程中,vivado和quartus等开发软件都会提供时序报告,以方便开发者判断自己的工程时序是否满足时序要求。
    发表于 06-26 15:29 571次阅读
    如何读懂FPGA<b class='flag-5'>开发过程中</b>的Vivado时序报告?

    m029lan中断优先级设置与实际对不上是什么原因

    优先级有0-3,共4,0最高,3最低。现在用函数:NVIC_SetPriority(UART0_IRQn, 1);本想设置串口优先级为1,可实查看时,成了***?
    发表于 06-16 06:19