当前位置: 代码迷 >> 驱动开发 >> 关于uc/os II OSSemPend()的一点疑惑,该怎么处理
  详细解决方案

关于uc/os II OSSemPend()的一点疑惑,该怎么处理

热度:546   发布时间:2016-04-28 11:22:24.0
关于uc/os II OSSemPend()的一点疑惑
void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
  OS_CPU_SR cpu_sr = 0;
#endif



#if OS_ARG_CHK_EN > 0
  if (err == (INT8U *)0) { /* Validate 'err' */
  return;
  }
  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
  *err = OS_ERR_PEVENT_NULL;
  return;
  }
#endif
  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
  *err = OS_ERR_EVENT_TYPE;
  return;
  }
  if (OSIntNesting > 0) { /* See if called from ISR ... */
  *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
  return;
  }
  if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
  *err = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
  return;
  }
  OS_ENTER_CRITICAL();
  if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ... */
  pevent->OSEventCnt--; /* ... decrement semaphore only if positive. */
  OS_EXIT_CRITICAL();
  *err = OS_NO_ERR;
  return;
  }
  /* Otherwise, must wait until event occurs */
  OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore */
  OSTCBCur->OSTCBPendTO = OS_FALSE;
  OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
  OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
  OS_EXIT_CRITICAL();
1) OS_Sched(); /* Find next highest priority task ready */
  OS_ENTER_CRITICAL();
 2)if (OSTCBCur->OSTCBPendTO == OS_TRUE) { /* See if we timedout */
OS_EventTO(pevent);
OS_EXIT_CRITICAL();
*err = OS_TIMEOUT; /* Indicate that didn't get event within TO */
return;
}
OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
OS_EXIT_CRITICAL();
*err = OS_NO_ERR;}




1)执行玩任务调度之后,OSTCBCur指向的任务有可能不是调用OSSemPend的任务,如果那样的话,后面的代码岂不是出错了?请高人指点迷津

------解决方案--------------------
研究每句代码的强啊
------解决方案--------------------
好深奥