📄 os_mbox.src
字号:
; OS_Sched(); /* Find highest priority task ready to run */
; }
; *err = OS_NO_ERR;
; return ((OS_EVENT *)0); /* Mailbox has been deleted */
;
; default:
; OS_EXIT_CRITICAL();
; *err = OS_ERR_INVALID_OPT;
; return (pevent);
; }
; }
; #endif
;
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * PEND ON MAILBOX FOR A MESSAGE
; *
; * Description: This function waits for a message to be sent to a mailbox
; *
; * Arguments : pevent is a pointer to the event control block associated with the desired mailbox
; *
; * timeout is an optional timeout period (in clock ticks). If non-zero, your task will
; * wait for a message to arrive at the mailbox up to the amount of time
; * specified by this argument. If you specify 0, however, your task will wait
; * forever at the specified mailbox or, until a message arrives.
; *
; * err is a pointer to where an error message will be deposited. Possible error
; * messages are:
; *
; * OS_NO_ERR The call was successful and your task received a
; * message.
; * OS_TIMEOUT A message was not received within the specified timeout
; * OS_ERR_EVENT_TYPE Invalid event type
; * OS_ERR_PEND_ISR If you called this function from an ISR and the result
; * would lead to a suspension.
; * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer
; *
; * Returns : != (void *)0 is a pointer to the message received
; * == (void *)0 if no message was received or,
; * if 'pevent' is a NULL pointer or,
; * if you didn't pass the proper pointer to the event control block.
; *********************************************************************************************************
; */
;
; void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)LG_REENTRANT
; {
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
; void *msg;
;
;
; if (OSIntNesting > 0) { /* See if called from ISR ... */
; *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
; return ((void *)0);
; }
; #if OS_ARG_CHK_EN > 0
; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
; *err = OS_ERR_PEVENT_NULL;
; return ((void *)0);
; }
; if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
; *err = OS_ERR_EVENT_TYPE;
; return ((void *)0);
; }
; #endif
; OS_ENTER_CRITICAL();
; msg = pevent->OSEventPtr;
; if (msg != (void *)0) { /* See if there is already a message */
; pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
; OS_EXIT_CRITICAL();
; *err = OS_NO_ERR;
; return (msg); /* Return the message received (or NULL) */
; }
; OSTCBCur->OSTCBStat |= OS_STAT_MBOX; /* Message not available, task will pend */
; OSTCBCur->OSTCBDly = timeout; /* Load timeout in TCB */
; OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
; OS_EXIT_CRITICAL();
; OS_Sched(); /* Find next highest priority task ready to run */
; OS_ENTER_CRITICAL();
; msg = OSTCBCur->OSTCBMsg;
; if (msg != (void *)0) { /* See if we were given the message */
; OSTCBCur->OSTCBMsg = (void *)0; /* Yes, clear message received */
; OSTCBCur->OSTCBStat = OS_STAT_RDY;
; OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
; OS_EXIT_CRITICAL();
; *err = OS_NO_ERR;
; return (msg); /* Return the message received */
; }
; OS_EventTO(pevent); /* Timed out, Make task ready */
; OS_EXIT_CRITICAL();
; *err = OS_TIMEOUT; /* Indicate that a timeout occured */
; return ((void *)0); /* Return a NULL message */
; }
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * POST MESSAGE TO A MAILBOX
; *
; * Description: This function sends a message to a mailbox
; *
; * Arguments : pevent is a pointer to the event control block associated with the desired mailbox
; *
; * msg is a pointer to the message to send. You MUST NOT send a NULL pointer.
; *
; * Returns : OS_NO_ERR The call was successful and the message was sent
; * OS_MBOX_FULL If the mailbox already contains a message. You can can only send one
; * message at a time and thus, the message MUST be consumed before you
; * are allowed to send another one.
; * OS_ERR_EVENT_TYPE If you are attempting to post to a non mailbox.
; * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer
; * OS_ERR_POST_NULL_PTR If you are attempting to post a NULL pointer
; *********************************************************************************************************
; */
;
; #if OS_MBOX_POST_EN > 0
; INT8U OSMboxPost (OS_EVENT *pevent, void *msg)LG_REENTRANT
; {
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
;
;
; #if OS_ARG_CHK_EN > 0
; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
; return (OS_ERR_PEVENT_NULL);
; }
; if (msg == (void *)0) { /* Make sure we are not posting a NULL pointer */
; return (OS_ERR_POST_NULL_PTR);
; }
; if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
; return (OS_ERR_EVENT_TYPE);
; }
; #endif
; OS_ENTER_CRITICAL();
; if (pevent->OSEventGrp != 0x00) { /* See if any task pending on mailbox */
; OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX); /* Ready highest priority task waiting on event */
; OS_EXIT_CRITICAL();
; OS_Sched(); /* Find highest priority task ready to run */
; return (OS_NO_ERR);
; }
; if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn't already have a msg */
; OS_EXIT_CRITICAL();
; return (OS_MBOX_FULL);
; }
; pevent->OSEventPtr = msg; /* Place message in mailbox */
; OS_EXIT_CRITICAL();
; return (OS_NO_ERR);
; }
; #endif
;
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * POST MESSAGE TO A MAILBOX
; *
; * Description: This function sends a message to a mailbox
; *
; * Arguments : pevent is a pointer to the event control block associated with the desired mailbox
; *
; * msg is a pointer to the message to send. You MUST NOT send a NULL pointer.
; *
; * opt determines the type of POST performed:
; * OS_POST_OPT_NONE POST to a single waiting task
; * (Identical to OSMboxPost())
; * OS_POST_OPT_BROADCAST POST to ALL tasks that are waiting on the mailbox
; *
; * Returns : OS_NO_ERR The call was successful and the message was sent
; * OS_MBOX_FULL If the mailbox already contains a message. You can can only send one
; * message at a time and thus, the message MUST be consumed before you
; * are allowed to send another one.
; * OS_ERR_EVENT_TYPE If you are attempting to post to a non mailbox.
; * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer
; * OS_ERR_POST_NULL_PTR If you are attempting to post a NULL pointer
; *
; * Warning : Interrupts can be disabled for a long time if you do a 'broadcast'. In fact, the
; * interrupt disable time is proportional to the number of tasks waiting on the mailbox.
; *********************************************************************************************************
; */
;
; #if OS_MBOX_POST_OPT_EN > 0
; INT8U OSMboxPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)LG_REENTRANT
; {
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
;
;
; #if OS_ARG_CHK_EN > 0
; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
; return (OS_ERR_PEVENT_NULL);
; }
; if (msg == (void *)0) { /* Make sure we are not posting a NULL pointer */
; return (OS_ERR_POST_NULL_PTR);
; }
; if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
; return (OS_ERR_EVENT_TYPE);
; }
; #endif
; OS_ENTER_CRITICAL();
; if (pevent->OSEventGrp != 0x00) { /* See if any task pending on mailbox */
; if ((opt & OS_POST_OPT_BROADCAST) != 0x00) { /* Do we need to post msg to ALL waiting tasks ? */
; while (pevent->OSEventGrp != 0x00) { /* Yes, Post to ALL tasks waiting on mailbox */
; OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX);
; }
; } else {
; OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX); /* No, Post to HPT waiting on mbox */
; }
; OS_EXIT_CRITICAL();
; OS_Sched(); /* Find highest priority task ready to run */
; return (OS_NO_ERR);
; }
; if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn't already have a msg */
; OS_EXIT_CRITICAL();
; return (OS_MBOX_FULL);
; }
; pevent->OSEventPtr = msg; /* Place message in mailbox */
; OS_EXIT_CRITICAL();
; return (OS_NO_ERR);
; }
; #endif
;
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * QUERY A MESSAGE MAILBOX
; *
; * Description: This function obtains information about a message mailbox.
; *
; * Arguments : pevent is a pointer to the event control block associated with the desired mailbox
; *
; * pdata is a pointer to a structure that will contain information about the message
; * mailbox.
; *
; * Returns : OS_NO_ERR The call was successful and the message was sent
; * OS_ERR_EVENT_TYPE If you are attempting to obtain data from a non mailbox.
; * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer
; *********************************************************************************************************
; */
;
; #if OS_MBOX_QUERY_EN > 0
; INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *os_pdata)LG_REENTRANT
; {
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
; INT8U *psrc;
; INT8U *pdest;
;
;
; #if OS_ARG_CHK_EN > 0
; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
; return (OS_ERR_PEVENT_NULL);
; }
; if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
; return (OS_ERR_EVENT_TYPE);
; }
; #endif
; OS_ENTER_CRITICAL();
; os_pdata->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
; psrc = &pevent->OSEventTbl[0];
; pdest = &os_pdata->OSEventTbl[0];
;
; #if OS_EVENT_TBL_SIZE > 0
; *pdest++ = *psrc++;
; #endif
;
; #if OS_EVENT_TBL_SIZE > 1
; *pdest++ = *psrc++;
; #endif
;
; #if OS_EVENT_TBL_SIZE > 2
; *pdest++ = *psrc++;
; #endif
;
; #if OS_EVENT_TBL_SIZE > 3
; *pdest++ = *psrc++;
; #endif
;
; #if OS_EVENT_TBL_SIZE > 4
; *pdest++ = *psrc++;
; #endif
;
; #if OS_EVENT_TBL_SIZE > 5
; *pdest++ = *psrc++;
; #endif
;
; #if OS_EVENT_TBL_SIZE > 6
; *pdest++ = *psrc++;
; #endif
;
; #if OS_EVENT_TBL_SIZE > 7
; *pdest = *psrc;
; #endif
; os_pdata->OSMsg = pevent->OSEventPtr; /* Get message from mailbox */
; OS_EXIT_CRITICAL();
; return (OS_NO_ERR);
; }
; #endif /* OS_MBOX_QUERY_EN */
; #endif /* OS_MBOX_EN */
; *** sync lost ***
; *** sync lost ***
; *** sync lost ***
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -