SylixOS下优先级反转与解决方案
admin
2023-03-15 06:21:01
0

1. 概念

    一个高优先级线程通过信号量机制访问共享资源时,该信号量已被一个低优先级线程占有,而这个低优先级线程在访问共享资源时被其他的一些中等优先级线程抢占,因此造成高优先级线程被许多具有较低优先级的线程阻塞,称此现象为优先级反转。
    优先级反转会导致低优先级任务先于高优先级任务运行,在实时系统中会导致不可控的现象发生,因此,优先级反转在实时系统中是不可接受的。

2. 解决优先级反转

    高优先级任务不能执行的原因是因为低优先级占用了资源,而低优先级不能获得CPU,无法释放资源,所以解决优先级反转的原则是让低优先级任务尽快执行,释放资源。
SylixOS下解决优先级反转有优先级天花板策略(priority ceiling)和优先级继承策略(priority inheritance),且SylixOS下互斥信号量同时支持这两种策略。

2.1 优先级天花板

    优先级天花板策略是指将占有某资源的任务的优先级提高,提升到可能访问该资源的所有任务中最高优先级任务的优先级(这个优先级称为该资源的优先级天花板)。

2.2 优先级继承

    当发现高优先级的任务因为低优先级任务占用资源而阻塞时,就将低优先级任务的优先级提升到等待它所占有的资源的最高优先级任务的优先级。

3. 互斥量解决优级反转

3.1 互斥量属性块

    互斥量在创建时,需先创建互斥量属性块,SylixOS下互斥量属性块结构如程序清单 3.1所示。

程序清单 3.1 互斥量属性块结构

typedef struct {
    int          	PMUTEXATTR_iIsEnable;     	/*  此属性块是否有效           */
    int             	PMUTEXATTR_iType;       	/*  互斥量类型                 */
    int             	PMUTEXATTR_iPrioceiling;	/*  天花板优先级               */
    unsigned long	PMUTEXATTR_ulOption;       	/*  算法类型                   */
} pthread_mutexattr_t;

    初始化互斥量时,如果不为互斥量属性块进行初始化,则使用默认属性,SylixOS互斥量默认属性块如程序清单 3.2所示。

程序清单 3.2 默认互斥量属性块

static const pthread_mutexattr_t  _G_pmutexattrDefault = {
    1,
    PTHREAD_MUTEX_DEFAULT,                       	/*  允许递归调用               */
    PTHREAD_MUTEX_CEILING,
    (LW_OPTION_INHERIT_PRIORITY | 
    LW_OPTION_WAIT_PRIORITY) 				/*PTHREAD_PRIO_NONE	       */
};

    由默认互斥量默认属性块可知,SylixOS下默认解决优先级反转方案是优先级继承策略。

3.2 提高优先级

    低优先级的任务占有资源,且高任务的优先级请求资源时,会尝试提高低优先级任务的优先级,在申请资源时调用_EventPrioTryBoost函数尝试提高任务优先级。

#include 
VOID  _EventPrioTryBoost (PLW_CLASS_EVENT  pevent, PLW_CLASS_TCB  ptcbCur)

    函数_EventPrioTryBoost原型分析:

  • 参数pevent为资源所属的事件控制块;

  • 参数ptcbCur为当前任务控制块。

    该函数根据互斥量属性块的属性设置,确定选用优先级继承策略或者天花板策略(SylixOS下默认是使用优先级继承策略),调用_SchedSetPrio函数改变任务的优先级。

3.3 恢复优先级

    低优先级任务释放互斥量时,调用EventPrioTryResume尝试恢复任务的优先级。

#include 
VOID  _EventPrioTryResume (PLW_CLASS_EVENT  pevent, PLW_CLASS_TCB   ptcbCur)

    函数_EventPrioTryResume原型分析:

  • 参数pevent为资源所属的事件控制块;

  • 参数ptcbCur为当前任务控制块。

    低优先级任务删除互斥量时,会尝试恢复任务优先级,代码片段如程序清单 3.3所示。

程序清单 3.3 尝试恢复优先级

if (ptcb) {
        ucPriority = (UINT8)pevent->EVENT_ulMaxCounter;	       /*  获得原线程优先级           */
	/*
	 *  拥有者优先级发生了变化,还原优先级
	 */
        if (!LW_PRIO_IS_EQU(ucPriority, ptcb->TCB_ucPriority)) {
        _SchedSetPrio(ptcb, ucPriority);
    }
}

4. 优先级设置函数

    在使用互斥量时,尝试提高或恢复任务优先级,调用SchedSetPrio函数进行优先级设置。

#include 
VOID  _SchedSetPrio (PLW_CLASS_TCB  ptcb, UINT8  ucPriority)

    函数_SchedSetPrio原型分析:

  • 参数ptcb为当前任务控制块;

  • 参数ucPriority为需设置的优先级。

    _SchedSetPrio函数改变任务的优先级,实现流程如图 4.1所示。

 SylixOS下优先级反转与解决方案

图 4.1 优先级设置流程


相关内容

热门资讯

ICC逮捕令致内塔尼亚胡出行受... 【环球网报道】据以色列《新消息报》网站26日报道,由于国际刑事法院(ICC)2024年就以色列在巴勒...
“罗永浩怒斥电视机厂商”戳中了... 7月25日晚,罗永浩发文怒斥当下电视机的产品设计。据都市快报报道,罗永浩表示,他为家中老人换了两次电...
各地各部门坚持人民至上筑牢防汛... 新华社北京7月25日电 题:风雨同舟映初心——各地各部门坚持人民至上筑牢防汛抗洪坚实堤坝新华社记者当...
法院回应LV起诉地产开发商 7月26日,厦门市湖里区人民法院发布情况通报,网传案情“路易威登公司起诉地产开发商,因楼盘外立面四叶...
携程的问题不仅在于垄断,更在于... 国内平台科技企业一般都是通过向B端收费、抽佣获利,尽量给消费者创造一个比较清爽的使用环境。携程算是最...
海信电视用遥控器关闭后打不开 原因可能是遥控器的电池没有装好或者是没电了,需要重新安装一下电池或者更换新的电池试一试;原因可能是电...
电视机突然没电源打不开了 有可能是电视开关的电源线断了;可能是电视在使用时短路;可能是电源插头插座松动;可能是电视内部零件接触...
电热水器下面那个小龙头漏水是怎... 电热水器下面那个小龙头漏水是怎么回事?1、因为安全阀发生了故障或者是已经被损坏了,就会有漏水的现象;...
回答下电脑桌面一片空白怎么恢复 电脑桌面上如果是一片空白,那说明您的电脑图标被隐藏了,想要恢复就要按照如下的三个步骤去操作才行。 第...
澳总理要找特朗普“理论”关税:... 当地时间7月26日,澳大利亚总理阿尔巴尼斯表示,他将直接向美国总统特朗普提出抗议,反对美国新近宣布的...