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

浏览源代码.

函数

void * OSMboxAccept (OS_EVENT *pevent)
 
OS_EVENTOSMboxCreate (void *pmsg)
 
OS_EVENTOSMboxDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
 
void * OSMboxPend (OS_EVENT *pevent, INT32U timeout, INT8U *perr)
 
INT8U OSMboxPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
 
INT8U OSMboxPost (OS_EVENT *pevent, void *pmsg)
 
INT8U OSMboxPostOpt (OS_EVENT *pevent, void *pmsg, INT8U opt)
 
INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *p_mbox_data)
 

函数说明

void* OSMboxAccept ( OS_EVENT pevent)

在文件 os_mbox.c47 行定义.

参考 OS_ENTER_CRITICAL, OS_EVENT_TYPE_MBOX, OS_EXIT_CRITICAL, OS_EVENT::OSEventPtr , 以及 OS_EVENT::OSEventType.

48 {
49  void *pmsg;
50 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
51  OS_CPU_SR cpu_sr = 0u;
52 #endif
53 
54 
55 
56 #if OS_ARG_CHK_EN > 0u
57  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
58  return ((void *)0);
59  }
60 #endif
61  if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
62  return ((void *)0);
63  }
65  pmsg = pevent->OSEventPtr;
66  pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
68  return (pmsg); /* Return the message received (or NULL) */
69 }
OS_EVENT* OSMboxCreate ( void *  pmsg)

在文件 os_mbox.c88 行定义.

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

参考自 App_EventCreate().

89 {
90  OS_EVENT *pevent;
91 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
92  OS_CPU_SR cpu_sr = 0u;
93 #endif
94 
95 
96 
97  if (OSIntNesting > 0u) { /* See if called from ISR ... */
98  return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
99  }
101  pevent = OSEventFreeList; /* Get next free event control block */
102  if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
104  }
106  if (pevent != (OS_EVENT *)0) {
108  pevent->OSEventCnt = 0u;
109  pevent->OSEventPtr = pmsg; /* Deposit message in event control block */
110 #if OS_EVENT_NAME_EN > 0u
111  pevent->OSEventName = (INT8U *)"?";
112 #endif
113  OS_EventWaitListInit(pevent);
114  }
115  return (pevent); /* Return pointer to event control block */
116 }

函数调用图:

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

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

在文件 os_mbox.c155 行定义.

参考 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_MBOX, OS_EVENT_TYPE_UNUSED, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_FALSE, OS_Sched(), OS_STAT_MBOX, OS_STAT_PEND_OK, OS_TRUE, OS_EVENT::OSEventCnt, OSEventFreeList, OS_EVENT::OSEventGrp, OS_EVENT::OSEventName, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType , 以及 OSIntNesting.

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

函数调用图:

void* OSMboxPend ( OS_EVENT pevent,
INT32U  timeout,
INT8U perr 
)

在文件 os_mbox.c273 行定义.

参考 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_MBOX, OS_EventTaskRemove(), OS_EventTaskWait(), OS_EXIT_CRITICAL, OS_Sched(), OS_STAT_MBOX, OS_STAT_PEND_ABORT, OS_STAT_PEND_OK, OS_STAT_PEND_TO, OS_STAT_RDY, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OSIntNesting, OSLockNesting, OSTCBCur, OS_TCB::OSTCBDly, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr, OS_TCB::OSTCBMsg, OS_TCB::OSTCBStat , 以及 OS_TCB::OSTCBStatPend.

参考自 App_TaskUserIF().

276 {
277  void *pmsg;
278 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
279  OS_CPU_SR cpu_sr = 0u;
280 #endif
281 
282 
283 
284 #if OS_ARG_CHK_EN > 0u
285  if (perr == (INT8U *)0) { /* Validate 'perr' */
286  return ((void *)0);
287  }
288  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
289  *perr = OS_ERR_PEVENT_NULL;
290  return ((void *)0);
291  }
292 #endif
293  if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
294  *perr = OS_ERR_EVENT_TYPE;
295  return ((void *)0);
296  }
297  if (OSIntNesting > 0u) { /* See if called from ISR ... */
298  *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
299  return ((void *)0);
300  }
301  if (OSLockNesting > 0u) { /* See if called with scheduler locked ... */
302  *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
303  return ((void *)0);
304  }
306  pmsg = pevent->OSEventPtr;
307  if (pmsg != (void *)0) { /* See if there is already a message */
308  pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
310  *perr = OS_ERR_NONE;
311  return (pmsg); /* Return the message received (or NULL) */
312  }
313  OSTCBCur->OSTCBStat |= OS_STAT_MBOX; /* Message not available, task will pend */
315  OSTCBCur->OSTCBDly = timeout; /* Load timeout in TCB */
316  OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
318  OS_Sched(); /* Find next highest priority task ready to run */
320  switch (OSTCBCur->OSTCBStatPend) { /* See if we timed-out or aborted */
321  case OS_STAT_PEND_OK:
322  pmsg = OSTCBCur->OSTCBMsg;
323  *perr = OS_ERR_NONE;
324  break;
325 
326  case OS_STAT_PEND_ABORT:
327  pmsg = (void *)0;
328  *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted */
329  break;
330 
331  case OS_STAT_PEND_TO:
332  default:
333  OS_EventTaskRemove(OSTCBCur, pevent);
334  pmsg = (void *)0;
335  *perr = OS_ERR_TIMEOUT; /* Indicate that we didn't get event within TO */
336  break;
337  }
338  OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set task status to ready */
339  OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status */
340  OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* Clear event pointers */
341 #if (OS_EVENT_MULTI_EN > 0u)
343 #endif
344  OSTCBCur->OSTCBMsg = (void *)0; /* Clear received message */
346  return (pmsg); /* Return received message */
347 }

函数调用图:

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

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

在文件 os_mbox.c382 行定义.

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

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

函数调用图:

INT8U OSMboxPost ( OS_EVENT pevent,
void *  pmsg 
)

在文件 os_mbox.c458 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_MBOX_FULL, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_POST_NULL_PTR, OS_EVENT_TYPE_MBOX, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_Sched(), OS_STAT_MBOX, OS_STAT_PEND_OK, OS_EVENT::OSEventGrp, OS_EVENT::OSEventPtr , 以及 OS_EVENT::OSEventType.

参考自 App_TaskKbd().

460 {
461 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
462  OS_CPU_SR cpu_sr = 0u;
463 #endif
464 
465 
466 
467 #if OS_ARG_CHK_EN > 0u
468  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
469  return (OS_ERR_PEVENT_NULL);
470  }
471  if (pmsg == (void *)0) { /* Make sure we are not posting a NULL pointer */
472  return (OS_ERR_POST_NULL_PTR);
473  }
474 #endif
475  if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
476  return (OS_ERR_EVENT_TYPE);
477  }
479  if (pevent->OSEventGrp != 0u) { /* See if any task pending on mailbox */
480  /* Ready HPT waiting on event */
481  (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
483  OS_Sched(); /* Find highest priority task ready to run */
484  return (OS_ERR_NONE);
485  }
486  if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn't already have a msg */
488  return (OS_ERR_MBOX_FULL);
489  }
490  pevent->OSEventPtr = pmsg; /* Place message in mailbox */
492  return (OS_ERR_NONE);
493 }

函数调用图:

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

INT8U OSMboxPostOpt ( OS_EVENT pevent,
void *  pmsg,
INT8U  opt 
)

在文件 os_mbox.c530 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_MBOX_FULL, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_POST_NULL_PTR, OS_EVENT_TYPE_MBOX, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_POST_OPT_BROADCAST, OS_POST_OPT_NO_SCHED, OS_Sched(), OS_STAT_MBOX, OS_STAT_PEND_OK, OS_EVENT::OSEventGrp, OS_EVENT::OSEventPtr , 以及 OS_EVENT::OSEventType.

533 {
534 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
535  OS_CPU_SR cpu_sr = 0u;
536 #endif
537 
538 
539 
540 #if OS_ARG_CHK_EN > 0u
541  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
542  return (OS_ERR_PEVENT_NULL);
543  }
544  if (pmsg == (void *)0) { /* Make sure we are not posting a NULL pointer */
545  return (OS_ERR_POST_NULL_PTR);
546  }
547 #endif
548  if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
549  return (OS_ERR_EVENT_TYPE);
550  }
552  if (pevent->OSEventGrp != 0u) { /* See if any task pending on mailbox */
553  if ((opt & OS_POST_OPT_BROADCAST) != 0x00u) { /* Do we need to post msg to ALL waiting tasks ? */
554  while (pevent->OSEventGrp != 0u) { /* Yes, Post to ALL tasks waiting on mailbox */
555  (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
556  }
557  } else { /* No, Post to HPT waiting on mbox */
558  (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
559  }
561  if ((opt & OS_POST_OPT_NO_SCHED) == 0u) { /* See if scheduler needs to be invoked */
562  OS_Sched(); /* Find HPT ready to run */
563  }
564  return (OS_ERR_NONE);
565  }
566  if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn't already have a msg */
568  return (OS_ERR_MBOX_FULL);
569  }
570  pevent->OSEventPtr = pmsg; /* Place message in mailbox */
572  return (OS_ERR_NONE);
573 }

函数调用图:

INT8U OSMboxQuery ( OS_EVENT pevent,
OS_MBOX_DATA p_mbox_data 
)

在文件 os_mbox.c596 行定义.

参考 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_MBOX, OS_EXIT_CRITICAL, OS_EVENT::OSEventGrp, OS_MBOX_DATA::OSEventGrp, OS_EVENT::OSEventPtr, OS_EVENT::OSEventTbl, OS_MBOX_DATA::OSEventTbl, OS_EVENT::OSEventType , 以及 OS_MBOX_DATA::OSMsg.

598 {
599  INT8U i;
600 #if OS_LOWEST_PRIO <= 63u
601  INT8U *psrc;
602  INT8U *pdest;
603 #else
604  INT16U *psrc;
605  INT16U *pdest;
606 #endif
607 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
608  OS_CPU_SR cpu_sr = 0u;
609 #endif
610 
611 
612 
613 #if OS_ARG_CHK_EN > 0u
614  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
615  return (OS_ERR_PEVENT_NULL);
616  }
617  if (p_mbox_data == (OS_MBOX_DATA *)0) { /* Validate 'p_mbox_data' */
618  return (OS_ERR_PDATA_NULL);
619  }
620 #endif
621  if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
622  return (OS_ERR_EVENT_TYPE);
623  }
625  p_mbox_data->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
626  psrc = &pevent->OSEventTbl[0];
627  pdest = &p_mbox_data->OSEventTbl[0];
628  for (i = 0u; i < OS_EVENT_TBL_SIZE; i++) {
629  *pdest++ = *psrc++;
630  }
631  p_mbox_data->OSMsg = pevent->OSEventPtr; /* Get message from mailbox */
633  return (OS_ERR_NONE);
634 }