UCOS_TI_LM3S_Keil
 全部 结构体 文件 函数 变量 类型定义 宏定义 
os_sem.c 文件参考
#include <ucos_ii.h>
os_sem.c 的引用(Include)关系图:

浏览源代码.

函数

INT16U OSSemAccept (OS_EVENT *pevent)
 
OS_EVENTOSSemCreate (INT16U cnt)
 
OS_EVENTOSSemDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
 
void OSSemPend (OS_EVENT *pevent, INT32U timeout, INT8U *perr)
 
INT8U OSSemPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
 
INT8U OSSemPost (OS_EVENT *pevent)
 
INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *p_sem_data)
 
void OSSemSet (OS_EVENT *pevent, INT16U cnt, INT8U *perr)
 

函数说明

INT16U OSSemAccept ( OS_EVENT pevent)

在文件 os_sem.c49 行定义.

参考 OS_ENTER_CRITICAL, OS_EVENT_TYPE_SEM, OS_EXIT_CRITICAL, OS_EVENT::OSEventCnt , 以及 OS_EVENT::OSEventType.

50 {
51  INT16U cnt;
52 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
53  OS_CPU_SR cpu_sr = 0u;
54 #endif
55 
56 
57 
58 #if OS_ARG_CHK_EN > 0u
59  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
60  return (0u);
61  }
62 #endif
63  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
64  return (0u);
65  }
67  cnt = pevent->OSEventCnt;
68  if (cnt > 0u) { /* See if resource is available */
69  pevent->OSEventCnt--; /* Yes, decrement semaphore and notify caller */
70  }
72  return (cnt); /* Return semaphore count */
73 }
OS_EVENT* OSSemCreate ( INT16U  cnt)

在文件 os_sem.c94 行定义.

参考 OS_ENTER_CRITICAL, OS_EVENT_TYPE_SEM, OS_EventWaitListInit(), OS_EXIT_CRITICAL, OS_EVENT::OSEventCnt, OSEventFreeList, OS_EVENT::OSEventName, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType , 以及 OSIntNesting.

参考自 OSTmr_Init().

95 {
96  OS_EVENT *pevent;
97 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
98  OS_CPU_SR cpu_sr = 0u;
99 #endif
100 
101 
102 
103  if (OSIntNesting > 0u) { /* See if called from ISR ... */
104  return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
105  }
107  pevent = OSEventFreeList; /* Get next free event control block */
108  if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
110  }
112  if (pevent != (OS_EVENT *)0) { /* Get an event control block */
113  pevent->OSEventType = OS_EVENT_TYPE_SEM;
114  pevent->OSEventCnt = cnt; /* Set semaphore value */
115  pevent->OSEventPtr = (void *)0; /* Unlink from ECB free list */
116 #if OS_EVENT_NAME_EN > 0u
117  pevent->OSEventName = (INT8U *)"?";
118 #endif
119  OS_EventWaitListInit(pevent); /* Initialize to 'nobody waiting' on sem. */
120  }
121  return (pevent);
122 }

函数调用图:

这是这个函数的调用关系图:

OS_EVENT* OSSemDel ( OS_EVENT pevent,
INT8U  opt,
INT8U perr 
)

在文件 os_sem.c163 行定义.

参考 OS_DEL_ALWAYS, OS_DEL_NO_PEND, OS_ENTER_CRITICAL, OS_ERR_DEL_ISR, OS_ERR_EVENT_TYPE, OS_ERR_INVALID_OPT, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_TASK_WAITING, OS_EVENT_TYPE_SEM, OS_EVENT_TYPE_UNUSED, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_FALSE, OS_Sched(), OS_STAT_PEND_OK, OS_STAT_SEM, OS_TRUE, OS_EVENT::OSEventCnt, OSEventFreeList, OS_EVENT::OSEventGrp, OS_EVENT::OSEventName, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType , 以及 OSIntNesting.

166 {
167  BOOLEAN tasks_waiting;
168  OS_EVENT *pevent_return;
169 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
170  OS_CPU_SR cpu_sr = 0u;
171 #endif
172 
173 
174 
175 #if OS_ARG_CHK_EN > 0u
176  if (perr == (INT8U *)0) { /* Validate 'perr' */
177  return (pevent);
178  }
179  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
180  *perr = OS_ERR_PEVENT_NULL;
181  return (pevent);
182  }
183 #endif
184  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
185  *perr = OS_ERR_EVENT_TYPE;
186  return (pevent);
187  }
188  if (OSIntNesting > 0u) { /* See if called from ISR ... */
189  *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
190  return (pevent);
191  }
193  if (pevent->OSEventGrp != 0u) { /* See if any tasks waiting on semaphore */
194  tasks_waiting = OS_TRUE; /* Yes */
195  } else {
196  tasks_waiting = OS_FALSE; /* No */
197  }
198  switch (opt) {
199  case OS_DEL_NO_PEND: /* Delete semaphore only if no task waiting */
200  if (tasks_waiting == OS_FALSE) {
201 #if OS_EVENT_NAME_EN > 0u
202  pevent->OSEventName = (INT8U *)"?";
203 #endif
205  pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
206  pevent->OSEventCnt = 0u;
207  OSEventFreeList = pevent; /* Get next free event control block */
209  *perr = OS_ERR_NONE;
210  pevent_return = (OS_EVENT *)0; /* Semaphore has been deleted */
211  } else {
213  *perr = OS_ERR_TASK_WAITING;
214  pevent_return = pevent;
215  }
216  break;
217 
218  case OS_DEL_ALWAYS: /* Always delete the semaphore */
219  while (pevent->OSEventGrp != 0u) { /* Ready ALL tasks waiting for semaphore */
220  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);
221  }
222 #if OS_EVENT_NAME_EN > 0u
223  pevent->OSEventName = (INT8U *)"?";
224 #endif
226  pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
227  pevent->OSEventCnt = 0u;
228  OSEventFreeList = pevent; /* Get next free event control block */
230  if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
231  OS_Sched(); /* Find highest priority task ready to run */
232  }
233  *perr = OS_ERR_NONE;
234  pevent_return = (OS_EVENT *)0; /* Semaphore has been deleted */
235  break;
236 
237  default:
239  *perr = OS_ERR_INVALID_OPT;
240  pevent_return = pevent;
241  break;
242  }
243  return (pevent_return);
244 }

函数调用图:

void OSSemPend ( OS_EVENT pevent,
INT32U  timeout,
INT8U perr 
)

在文件 os_sem.c280 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEND_ABORT, OS_ERR_PEND_ISR, OS_ERR_PEND_LOCKED, OS_ERR_PEVENT_NULL, OS_ERR_TIMEOUT, OS_EVENT_TYPE_SEM, OS_EventTaskRemove(), OS_EventTaskWait(), OS_EXIT_CRITICAL, OS_Sched(), OS_STAT_PEND_ABORT, OS_STAT_PEND_OK, OS_STAT_PEND_TO, OS_STAT_RDY, OS_STAT_SEM, OS_EVENT::OSEventCnt, OS_EVENT::OSEventType, OSIntNesting, OSLockNesting, OSTCBCur, OS_TCB::OSTCBDly, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr, OS_TCB::OSTCBStat , 以及 OS_TCB::OSTCBStatPend.

参考自 OSTmr_Task().

283 {
284 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
285  OS_CPU_SR cpu_sr = 0u;
286 #endif
287 
288 
289 
290 #if OS_ARG_CHK_EN > 0u
291  if (perr == (INT8U *)0) { /* Validate 'perr' */
292  return;
293  }
294  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
295  *perr = OS_ERR_PEVENT_NULL;
296  return;
297  }
298 #endif
299  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
300  *perr = OS_ERR_EVENT_TYPE;
301  return;
302  }
303  if (OSIntNesting > 0u) { /* See if called from ISR ... */
304  *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
305  return;
306  }
307  if (OSLockNesting > 0u) { /* See if called with scheduler locked ... */
308  *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
309  return;
310  }
312  if (pevent->OSEventCnt > 0u) { /* If sem. is positive, resource available ... */
313  pevent->OSEventCnt--; /* ... decrement semaphore only if positive. */
315  *perr = OS_ERR_NONE;
316  return;
317  }
318  /* Otherwise, must wait until event occurs */
319  OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore */
321  OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
322  OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
324  OS_Sched(); /* Find next highest priority task ready */
326  switch (OSTCBCur->OSTCBStatPend) { /* See if we timed-out or aborted */
327  case OS_STAT_PEND_OK:
328  *perr = OS_ERR_NONE;
329  break;
330 
331  case OS_STAT_PEND_ABORT:
332  *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted */
333  break;
334 
335  case OS_STAT_PEND_TO:
336  default:
337  OS_EventTaskRemove(OSTCBCur, pevent);
338  *perr = OS_ERR_TIMEOUT; /* Indicate that we didn't get event within TO */
339  break;
340  }
341  OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set task status to ready */
342  OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status */
343  OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* Clear event pointers */
344 #if (OS_EVENT_MULTI_EN > 0u)
346 #endif
348 }

函数调用图:

这是这个函数的调用关系图:

INT8U OSSemPendAbort ( OS_EVENT pevent,
INT8U  opt,
INT8U perr 
)

在文件 os_sem.c385 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEND_ABORT, OS_ERR_PEVENT_NULL, OS_EVENT_TYPE_SEM, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_PEND_OPT_BROADCAST, OS_PEND_OPT_NONE, OS_Sched(), OS_STAT_PEND_ABORT, OS_STAT_SEM, OS_EVENT::OSEventGrp , 以及 OS_EVENT::OSEventType.

388 {
389  INT8U nbr_tasks;
390 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
391  OS_CPU_SR cpu_sr = 0u;
392 #endif
393 
394 
395 
396 #if OS_ARG_CHK_EN > 0u
397  if (perr == (INT8U *)0) { /* Validate 'perr' */
398  return (0u);
399  }
400  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
401  *perr = OS_ERR_PEVENT_NULL;
402  return (0u);
403  }
404 #endif
405  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
406  *perr = OS_ERR_EVENT_TYPE;
407  return (0u);
408  }
410  if (pevent->OSEventGrp != 0u) { /* See if any task waiting on semaphore? */
411  nbr_tasks = 0u;
412  switch (opt) {
413  case OS_PEND_OPT_BROADCAST: /* Do we need to abort ALL waiting tasks? */
414  while (pevent->OSEventGrp != 0u) { /* Yes, ready ALL tasks waiting on semaphore */
415  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_ABORT);
416  nbr_tasks++;
417  }
418  break;
419 
420  case OS_PEND_OPT_NONE:
421  default: /* No, ready HPT waiting on semaphore */
422  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_ABORT);
423  nbr_tasks++;
424  break;
425  }
427  OS_Sched(); /* Find HPT ready to run */
428  *perr = OS_ERR_PEND_ABORT;
429  return (nbr_tasks);
430  }
432  *perr = OS_ERR_NONE;
433  return (0); /* No tasks waiting on semaphore */
434 }

函数调用图:

INT8U OSSemPost ( OS_EVENT pevent)

在文件 os_sem.c456 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_SEM_OVF, OS_EVENT_TYPE_SEM, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_Sched(), OS_STAT_PEND_OK, OS_STAT_SEM, OS_EVENT::OSEventCnt, OS_EVENT::OSEventGrp , 以及 OS_EVENT::OSEventType.

参考自 OSTmrSignal().

457 {
458 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
459  OS_CPU_SR cpu_sr = 0u;
460 #endif
461 
462 
463 
464 #if OS_ARG_CHK_EN > 0u
465  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
466  return (OS_ERR_PEVENT_NULL);
467  }
468 #endif
469  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
470  return (OS_ERR_EVENT_TYPE);
471  }
473  if (pevent->OSEventGrp != 0u) { /* See if any task waiting for semaphore */
474  /* Ready HPT waiting on event */
475  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);
477  OS_Sched(); /* Find HPT ready to run */
478  return (OS_ERR_NONE);
479  }
480  if (pevent->OSEventCnt < 65535u) { /* Make sure semaphore will not overflow */
481  pevent->OSEventCnt++; /* Increment semaphore count to register event */
483  return (OS_ERR_NONE);
484  }
485  OS_EXIT_CRITICAL(); /* Semaphore value has reached its maximum */
486  return (OS_ERR_SEM_OVF);
487 }

函数调用图:

这是这个函数的调用关系图:

INT8U OSSemQuery ( OS_EVENT pevent,
OS_SEM_DATA p_sem_data 
)

在文件 os_sem.c510 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PDATA_NULL, OS_ERR_PEVENT_NULL, OS_EVENT_TBL_SIZE, OS_EVENT_TYPE_SEM, OS_EXIT_CRITICAL, OS_SEM_DATA::OSCnt, OS_EVENT::OSEventCnt, OS_EVENT::OSEventGrp, OS_SEM_DATA::OSEventGrp, OS_EVENT::OSEventTbl, OS_SEM_DATA::OSEventTbl , 以及 OS_EVENT::OSEventType.

512 {
513 #if OS_LOWEST_PRIO <= 63u
514  INT8U *psrc;
515  INT8U *pdest;
516 #else
517  INT16U *psrc;
518  INT16U *pdest;
519 #endif
520  INT8U i;
521 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
522  OS_CPU_SR cpu_sr = 0u;
523 #endif
524 
525 
526 
527 #if OS_ARG_CHK_EN > 0u
528  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
529  return (OS_ERR_PEVENT_NULL);
530  }
531  if (p_sem_data == (OS_SEM_DATA *)0) { /* Validate 'p_sem_data' */
532  return (OS_ERR_PDATA_NULL);
533  }
534 #endif
535  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
536  return (OS_ERR_EVENT_TYPE);
537  }
539  p_sem_data->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
540  psrc = &pevent->OSEventTbl[0];
541  pdest = &p_sem_data->OSEventTbl[0];
542  for (i = 0u; i < OS_EVENT_TBL_SIZE; i++) {
543  *pdest++ = *psrc++;
544  }
545  p_sem_data->OSCnt = pevent->OSEventCnt; /* Get semaphore count */
547  return (OS_ERR_NONE);
548 }
void OSSemSet ( OS_EVENT pevent,
INT16U  cnt,
INT8U perr 
)

在文件 os_sem.c577 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_TASK_WAITING, OS_EVENT_TYPE_SEM, OS_EXIT_CRITICAL, OS_EVENT::OSEventCnt, OS_EVENT::OSEventGrp , 以及 OS_EVENT::OSEventType.

580 {
581 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
582  OS_CPU_SR cpu_sr = 0u;
583 #endif
584 
585 
586 
587 #if OS_ARG_CHK_EN > 0u
588  if (perr == (INT8U *)0) { /* Validate 'perr' */
589  return;
590  }
591  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
592  *perr = OS_ERR_PEVENT_NULL;
593  return;
594  }
595 #endif
596  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
597  *perr = OS_ERR_EVENT_TYPE;
598  return;
599  }
601  *perr = OS_ERR_NONE;
602  if (pevent->OSEventCnt > 0u) { /* See if semaphore already has a count */
603  pevent->OSEventCnt = cnt; /* Yes, set it to the new value specified. */
604  } else { /* No */
605  if (pevent->OSEventGrp == 0u) { /* See if task(s) waiting? */
606  pevent->OSEventCnt = cnt; /* No, OK to set the value */
607  } else {
608  *perr = OS_ERR_TASK_WAITING;
609  }
610  }
612 }