查看: 1487|回复: 0

[原创] 如何可视化分析FreeRTOS优先级反转问题?

[复制链接]
  • TA的每日心情
    开心
    2023-6-12 14:34
  • 签到天数: 165 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2022-2-11 14:12:08 | 显示全部楼层 |阅读模式
    分享到:
    什么是优先级反转

    使用RTOS,可以帮助我们将应用代码分成更小的相互独立的任务,简化了应用开发。但多个任务可能都需要使用CPU的某个资源,造成了任务之间的资源竞争,导致抢占调度系统中的任务优先级反转问题。

    1.png

    什么是优先级反转?我们以上图为例,系统中有3个不同优先级的任务H/M/L,最高优先级任务H和最低优先级任务L通过信号量机制,共享资源。目前任务L占有资源,锁定了信号量,Task H运行后将被阻塞,直到Task L释放信号量后,Task H才能够退出阻塞状态继续运行。但是Task H在等待Task L释放信号量的过程中,中等优先级任务M抢占了任务L,从而延迟了信号量的释放时间,导致Task H阻塞了更长时间,这种现象称为优先级倒置或反转。

    观察优先级反转行为

    优先级倒置意味着高优先级任务会被较低优先级任务意外延迟。但在实时系统中,很难观测到该行为。

    下面我们通过一个示例应用代码来直观的感知一下系统中发生了优先级反转。

    参考图1,在应用中创建H/M/L三个不同优先级的任务,分别控制红色、橙色、绿色LED灯。其中红色LED任务和绿色LED任务会尝试去访问由信号量保护的共享资源。代码中通过一个蓝色LED灯来代表共享资源,蓝色LED灯的闪烁代表共享资源部分代码的执行。

    访问共享资源(蓝色LED灯)的代码如下:

    2.png

    信号量以阻塞的方式实现对共享资源的访问,当任务获取信号量失败时将被挂起。共享资源部分的代码需要执行2秒(蓝色LED闪烁2秒)后才会释放信号量。

    三个任务的具体工作如下:

    3.png

    将代码编译下载到STM32F4 Discovery开发板,实际执行过程通过分析代码及观测LED的闪烁行为,运行时序如下:

    蓝色LED闪烁1s,橙色LED闪烁4s,蓝色LED闪烁3s,红色LED闪烁4s,绿色LED闪烁4s

    但是从LED的闪烁行为中我们无法了解任务执行过程中的细节,什么事件触发了反转,何时触发了反转行为。要想直观的了解任务的具体执行过程,可以借助RTOS可视化分析工具Tracealyzer的帮助。

    可视化分析优先级反转行为

    可视化跟踪工具Tracealyzer提供了30多种相互关联的RTOS运行时行为视图,包括任务调度、中断、任务之间的相互作用,以及从应用程序代码中记录的用户事件。Tracealyzer的一些基本概念介绍参考:RTOS分析需掌握的基本概念

    任务在Tracealyzer视图中以带颜色的矩形表示,矩形的长度代表着执行的时间长度。矩形中阴影部分表示任务处于就绪态,但是期间CPU正被就绪的更高优先级任务占用。H/M/L任务分别用红色、橙色和绿色标识。

    使用Tracealyzer记录上述应用的行为。通过捕获视图,我们来分析一下系统具体行为:

    (1)任务创建完成后,启动第一个任务(下图)

    任务创建完成后,FreeRTOS首先切换至优先级最高的H任务开始运行,在H任务(红色)调

    用vTaskDelay函数让出cpu,系统切换至M任务(橙色),M任务同样调用vTaskDelay函数,系统切换到L任务(绿色)。L任务获取到信号量,开始访问共享资源。

    4.png

    什么是优先级反转?我们以上图为例,系统中有3个不同优先级的任务H/M/L,最高优先级任务H和最低优先级任务L通过信号量机制,共享资源。目前任务L占有资源,锁定了信号量,Task H运行后将被阻塞,直到Task L释放信号量后,Task H才能够退出阻塞状态继续运行。但是Task H在等待Task L释放信号量的过程中,中等优先级任务M抢占了任务L,从而延迟了信号量的释放时间,导致Task H阻塞了更长时间,这种现象称为优先级倒置或反转。

    (2)L任务的执行(下图)

    L任务获取到信号量后,占用共享资源并且需要执行2秒(蓝色LED灯闪烁)。当蓝色LED灯闪烁1秒后,由于H任务延时1秒时间到,任务将恢复就绪状态并抢占L任务开始运行,并尝试获取信号量,但由于信号量被占用,故马上陷入了阻塞状态,FreeRTOS此时调度就绪的M任务运行。通过Tracealyzer视图,可以看到H任务由于获取信号量失败而发生了优先级反转。

    5.png

    (3)橙色LED任务执行完成(橙色LED闪烁4秒),绿色LED任务释放信号量(下图)

    ①M任务执行完成后,此时信号量仍未释放,因此H任务依然是阻塞状态,系统由M任务切换至L任务运行。

    ②L任务此前获取共享资源后已运行了1秒,故蓝色LED继续闪烁1秒钟后共享资源部分代码执行结束,释放信号量。H任务此时获取信号量从阻塞状态恢复为就绪状态并马上抢占L任务。

    6.png

    H任务获取到信号量后,访问共享资源并执行(蓝色LED闪烁2秒),继续执行H任务自身的工作,使红色LED闪烁4秒。总共执行6秒后H任务结束。

    (4)绿色LED闪烁4秒,L任务执行完成(下图)

    H任务执行完成后,系统切换至L任务运行,L任务此时的状态是刚完成对共享资源的访问,继续执行其工作(绿色LED闪烁4秒)。

    7.png
    总结
    从Tracealyzer的跟踪视图可以看到,H任务在延时1秒后,已经恢复了就绪状态,但是由于信号量被低优先级的L任务占用,而进入了阻塞状态。H任务被迫等待更低优先级的M和L任务执行完成后才能恢复执行,使系统发生了优先级反转,该问题影响了高优先级H任务的响应时间。
    通过Tracealyzer的可视化分析,我们直观的看到了优先级反转的存在,获取了具体的运行时序信息。在更复杂的应用中,Tracealyzer强大的可视化分析功能,可以帮助开发者深入理解RTOS应用的实际执行情况,解决传统调试方法不易发现的问题,优化系统的设计。

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-28 19:22 , Processed in 0.119960 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.