首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

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

2012-02-03 
关于uc/os II OSSemPend()的一点疑惑voidOSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err){#if

关于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的任务,如果那样的话,后面的代码岂不是出错了?请高人指点迷津

[解决办法]
研究每句代码的强啊
[解决办法]
好深奥

热点排行