📄 os_mbox.c
字号:
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 > 0INT8U OSMboxPost (OS_EVENT *pevent, void *msg){#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 > 0INT8U OSMboxPostOpt (OS_EVENT *pevent, void *msg, INT8U opt){#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 > 0INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *pdata){#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(); pdata->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */ psrc = &pevent->OSEventTbl[0]; pdest = &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 pdata->OSMsg = pevent->OSEventPtr; /* Get message from mailbox */ OS_EXIT_CRITICAL(); return (OS_NO_ERR);}#endif /* OS_MBOX_QUERY_EN */#endif /* OS_MBOX_EN */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -