程序小白
认证:优质创作者
所在专题目录 查看专题
关于软件的作用域和生命周期的一些理解
浅析RTOS中的钩子函数(HOOK)
RTOS的时间片调度不同处——FreeRTOS与RTT
FreeRTOS中任务间的同步——事件组与全局变量
FreeRTOS的优先级翻转与继承
作者动态 更多
RT-Thread驱动之路: Studio 挂载通用SPI flash④
4天前
RT-Thread驱动之路: Studio初始化SPI总线③
1星期前
RT-Thread驱动之路:Studio修改时钟篇②
2星期前
RT-Thread驱动之路: Studio硬件移植篇①
2星期前
RT-Thread驱动之路:stm32设备驱动开发之HWTIMER开发①
12-02 15:42

FreeRTOS的优先级翻转与继承

 (多年前的真实经历)

      面试官:懂不懂RTOS?

      小白:懂一点。

      面试官:你来讲一下什么是优先级翻转,什么是优先级继承。

      小白:……


      曾经一度以为是因为自己没答上来,而失去了一份心仪已久的offer,但实际上哪怕答上来我也可能只是个joke.


优先级的翻转与继承发生在什么情况下?

1. 首先这里所说的都是任务级的优先级(中断也是有优先级的,那归NVIC管,RTOS插不上手)

2. 必须是多任务运行情况下(至少三个以上的任务)。

3.不同优先级任务之间存在同步的关系(尤其是高优先级任务与低优先级任务之间有爱恨纠葛)。

接下来看一看优先级继承与翻转出现的情况。

优先级翻转的运行顺序:

时刻一: Task3正在运行态,并且正在访问某个共享资源。

时刻二: 这个时候Task1 变为就绪态,于是抢占Task3任务,抢占发生后,Task1变为运行态,Task3变为就绪态。

时刻三: 假如在这一时刻,Task2从阻塞态变为了就绪态,但是由于Task1在运行态,所以他只能等待。

时刻四:Task1在运行过程中,需要访问某个共享资源,但资源被Task3占用,于是Task1进入阻塞态。

猎杀时刻到来:Task1进入阻塞态,调度器需要从就绪任务列表中,读取当前已经就绪的任务,选择优先级较高的任务,让其进入运行态。目前在就绪任务列表中的任务有个Task2和Task3,该谁进入运行态呢?

情况一(当任务间应用二值信号量进行资源获取时发生):

Task2进入运行态的情况,由于Task2 < Task1 ,所以站在应用的角度来看优先级发生了翻转。

情况二(当任务间应用互斥信号量进行资源获取时发生):

Task3进入运行态的情况,由于Task3 < Task2,所以站在应用的角度来看,Task3先于Task2运行,更像是Task3继承了Task1的优先级,而发生了优先级抢占。


总结一下:

      不论是优先级继承还是优先级翻转,都不是错误,对于调度器来讲都只能算是常规操作,他只是根据同步的类型以及任务的优先级,进行了确定性的判断,并调整任务的状态而已。

应用看起来有点怪或者是异常都是由设计者导致的,你比如常规的操作造成死锁,挂掉整个应用,你也不能怪调度器不是。


题外话:

      其实一切都没那么复杂,在你真正实践的时候就能掌握所有细节。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 4
收藏 2
关注 141
成为作者 赚取收益
全部留言
0/200
  • chaochao1545 2021-10-12 13:28
    思路清晰,受益匪浅
    回复