资讯与服务

    (周一至周日 9:00-21:00)
    微信:liu87712531
    微信:lin445385978

    邮箱:87712531@qq.com

    咨询电话:15321970583

网站服务

您当前位置:首页 -> 计算机论文 -> 计算机理论->详细(目前国内最大最全原创最多的免费论文中心)

客服QQ咨询:点击这里给我发消息 点击这里给我发消息

无忧论文,为您指导,让您轻松发表,轻松晋级!

字号大小:


uC/OS-II内核超时等待机制的分析(二)

作者:不是人 整理:本网站论文网 录入时间:2011-12-14 00:18:11
的延迟项进行减1操作,如果任务T的定时时间间隔到期(延迟项被减为0),并且任务T没有附加的挂起操作,任务T就会进入就绪表,然而该函数却没有进一步将任务T移出资源R的等待队列,也就是说此时任务T跨了两个状态,这两个状态从本质上讲是矛盾的。虽然任务T此时处于就绪状态,但未必马上就能获得执行权,这取决于任务T的优先级。在任务T没有被调度执行之前的这段时间内,假设资源R到达了,比如一个中断服务程序调用了OSSemPost函数,会是什么情况呢?我们再来分析OSSemPost函数。

  void OSSemPost(OS_EVENT *pevent)

  {

  OS_ENTER_CRITICAL();

  if(pevent->OSEventGrp!=0x00){

  OS_EventTaskRdy(pevent,(void*)0,OS_STAT_SEM);//(4)

  OS_EXIT_CRITICAL();

  OS_Sched();

  return(OS_NO_ERR);

  }

  if(pevent->OSEventCnt<65535){

  pevent->OSEventCnt++;

  OS_EXIT_CRITICAL();

  return(OS_NO_ERR);

  }

  OS_EXIT_CRITICAL();

  return(OS_SEM_OVF);

  }

  }

  从语句(4)可以看出,在资源R的等待列表中有等待任务的情况下,等待表中最高优先级的任务将从等待列表中删除,并且进入就绪表。如果等待表中的最高优先级任务就是前面讲的等待超时的任务T,这相当于任务T又一次进入就绪表,不过只有一次从等待表中删除。任务T获取到了资源,只不过是在超时时间以外获取到的。任务T获得执行权以后从调度程序返回将运行函数OSSemPend()语句(6)处的条件代码,此时语句(5)处的条件不成立,任务按获取到资源对待。

  void OSSemPend(OS_EVENT *pevent,INT16U timeout,INT8U *err)

  {

  OS_ENTER_CRITICAL();

  if(pevent->OSEventType!=OS_EVENT_TYPE_SEM){

  OS_EXIT_CRITICAL();

  *err=OS_ERR_EVENT_TYPE;

  }

  if(pevent->OSEventCnt>0){

  pevent->OSEventCnt--;

  OS_EXIT_CRITICAL();

  *err=OS_NO_ERR;

  }else if(OSIntNesting>0){

  OS_EXIT_CRITICAL();

  *err=OS_ERR_PEND_ISR;

  }else{

  OSTCBCur->OSTCBStat|=OS_STAT_SEM;

  OSTCBCur->OSTCBDly=timeout;

  OSEventTaskWait(pevent);

  OS_EXIT_CRITICAL();

  OSSched();

  OS_ENTER_CRITICAL();

  if(OSTCBCur->OSTCBStat&OS_STAT_SEM){ //(5)

  OSEventTo(pevent);

  OS_EXIT_CRITICAL();

  *err=OS_TIMEOUT;

  }else{ //(6)

  OSTCBCur->OSTCBEventPtr=(OS_EVENT*0);

  OS_EXIT_CRITICAL();

  *err=OS_NO_ERR;

  }

  }

  }

  void OSEventTo(OS_EVENT *pevent)

  {

  if((pevent->OSEventTbl[OSTCBCur->OSTCBY]&=~OSTCBCur->OSTCBBitX)==0)

  {

  pevent->OSEventGrp&=~OSTCBBitY;

  }

  OSTCBCur->OSTCBStat=OS_STAT_RDY;

  v OSTCBCur->OSTCBEventPtr=(OS_EVENT*0);}

  如果任务T由于超时进入就绪态,到T获得执行权之前,仍没有获取到资源R,将运行语句(5)处的条件代码,由函数OSEventTo()可以看出,此时任务T才被从等待表中删除,最后返回超时状态。

  通过分析开放源码的nucleus内核,发现nucleus在超时到期时执行定时器的一个回调函数,此回调函数马上将等待任务从等待链表中删除,将返回状态定性为超时。这样在任务获得执行权前,即使资源到达,该任务也不会得到。这样一来,uC/OS-II内核只要在时钟节拍函数里增加代码将延时期满的任务从相应的资源等待列表中删除即可。这一工作很容易实现,内核任务控制块有指向所等待的信号

首页 上一页 1 2 3 下一页 尾页 2/3/3

上一篇赞自由软件(五)
下一篇浅谈应急信息系统的功能需求和规划