OS_EVENT *OSMboxCreate(void*pmsg){
OS_EVENT *pevent;#ifOS_CRITICAL_METHOD ==3u/* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr =0u;#endif#ifdefOS_SAFETY_CRITICAL_IEC61508if(OSSafetyCriticalStartFlag == OS_TRUE){OS_SAFETY_CRITICAL_EXCEPTION();return((OS_EVENT *)0);}#endifif(OSIntNesting >0u)/* See if called from ISR ... */{return((OS_EVENT *)0);/* ... can't CREATE from an ISR */}OS_ENTER_CRITICAL();
pevent = OSEventFreeList;/* Get next free event control block */if(OSEventFreeList !=(OS_EVENT *)0)/* See if pool of free ECB pool was empty */{
OSEventFreeList =(OS_EVENT *)OSEventFreeList->OSEventPtr;}OS_EXIT_CRITICAL();if(pevent !=(OS_EVENT *)0){
pevent->OSEventType = OS_EVENT_TYPE_MBOX;
pevent->OSEventCnt =0u;
pevent->OSEventPtr = pmsg;/* Deposit message in event control block */#ifOS_EVENT_NAME_EN >0u
pevent->OSEventName =(INT8U *)(void*)"?";#endifOS_EventWaitListInit(pevent);}return(pevent);/* Return pointer to event control block */}
消息邮箱删除
#ifOS_MBOX_DEL_EN >0u
OS_EVENT *OSMboxDel(OS_EVENT *pevent,
INT8U opt,
INT8U *perr){
BOOLEAN tasks_waiting;
OS_EVENT *pevent_return;#ifOS_CRITICAL_METHOD ==3u/* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr =0u;#endif#ifdefOS_SAFETY_CRITICALif(perr ==(INT8U *)0){OS_SAFETY_CRITICAL_EXCEPTION();return((OS_EVENT *)0);}#endif#ifOS_ARG_CHK_EN >0uif(pevent ==(OS_EVENT *)0)/* Validate 'pevent' */{*perr = OS_ERR_PEVENT_NULL;return(pevent);}#endifif(pevent->OSEventType != OS_EVENT_TYPE_MBOX)/* Validate event block type */{*perr = OS_ERR_EVENT_TYPE;return(pevent);}if(OSIntNesting >0u)/* See if called from ISR ... */{*perr = OS_ERR_DEL_ISR;/* ... can't DELETE from an ISR */return(pevent);}OS_ENTER_CRITICAL();if(pevent->OSEventGrp !=0u)/* See if any tasks waiting on mailbox */{
tasks_waiting = OS_TRUE;/* Yes */}else{
tasks_waiting = OS_FALSE;/* No */}switch(opt){case OS_DEL_NO_PEND:/* Delete mailbox only if no task waiting */if(tasks_waiting == OS_FALSE){#ifOS_EVENT_NAME_EN >0u
pevent->OSEventName =(INT8U *)(void*)"?";#endif
pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
pevent->OSEventPtr = OSEventFreeList;/* Return Event Control Block to free list */
pevent->OSEventCnt =0u;
OSEventFreeList = pevent;/* Get next free event control block */OS_EXIT_CRITICAL();*perr = OS_ERR_NONE;
pevent_return =(OS_EVENT *)0;/* Mailbox has been deleted */}else{OS_EXIT_CRITICAL();*perr = OS_ERR_TASK_WAITING;
pevent_return = pevent;}break;case OS_DEL_ALWAYS:/* Always delete the mailbox */while(pevent->OSEventGrp !=0u)/* Ready ALL tasks waiting for mailbox */{(void)OS_EventTaskRdy(pevent,(void*)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);}#ifOS_EVENT_NAME_EN >0u
pevent->OSEventName =(INT8U *)(void*)"?";#endif
pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
pevent->OSEventPtr = OSEventFreeList;/* Return Event Control Block to free list */
pevent->OSEventCnt =0u;
OSEventFreeList = pevent;/* Get next free event control block */OS_EXIT_CRITICAL();if(tasks_waiting == OS_TRUE)/* Reschedule only if task(s) were waiting */{OS_Sched();/* Find highest priority task ready to run */}*perr = OS_ERR_NONE;
pevent_return =(OS_EVENT *)0;/* Mailbox has been deleted */break;default:OS_EXIT_CRITICAL();*perr = OS_ERR_INVALID_OPT;
pevent_return = pevent;break;}return(pevent_return);}#endif
等待邮箱中的消息
void*OSMboxPend(OS_EVENT *pevent,
INT32U timeout,
INT8U *perr){void*pmsg;#ifOS_CRITICAL_METHOD ==3u/* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr =0u;#endif#ifdefOS_SAFETY_CRITICALif(perr ==(INT8U *)0){OS_SAFETY_CRITICAL_EXCEPTION();return((void*)0);}#endif#ifOS_ARG_CHK_EN >0uif(pevent ==(OS_EVENT *)0)/* Validate 'pevent' */{*perr = OS_ERR_PEVENT_NULL;return((void*)0);}#endifif(pevent->OSEventType != OS_EVENT_TYPE_MBOX)/* Validate event block type */{*perr = OS_ERR_EVENT_TYPE;return((void*)0);}if(OSIntNesting >0u)/* See if called from ISR ... */{*perr = OS_ERR_PEND_ISR;/* ... can't PEND from an ISR */return((void*)0);}if(OSLockNesting >0u)/* See if called with scheduler locked ... */{*perr = OS_ERR_PEND_LOCKED;/* ... can't PEND when locked */return((void*)0);}OS_ENTER_CRITICAL();
pmsg = pevent->OSEventPtr;if(pmsg !=(void*)0)/* See if there is already a message */{
pevent->OSEventPtr =(void*)0;/* Clear the mailbox */OS_EXIT_CRITICAL();*perr = OS_ERR_NONE;return(pmsg);/* Return the message received (or NULL) */}
OSTCBCur->OSTCBStat |= OS_STAT_MBOX;/* Message not available, task will pend */
OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
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();switch(OSTCBCur->OSTCBStatPend)/* See if we timed-out or aborted */{case OS_STAT_PEND_OK:
pmsg = OSTCBCur->OSTCBMsg;*perr = OS_ERR_NONE;break;case OS_STAT_PEND_ABORT:
pmsg =(void*)0;*perr = OS_ERR_PEND_ABORT;/* Indicate that we aborted */break;case OS_STAT_PEND_TO:default:OS_EventTaskRemove(OSTCBCur, pevent);
pmsg =(void*)0;*perr = OS_ERR_TIMEOUT;/* Indicate that we didn't get event within TO */break;}
OSTCBCur->OSTCBStat = OS_STAT_RDY;/* Set task status to ready */
OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;/* Clear pend status */
OSTCBCur->OSTCBEventPtr =(OS_EVENT *)0;/* Clear event pointers */#if(OS_EVENT_MULTI_EN >0u)
OSTCBCur->OSTCBEventMultiPtr =(OS_EVENT **)0;#endif
OSTCBCur->OSTCBMsg =(void*)0;/* Clear received message */OS_EXIT_CRITICAL();return(pmsg);/* Return received message */}
向邮箱发送一则消息
#ifOS_MBOX_POST_EN >0u
INT8U OSMboxPost(OS_EVENT *pevent,void*pmsg){#ifOS_CRITICAL_METHOD ==3u/* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr =0u;#endif#ifOS_ARG_CHK_EN >0uif(pevent ==(OS_EVENT *)0)/* Validate 'pevent' */{return(OS_ERR_PEVENT_NULL);}if(pmsg ==(void*)0)/* Make sure we are not posting a NULL pointer */{return(OS_ERR_POST_NULL_PTR);}#endifif(pevent->OSEventType != OS_EVENT_TYPE_MBOX)/* Validate event block type */{return(OS_ERR_EVENT_TYPE);}OS_ENTER_CRITICAL();if(pevent->OSEventGrp !=0u)/* See if any task pending on mailbox */{/* Ready HPT waiting on event */(void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);OS_EXIT_CRITICAL();OS_Sched();/* Find highest priority task ready to run */return(OS_ERR_NONE);}if(pevent->OSEventPtr !=(void*)0)/* Make sure mailbox doesn't already have a msg */{OS_EXIT_CRITICAL();return(OS_ERR_MBOX_FULL);}
pevent->OSEventPtr = pmsg;/* Place message in mailbox */OS_EXIT_CRITICAL();return(OS_ERR_NONE);}#endif
论文地址:[1907.00503] Modeling Tabular data using Conditional GAN (arxiv.org) 摘要 对表格数据中行的概率分布进行建模并生成真实的合成数据是一项非常重要的任务,有着许多挑战。本文设计了CTGAN,使用条件生成器解决挑战。为了帮助进行公…