- UID
- 1029342
- 性别
- 男
|
那么,如何提升优先级低但占有资源的任务至申请该资源的高优先级任务的优先级,直到低优先级的任务释放该资源,恢复低优先级任务的优先级,高优先级的任务才占有该资源。首先这里需要改变任务优先级, 改变的优先级分别是提升优先级到高优先级和恢复任务到低优先级。显然,需要存储将要改变结果的优先级数,可以通过扩展OS_Event 来实现。
typestruct{
void *OSEventPtr;
……
int8u prio;}OS_Event
然后分别修改OSSemPend()和OSSemPost()。
void OSSemPend()
{……
if(pevent->OSEventCnt>0)
{pevebt->OSEventCnt--;
#if OS_TASK_PrioEqu_EN
if(pevent->OSEventCnt<1)
{pevent->prio=OSTCBCur->prio;}
//当资源恰好分配完时,记下当前任务优先级
#endif
OS_EXIT_CRITICAL();
*err=OS_NO_ERR;}
#if OS_TASK_PrioEqu_EN
elseif
{OSTaskChangePrio(pevent->prio,OSTCBCUR->prio);}
//当任务等待分配资源时提升占有资源任务的优先级
#endif
……
}
int8u OSSemPost()
{……
if(pevent->OSEventCnt<65535)
{pevent->OSEventCnt++;
#if OS_TASK_PrioEqu_EN
if(pevent->OSEventCnt<2)
OSTaskChangePrio(OSTCBCur->prio,pevent->prio);}
//当任务释放临界资源时恢复一个任务的优先级
#endif
OS_EXIT_CRITICAL();
return(OS_M_ERR);
……}
通过对这几个函数的修改, 实现了优先级的继承,解决了优先级的反转。问题的关键是对同优先级调度的支持和对资源分配的申请与释放过程的约定。结语
uCOS II 是一个良好的实时操作系统。随着更多的人使用和不断的改进, 将会有更好的应用前景。 |
|