void OSQPost (OS_Q *p_q, void *p_void, OS_MSG_SIZE msg_size, OS_OPT opt, OS_ERR *p_err) { CPU_TS ts; #ifdef OS_SAFETY_CRITICAL if (p_err == (OS_ERR *)0) { OS_SAFETY_CRITICAL_EXCEPTION(); return; } #endif #if OS_CFG_ARG_CHK_EN > 0u if (p_q == (OS_Q *)0) { /* Validate arguments */ *p_err = OS_ERR_OBJ_PTR_NULL; return; } #endif #if OS_CFG_OBJ_TYPE_CHK_EN > 0u if (p_q->Type != OS_OBJ_TYPE_Q) { /* Make sure message queue was created */ *p_err = OS_ERR_OBJ_TYPE; return; } #endif ts = OS_TS_GET(); /* Get timestamp */ #if OS_CFG_ISR_POST_DEFERRED_EN > 0u if (OSIntNestingCtr > (OS_NESTING_CTR)0) { OS_IntQPost((OS_OBJ_TYPE)OS_OBJ_TYPE_Q, /* Post to ISR queue */ (void *)p_q, (void *)p_void, (OS_MSG_SIZE)msg_size, (OS_FLAGS )0, (OS_OPT )opt, (CPU_TS )ts, (OS_ERR *)p_err); return; } #endif OS_QPost(p_q, p_void, msg_size, opt, ts, p_err); }
void OS_IntQRePost (void) { #if (OS_CFG_TMR_EN == DEF_ENABLED) CPU_TS ts; #endif OS_ERR err; switch (OSIntQOutPtr->Type) { /* Re-post to task */ case OS_OBJ_TYPE_FLAG: #if (OS_CFG_FLAG_EN == DEF_ENABLED) (void)OS_FlagPost((OS_FLAG_GRP *) OSIntQOutPtr->ObjPtr, OSIntQOutPtr->Flags, OSIntQOutPtr->Opt, #if (OS_CFG_TS_EN == DEF_ENABLED) OSIntQOutPtr->TS, #else 0u, #endif &err); #endif break; case OS_OBJ_TYPE_Q: #if (OS_CFG_Q_EN == DEF_ENABLED) OS_QPost((OS_Q *) OSIntQOutPtr->ObjPtr, OSIntQOutPtr->MsgPtr, OSIntQOutPtr->MsgSize, OSIntQOutPtr->Opt, #if (OS_CFG_TS_EN == DEF_ENABLED) OSIntQOutPtr->TS, #else 0u, #endif &err); #endif break; case OS_OBJ_TYPE_SEM: #if (OS_CFG_SEM_EN == DEF_ENABLED) (void)OS_SemPost((OS_SEM *) OSIntQOutPtr->ObjPtr, OSIntQOutPtr->Opt, #if (OS_CFG_TS_EN == DEF_ENABLED) OSIntQOutPtr->TS, #else 0u, #endif &err); #endif break; case OS_OBJ_TYPE_TASK_MSG: #if (OS_CFG_TASK_Q_EN == DEF_ENABLED) OS_TaskQPost((OS_TCB *) OSIntQOutPtr->ObjPtr, (void *) OSIntQOutPtr->MsgPtr, OSIntQOutPtr->MsgSize, OSIntQOutPtr->Opt, #if (OS_CFG_TS_EN == DEF_ENABLED) OSIntQOutPtr->TS, #else 0u, #endif &err); #endif break; case OS_OBJ_TYPE_TASK_RESUME: #if (OS_CFG_TASK_SUSPEND_EN == DEF_ENABLED) (void)OS_TaskResume((OS_TCB *) OSIntQOutPtr->ObjPtr, &err); #endif break; case OS_OBJ_TYPE_TASK_SIGNAL: (void)OS_TaskSemPost((OS_TCB *) OSIntQOutPtr->ObjPtr, OSIntQOutPtr->Opt, #if (OS_CFG_TS_EN == DEF_ENABLED) OSIntQOutPtr->TS, #else 0u, #endif &err); break; case OS_OBJ_TYPE_TASK_SUSPEND: #if (OS_CFG_TASK_SUSPEND_EN == DEF_ENABLED) (void)OS_TaskSuspend((OS_TCB *) OSIntQOutPtr->ObjPtr, &err); #endif break; case OS_OBJ_TYPE_TICK: #if (OS_CFG_TASK_TICK_EN == DEF_ENABLED) #if (OS_CFG_SCHED_ROUND_ROBIN_EN == DEF_ENABLED) OS_SchedRoundRobin(&OSRdyList[OSPrioSaved]); #endif (void)OS_TaskSemPost((OS_TCB *)&OSTickTaskTCB, /* Signal tick task */ OS_OPT_POST_NONE, #if (OS_CFG_TS_EN == DEF_ENABLED) OSIntQOutPtr->TS, #else 0u, #endif &err); #endif #if (OS_CFG_TMR_EN == DEF_ENABLED) OSTmrUpdateCtr--; if (OSTmrUpdateCtr == 0u) { OSTmrUpdateCtr = OSTmrUpdateCnt; #if (OS_CFG_TS_EN == DEF_ENABLED) ts = OS_TS_GET(); /* Get timestamp */ #else ts = 0u; #endif (void)OS_TaskSemPost(&OSTmrTaskTCB, /* Signal timer task */ OS_OPT_POST_NONE, ts, &err); } #endif break; default: break; } }
void OSQPost (OS_Q *p_q, void *p_void, OS_MSG_SIZE msg_size, OS_OPT opt, OS_ERR *p_err) { CPU_TS ts; #ifdef OS_SAFETY_CRITICAL if (p_err == (OS_ERR *)0) { #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u)) TRACE_OS_Q_POST_FAILED(p_q); /* Record the event. */ #endif OS_SAFETY_CRITICAL_EXCEPTION(); return; } #endif #if OS_CFG_ARG_CHK_EN > 0u if (p_q == (OS_Q *)0) { /* Validate 'p_q' */ #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u)) TRACE_OS_Q_POST_FAILED(p_q); /* Record the event. */ #endif *p_err = OS_ERR_OBJ_PTR_NULL; return; } switch (opt) { /* Validate 'opt' */ case OS_OPT_POST_FIFO: case OS_OPT_POST_LIFO: case OS_OPT_POST_FIFO | OS_OPT_POST_ALL: case OS_OPT_POST_LIFO | OS_OPT_POST_ALL: case OS_OPT_POST_FIFO | OS_OPT_POST_NO_SCHED: case OS_OPT_POST_LIFO | OS_OPT_POST_NO_SCHED: case OS_OPT_POST_FIFO | OS_OPT_POST_ALL | OS_OPT_POST_NO_SCHED: case OS_OPT_POST_LIFO | OS_OPT_POST_ALL | OS_OPT_POST_NO_SCHED: break; default: #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u)) TRACE_OS_Q_POST_FAILED(p_q); /* Record the event. */ #endif *p_err = OS_ERR_OPT_INVALID; return; } #endif #if OS_CFG_OBJ_TYPE_CHK_EN > 0u if (p_q->Type != OS_OBJ_TYPE_Q) { /* Make sure message queue was created */ #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u)) TRACE_OS_Q_POST_FAILED(p_q); /* Record the event. */ #endif *p_err = OS_ERR_OBJ_TYPE; return; } #endif ts = OS_TS_GET(); /* Get timestamp */ #if OS_CFG_ISR_POST_DEFERRED_EN > 0u if (OSIntNestingCtr > (OS_NESTING_CTR)0) { OS_IntQPost((OS_OBJ_TYPE)OS_OBJ_TYPE_Q, /* Post to ISR queue */ (void *)p_q, (void *)p_void, (OS_MSG_SIZE)msg_size, (OS_FLAGS )0, (OS_OPT )opt, (CPU_TS )ts, (OS_ERR *)p_err); return; } #endif #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u)) TRACE_OS_Q_POST(p_q); /* Record the event. */ #endif OS_QPost(p_q, p_void, msg_size, opt, ts, p_err); }
void OS_IntQRePost (void) { CPU_TS ts; OS_ERR err; switch (OSIntQOutPtr->Type) { /* Re-post to task */ case OS_OBJ_TYPE_FLAG: #if OS_CFG_FLAG_EN > 0u (void)OS_FlagPost((OS_FLAG_GRP *) OSIntQOutPtr->ObjPtr, (OS_FLAGS ) OSIntQOutPtr->Flags, (OS_OPT ) OSIntQOutPtr->Opt, (CPU_TS ) OSIntQOutPtr->TS, (OS_ERR *)&err); #endif break; case OS_OBJ_TYPE_Q: #if OS_CFG_Q_EN > 0u OS_QPost((OS_Q *) OSIntQOutPtr->ObjPtr, (void *) OSIntQOutPtr->MsgPtr, (OS_MSG_SIZE) OSIntQOutPtr->MsgSize, (OS_OPT ) OSIntQOutPtr->Opt, (CPU_TS ) OSIntQOutPtr->TS, (OS_ERR *)&err); #endif break; case OS_OBJ_TYPE_SEM: #if OS_CFG_SEM_EN > 0u (void)OS_SemPost((OS_SEM *) OSIntQOutPtr->ObjPtr, (OS_OPT ) OSIntQOutPtr->Opt, (CPU_TS ) OSIntQOutPtr->TS, (OS_ERR *)&err); #endif break; case OS_OBJ_TYPE_TASK_MSG: #if OS_CFG_TASK_Q_EN > 0u OS_TaskQPost((OS_TCB *) OSIntQOutPtr->ObjPtr, (void *) OSIntQOutPtr->MsgPtr, (OS_MSG_SIZE) OSIntQOutPtr->MsgSize, (OS_OPT ) OSIntQOutPtr->Opt, (CPU_TS ) OSIntQOutPtr->TS, (OS_ERR *)&err); #endif break; case OS_OBJ_TYPE_TASK_RESUME: #if OS_CFG_TASK_SUSPEND_EN > 0u (void)OS_TaskResume((OS_TCB *) OSIntQOutPtr->ObjPtr, (OS_ERR *)&err); #endif break; case OS_OBJ_TYPE_TASK_SIGNAL: (void)OS_TaskSemPost((OS_TCB *) OSIntQOutPtr->ObjPtr, (OS_OPT ) OSIntQOutPtr->Opt, (CPU_TS ) OSIntQOutPtr->TS, (OS_ERR *)&err); break; case OS_OBJ_TYPE_TASK_SUSPEND: #if OS_CFG_TASK_SUSPEND_EN > 0u (void)OS_TaskSuspend((OS_TCB *) OSIntQOutPtr->ObjPtr, (OS_ERR *)&err); #endif break; case OS_OBJ_TYPE_TICK: #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u OS_SchedRoundRobin(&OSRdyList[OSPrioSaved]); #endif (void)OS_TaskSemPost((OS_TCB *)&OSTickTaskTCB, /* Signal tick task */ (OS_OPT ) OS_OPT_POST_NONE, (CPU_TS ) OSIntQOutPtr->TS, (OS_ERR *)&err); #if OS_CFG_TMR_EN > 0u OSTmrUpdateCtr--; if (OSTmrUpdateCtr == (OS_CTR)0u) { OSTmrUpdateCtr = OSTmrUpdateCnt; ts = OS_TS_GET(); /* Get timestamp */ (void)OS_TaskSemPost((OS_TCB *)&OSTmrTaskTCB, /* Signal timer task */ (OS_OPT ) OS_OPT_POST_NONE, (CPU_TS ) ts, (OS_ERR *)&err); } #endif break; default: break; } }