1。概念
,,一个高优先级线程通过信号量机制访问共享资源时,该信号量已被一个低优先级线程占有,而这个低优先级线程在访问共享资源时被其他的一些中等优先级线程抢占,因此造成高优先级线程被许多具有较低优先级的线程阻塞,称此现象为优先级反转。
,,优先级反转会导致低优先级任务先于高优先级任务运行,在实时系统中会导致不可控的现象发生,因此,优先级反转在实时系统中是不可接受的。
2。解决优先级反转
2.1优先级天花板
2.2优先级继承
3。互斥量解决优级反转
3.1互斥量属性块
,,互斥量在创建时,需先创建互斥量属性块,SylixOS下互斥量属性块结构如程序清单3.1所示。
程序清单3.1互斥量属性块结构
typedef struct { ,,,int ,,,,,,,,,PMUTEXATTR_iIsEnable;,,,,,/*,,此属性块是否有效,,,,,,,,,,*/,,,int ,,,,,,,,,,,,PMUTEXATTR_iType;,,,,,,,/*,,互斥量类型,,,,,,,,,,,,,,,,*/,,,int ,,,,,,,,,,,,PMUTEXATTR_iPrioceiling;/*,,天花板优先级,,,,,,,,,,,,,,*/,,,unsigned 长pmutexattr_uloption;,,,,,,,/*,,算法类型,,,,,,,,,,,,,,,,,,*/},pthread_mutexattr_t;
static const pthread_mutexattr_t , _G_pmutexattrDefault =, { ,,,, PTHREAD_MUTEX_DEFAULT,,,,,,,,,,,,,,,,,,,,,,,,,,/*,,允许递归调用,,,,,,,,,,,,,,*/,,,PTHREAD_MUTEX_CEILING, ,,,(LW_OPTION_INHERIT_PRIORITY |, ,,,LW_OPTION_WAIT_PRIORITY),/* pthread_prio_none,,,,,, */};
3.2提高优先级
# include & lt; SylixOS.h> VOID , _EventPrioTryBoost (PLW_CLASS_EVENT ,增加,,PLW_CLASS_TCB , ptcbCur)
- <李>
参数增加为资源所属的事件控制块;
李> <李>参数ptcbCur为当前任务控制块。
李>
3.3恢复优先级
# include & lt; SylixOS.h> VOID , _EventPrioTryResume (PLW_CLASS_EVENT ,增加,,PLW_CLASS_TCB ,, ptcbCur)
- <李>
参数增加为资源所属的事件控制块;
李> <李>参数ptcbCur为当前任务控制块。
李>
if (ptcb), { ,,,,,,,ucPriority =, (UINT8)增加→EVENT_ulMaxCounter;,,,,,,/*,,获得原线程优先级,,,,,,,,,,*//* ,*,拥有者优先级发生了变化,还原优先级 ,*/,,,,,,,if (! LW_PRIO_IS_EQU (ucPriority, ptcb→TCB_ucPriority)), { ,,,,,,,_SchedSetPrio (ucPriority ptcb也); ,,,} }
4。优先级设置函数
# include & lt; SylixOS.h> VOID , _SchedSetPrio (PLW_CLASS_TCB , ptcb,, UINT8 , ucPriority)
- <李>
参数ptcb为当前任务控制块;
李> <李>参数ucPriority为需设置的优先级。
李>
,