本文整理汇总了C++中OS_TS_GET函数的典型用法代码示例。如果您正苦于以下问题:C++ OS_TS_GET函数的具体用法?C++ OS_TS_GET怎么用?C++ OS_TS_GET使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了OS_TS_GET函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: OS_TickListUpdateDly
static CPU_TS OS_TickListUpdateDly (void)
{
OS_TCB *p_tcb;
OS_TICK_LIST *p_list;
CPU_TS ts_start;
CPU_TS ts_delta_dly;
#if OS_CFG_DBG_EN > 0u
OS_OBJ_QTY nbr_updated;
#endif
CPU_SR_ALLOC();
OS_CRITICAL_ENTER();
ts_start = OS_TS_GET();
#if OS_CFG_DBG_EN > 0u
nbr_updated = (OS_OBJ_QTY)0u;
#endif
p_list = &OSTickListDly;
p_tcb = p_list->TCB_Ptr;
if (p_tcb != (OS_TCB *)0) {
p_tcb->TickRemain--;
while (p_tcb->TickRemain == 0u) {
#if OS_CFG_DBG_EN > 0u
nbr_updated++; /* Keep track of the number of TCBs updated */
#endif
if (p_tcb->TaskState == OS_TASK_STATE_DLY) {
p_tcb->TaskState = OS_TASK_STATE_RDY;
OS_RdyListInsert(p_tcb); /* Insert the task in the ready list */
} else if (p_tcb->TaskState == OS_TASK_STATE_DLY_SUSPENDED) {
p_tcb->TaskState = OS_TASK_STATE_SUSPENDED;
}
p_list->TCB_Ptr = p_tcb->TickNextPtr;
p_tcb = p_list->TCB_Ptr; /* Get 'p_tcb' again for loop */
if (p_tcb == (OS_TCB *)0) {
#if OS_CFG_DBG_EN > 0u
p_list->NbrEntries = (OS_OBJ_QTY)0u;
#endif
break;
} else {
#if OS_CFG_DBG_EN > 0u
p_list->NbrEntries--;
#endif
p_tcb->TickPrevPtr = (OS_TCB *)0;
}
}
}
#if OS_CFG_DBG_EN > 0u
p_list->NbrUpdated = nbr_updated;
#endif
ts_delta_dly = OS_TS_GET() - ts_start; /* Measure execution time of the update */
OS_CRITICAL_EXIT();
return (ts_delta_dly);
}
示例2: OS_TmrTask
void OS_TmrTask (void *p_arg)
{
OS_ERR err;
OS_TMR_CALLBACK_PTR p_fnct;
OS_TMR *p_tmr;
OS_TMR *p_tmr_next;
CPU_TS ts;
CPU_TS ts_start;
CPU_TS ts_delta;
(void)&p_arg; /* Not using 'p_arg', prevent compiler warning */
while (DEF_ON) {
(void)OSTaskSemPend((OS_TICK )0, /* Wait for signal indicating time to update tmrs */
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)&ts,
(OS_ERR *)&err);
OS_TmrLock();
ts_start = OS_TS_GET();
OSTmrTickCtr++; /* Increment the current time */
p_tmr = OSTmrListPtr;
while (p_tmr != (OS_TMR *)0) { /* Update all the timers in the list */
OSSchedLock(&err);
(void)&err;
p_tmr_next = p_tmr->NextPtr;
p_tmr->Remain--;
if (p_tmr->Remain == 0) {
if (p_tmr->Opt == OS_OPT_TMR_PERIODIC) {
p_tmr->Remain = p_tmr->Period; /* Reload the time remaining */
} else {
OS_TmrUnlink(p_tmr); /* Remove from list */
p_tmr->State = OS_TMR_STATE_COMPLETED; /* Indicate that the timer has completed */
}
p_fnct = p_tmr->CallbackPtr; /* Execute callback function if available */
if (p_fnct != (OS_TMR_CALLBACK_PTR)0) {
(*p_fnct)((void *)p_tmr,
p_tmr->CallbackPtrArg);
}
}
p_tmr = p_tmr_next;
OSSchedUnlock(&err);
(void)&err;
}
ts_delta = OS_TS_GET() - ts_start; /* Measure execution time of timer task */
if (OSTmrTaskTimeMax < ts_delta) {
OSTmrTaskTimeMax = ts_delta;
}
OS_TmrUnlock();
}
}
示例3: _cbOfTmr1
void _cbOfTmr1 (OS_TMR *p_tmr, void *p_arg)
{
(void)p_arg;
//获取延时之后的时间戳并减去延时之前的时间戳
ts_end = OS_TS_GET() - ts_start;
//打印出时间戳测试延时的长度,时间戳的计数频率是72M,由此推出下面的计算
printf("\r\n 定时1s,时间戳测试:%d us,即%d ms\r\n",ts_end/120,ts_end/120000);
//获取延时之前的时间戳
ts_start = OS_TS_GET();
}
示例4: App_Task_LED
/*
*********************************************************************************************************
* App_Task_LED()
*
* Description : This is an example of an application task.
*
* Argument(s) : p_arg is the argument passed to 'App_Task_KEY()' by 'OSTaskCreate()'.
*
* Return(s) : none.
*
* Caller(s) : This is a task.
*
* Notes : (1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
* used. The compiler should not generate any code for this statement.
*********************************************************************************************************
*/
static void App_Task_LED (void *p_arg)
{
OS_ERR os_err;
void *p_msg;
OS_MSG_SIZE msg_size;
CPU_TS ts;
CPU_TS ts_delta;
(void) p_arg;
p_arg = p_arg;
while (DEF_TRUE) {
p_msg = OSQPend((OS_Q *)&AppQ, /* starts by waiting for messages to be sent through the message queue AppQ. */
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(OS_MSG_SIZE *)&msg_size, /* The size of the message. */
(CPU_TS *)&ts, /* contain the timestamp of when the message was sent. */
(OS_ERR *)&os_err);
ts_delta = OS_TS_GET() - ts;
BSP_LED_Toggle(BSP_LED_GREEN);
OSTimeDlyHMSM(0, 0, 1, 0,
OS_OPT_TIME_HMSM_STRICT, &os_err);
}
}
示例5: Task_Tmr
/*
* 函数名:Task_Tmr
* 描述 : 定时器应用任务
* 优先级为OS_CFG_PRIO_MAX-5u
* 输入 :无
* 输出 : 无
*/
void Task_Tmr(void *p_arg)
{
OS_ERR err;
//定时器变量
OS_TMR MyTmr;
(void)p_arg;
//创建定时器
OSTmrCreate ((OS_TMR *)&MyTmr,
(CPU_CHAR *)"MyTimer",
(OS_TICK )100, //第一次延时设置为100,结合定时器的频率是100Hz,正好1s
(OS_TICK )100, //重复延时的时候100个TmrTick,结合定时器的频率是100Hz,正好1s
(OS_OPT )OS_OPT_TMR_PERIODIC,//模式设置为重复模式
(OS_TMR_CALLBACK_PTR )_cbOfTmr1, //回调函数
(void *)0, //参数设置为0
(OS_ERR *)err);
//启动定时器
OSTmrStart ((OS_TMR *)&MyTmr,
(OS_ERR *)err);
//保存定时器开始的时候的时间戳
ts_start = OS_TS_GET();
while (1)
{
//不断阻塞
OSTimeDlyHMSM(0, 0,1,0,OS_OPT_TIME_HMSM_STRICT,&err);
}
}
示例6: OS_IntQTask
void OS_IntQTask (void *p_arg)
{
CPU_BOOLEAN done;
#if (OS_CFG_TS_EN == DEF_ENABLED)
CPU_TS ts_start;
CPU_TS ts_end;
#endif
CPU_SR_ALLOC();
(void)p_arg; /* Not using 'p_arg', prevent compiler warning */
while (DEF_ON) {
done = DEF_FALSE;
while (done == DEF_FALSE) {
CPU_CRITICAL_ENTER();
if (OSIntQNbrEntries == 0u) {
#if (OS_CFG_DBG_EN == DEF_ENABLED)
OSRdyList[0].NbrEntries = 0u; /* Remove from ready list */
#endif
OSRdyList[0].HeadPtr = DEF_NULL;
OSRdyList[0].TailPtr = DEF_NULL;
OS_PrioRemove(0u); /* Remove from the priority table */
CPU_CRITICAL_EXIT();
OSSched();
done = DEF_TRUE; /* No more entries in the queue, we are done */
} else {
CPU_CRITICAL_EXIT();
#if (OS_CFG_TS_EN == DEF_ENABLED)
ts_start = OS_TS_GET();
#endif
OS_IntQRePost();
#if (OS_CFG_TS_EN == DEF_ENABLED)
ts_end = OS_TS_GET() - ts_start; /* Measure execution time of tick task */
if (OSIntQTaskTimeMax < ts_end) {
OSIntQTaskTimeMax = ts_end;
}
#endif
CPU_CRITICAL_ENTER();
OSIntQOutPtr = OSIntQOutPtr->NextPtr; /* Point to next item in the ISR queue */
OSIntQNbrEntries--;
CPU_CRITICAL_EXIT();
}
}
}
}
示例7: OSTaskSwHook
void OSTaskSwHook (void)
{
#if OS_CFG_TASK_PROFILE_EN > 0u
CPU_TS ts;
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN
CPU_TS int_dis_time;
#endif
#if (OS_CPU_ARM_FP_EN == DEF_ENABLED)
if ((OSTCBCurPtr->Opt & OS_OPT_TASK_SAVE_FP) != (OS_OPT)0) {
OS_CPU_FP_Reg_Push(OSTCBCurPtr->StkPtr);
}
if ((OSTCBHighRdyPtr->Opt & OS_OPT_TASK_SAVE_FP) != (OS_OPT)0) {
OS_CPU_FP_Reg_Pop(OSTCBHighRdyPtr->StkPtr);
}
#endif
#if OS_CFG_APP_HOOKS_EN > 0u
if (OS_AppTaskSwHookPtr != (OS_APP_HOOK_VOID)0) {
(*OS_AppTaskSwHookPtr)();
}
#endif
#if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u))
TRACE_OS_TASK_SWITCHED_IN(OSTCBHighRdyPtr); /* Record the event. */
#endif
#if OS_CFG_TASK_PROFILE_EN > 0u
ts = OS_TS_GET();
if (OSTCBCurPtr != OSTCBHighRdyPtr) {
OSTCBCurPtr->CyclesDelta = ts - OSTCBCurPtr->CyclesStart;
OSTCBCurPtr->CyclesTotal += (OS_CYCLES)OSTCBCurPtr->CyclesDelta;
}
OSTCBHighRdyPtr->CyclesStart = ts;
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN
int_dis_time = CPU_IntDisMeasMaxCurReset(); /* Keep track of per-task interrupt disable time */
if (OSTCBCurPtr->IntDisTimeMax < int_dis_time) {
OSTCBCurPtr->IntDisTimeMax = int_dis_time;
}
#endif
#if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u
/* Keep track of per-task scheduler lock time */
if (OSTCBCurPtr->SchedLockTimeMax < OSSchedLockTimeMaxCur) {
OSTCBCurPtr->SchedLockTimeMax = OSSchedLockTimeMaxCur;
}
OSSchedLockTimeMaxCur = (CPU_TS)0; /* Reset the per-task value */
#endif
}
示例8: OSQPost
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);
}
示例9: OSTaskSwHook
void OSTaskSwHook (void)
{
#if OS_CFG_TASK_PROFILE_EN > 0u
CPU_TS ts;
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN
CPU_TS int_dis_time;
#endif
#if (OS_CFG_TASK_STK_REDZONE_EN == DEF_ENABLED)
CPU_BOOLEAN stk_status;
#endif
#if OS_CFG_APP_HOOKS_EN > 0u
if (OS_AppTaskSwHookPtr != (OS_APP_HOOK_VOID)0) {
(*OS_AppTaskSwHookPtr)();
}
#endif
#if OS_CFG_TASK_PROFILE_EN > 0u
ts = OS_TS_GET();
if (OSTCBCurPtr != OSTCBHighRdyPtr) {
OSTCBCurPtr->CyclesDelta = ts - OSTCBCurPtr->CyclesStart;
OSTCBCurPtr->CyclesTotal += (OS_CYCLES)OSTCBCurPtr->CyclesDelta;
}
OSTCBHighRdyPtr->CyclesStart = ts;
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN
int_dis_time = CPU_IntDisMeasMaxCurReset(); /* Keep track of per-task interrupt disable time */
if (OSTCBCurPtr->IntDisTimeMax < int_dis_time) {
OSTCBCurPtr->IntDisTimeMax = int_dis_time;
}
#endif
#if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u
/* Keep track of per-task scheduler lock time */
if (OSTCBCurPtr->SchedLockTimeMax < OSSchedLockTimeMaxCur) {
OSTCBCurPtr->SchedLockTimeMax = OSSchedLockTimeMaxCur;
}
OSSchedLockTimeMaxCur = (CPU_TS)0; /* Reset the per-task value */
#endif
#if (OS_CFG_TASK_STK_REDZONE_EN == DEF_ENABLED)
/* Check if stack overflowed. */
stk_status = OSTaskStkRedzoneChk(DEF_NULL);
if (stk_status != DEF_OK) {
CPU_SW_EXCEPTION(;);
示例10: OSTimeTick
void OSTimeTick (void)
{
OS_ERR err;
#if OS_CFG_ISR_POST_DEFERRED_EN > 0u
CPU_TS ts;
#endif
OSTimeTickHook(); /* Call user definable hook */
#if OS_CFG_ISR_POST_DEFERRED_EN > 0u
ts = OS_TS_GET(); /* Get timestamp */
OS_IntQPost((OS_OBJ_TYPE) OS_OBJ_TYPE_TICK, /* Post to ISR queue */
(void *)&OSRdyList[OSPrioCur],
(void *) 0,
(OS_MSG_SIZE) 0u,
(OS_FLAGS ) 0u,
(OS_OPT ) 0u,
(CPU_TS ) ts,
(OS_ERR *)&err);
#else
(void)OSTaskSemPost((OS_TCB *)&OSTickTaskTCB, /* Signal tick task */
(OS_OPT ) OS_OPT_POST_NONE,
(OS_ERR *)&err);
#if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u
OS_SchedRoundRobin(&OSRdyList[OSPrioCur]);
#endif
#if OS_CFG_TMR_EN > 0u
OSTmrUpdateCtr--;
if (OSTmrUpdateCtr == (OS_CTR)0u) {
OSTmrUpdateCtr = OSTmrUpdateCnt;
OSTaskSemPost((OS_TCB *)&OSTmrTaskTCB, /* Signal timer task */
(OS_OPT ) OS_OPT_POST_NONE,
(OS_ERR *)&err);
}
#endif
#endif
}
示例11: OSTaskSwHook
void OSTaskSwHook (void)
{
#if OS_CFG_TASK_PROFILE_EN > 0u
CPU_TS ts;
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN
CPU_TS int_dis_time;
#endif
#if OS_CFG_APP_HOOKS_EN > 0u
if (OS_AppTaskSwHookPtr != (OS_APP_HOOK_VOID)0) {
(*OS_AppTaskSwHookPtr)();
}
#endif
#if OS_CFG_TASK_PROFILE_EN > 0u
ts = OS_TS_GET();
if (OSTCBCurPtr != OSTCBHighRdyPtr) {
OSTCBCurPtr->CyclesDelta = ts - OSTCBCurPtr->CyclesStart;
OSTCBCurPtr->CyclesTotal += (OS_CYCLES)OSTCBCurPtr->CyclesDelta;
}
OSTCBHighRdyPtr->CyclesStart = ts;
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN
int_dis_time = CPU_IntDisMeasMaxCurReset(); /* Keep track of per-task interrupt disable time */
if (OSTCBCurPtr->IntDisTimeMax < int_dis_time) {
OSTCBCurPtr->IntDisTimeMax = int_dis_time;
}
#endif
#if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u
/* Keep track of per-task scheduler lock time */
if (OSTCBCurPtr->SchedLockTimeMax < OSSchedLockTimeMaxCur) {
OSTCBCurPtr->SchedLockTimeMax = OSSchedLockTimeMaxCur;
}
OSSchedLockTimeMaxCur = (CPU_TS)0; /* Reset the per-task value */
#endif
}
示例12: AppTaskFour
static void AppTaskFour (void *p_arg)
{
OS_ERR err;
CPU_INT32U i,k,j=0;
static CPU_INT32U tstart;
tstart=OS_TS_GET();
BSP_LED_On(1u);
for(k=0; k<WORKLOAD4; k++)
{
for(i=0; i <ONESECONDTICK/1.020395; i++){
j++;
}
}
BSP_LED_Off(1u);
OSTaskDel_new((OS_TCB *)0, &err);
}
示例13: OS_TickListUpdateTimeout
static CPU_TS OS_TickListUpdateTimeout (void)
{
OS_TCB *p_tcb;
OS_TICK_LIST *p_list;
CPU_TS ts_start;
CPU_TS ts_delta_timeout;
#if OS_CFG_DBG_EN > 0u
OS_OBJ_QTY nbr_updated;
#endif
#if OS_CFG_MUTEX_EN > 0u
OS_TCB *p_tcb_owner;
OS_PRIO prio_new;
#endif
CPU_SR_ALLOC();
OS_CRITICAL_ENTER(); /* ======= UPDATE TASKS WAITING WITH TIMEOUT ======= */
ts_start = OS_TS_GET();
#if OS_CFG_DBG_EN > 0u
nbr_updated = (OS_OBJ_QTY)0u;
#endif
p_list = &OSTickListTimeout;
p_tcb = p_list->TCB_Ptr;
if (p_tcb != (OS_TCB *)0) {
p_tcb->TickRemain--;
while (p_tcb->TickRemain == 0u) {
#if OS_CFG_DBG_EN > 0u
nbr_updated++;
#endif
#if OS_CFG_MUTEX_EN > 0u
p_tcb_owner = (OS_TCB *)0;
if (p_tcb->PendOn == OS_TASK_PEND_ON_MUTEX) {
p_tcb_owner = ((OS_MUTEX *)p_tcb->PendDataTblPtr->PendObjPtr)->OwnerTCBPtr;
}
#endif
#if (OS_MSG_EN > 0u)
p_tcb->MsgPtr = (void *)0;
p_tcb->MsgSize = (OS_MSG_SIZE)0u;
#endif
p_tcb->TS = OS_TS_GET();
OS_PendListRemove(p_tcb); /* Remove from wait list */
if (p_tcb->TaskState == OS_TASK_STATE_PEND_TIMEOUT) {
OS_RdyListInsert(p_tcb); /* Insert the task in the ready list */
p_tcb->TaskState = OS_TASK_STATE_RDY;
} else if (p_tcb->TaskState == OS_TASK_STATE_PEND_TIMEOUT_SUSPENDED) {
p_tcb->TaskState = OS_TASK_STATE_SUSPENDED;
}
p_tcb->PendStatus = OS_STATUS_PEND_TIMEOUT; /* Indicate pend timed out */
p_tcb->PendOn = OS_TASK_PEND_ON_NOTHING; /* Indicate no longer pending */
#if OS_CFG_MUTEX_EN > 0u
if(p_tcb_owner != (OS_TCB *)0) {
if ((p_tcb_owner->Prio != p_tcb_owner->BasePrio) &&
(p_tcb_owner->Prio == p_tcb->Prio)) { /* Has the owner inherited a priority? */
prio_new = OS_MutexGrpPrioFindHighest(p_tcb_owner);
prio_new = prio_new > p_tcb_owner->BasePrio ? p_tcb_owner->BasePrio : prio_new;
if(prio_new != p_tcb_owner->Prio) {
OS_TaskChangePrio(p_tcb_owner, prio_new);
#if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u))
TRACE_OS_MUTEX_TASK_PRIO_DISINHERIT(p_tcb_owner, p_tcb_owner->Prio)
#endif
}
}
}
示例14: OSQPost
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);
}
示例15: OSQPendAbort
OS_OBJ_QTY OSQPendAbort (OS_Q *p_q,
OS_OPT opt,
OS_ERR *p_err)
{
OS_PEND_LIST *p_pend_list;
OS_TCB *p_tcb;
CPU_TS ts;
OS_OBJ_QTY nbr_tasks;
CPU_SR_ALLOC();
#ifdef OS_SAFETY_CRITICAL
if (p_err == (OS_ERR *)0) {
OS_SAFETY_CRITICAL_EXCEPTION();
return ((OS_OBJ_QTY)0u);
}
#endif
#if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
if (OSIntNestingCtr > (OS_NESTING_CTR)0u) { /* Not allowed to Pend Abort from an ISR */
*p_err = OS_ERR_PEND_ABORT_ISR;
return ((OS_OBJ_QTY)0u);
}
#endif
#if OS_CFG_ARG_CHK_EN > 0u
if (p_q == (OS_Q *)0) { /* Validate 'p_q' */
*p_err = OS_ERR_OBJ_PTR_NULL;
return ((OS_OBJ_QTY)0u);
}
switch (opt) { /* Validate 'opt' */
case OS_OPT_PEND_ABORT_1:
case OS_OPT_PEND_ABORT_ALL:
case OS_OPT_PEND_ABORT_1 | OS_OPT_POST_NO_SCHED:
case OS_OPT_PEND_ABORT_ALL | OS_OPT_POST_NO_SCHED:
break;
default:
*p_err = OS_ERR_OPT_INVALID;
return ((OS_OBJ_QTY)0u);
}
#endif
#if OS_CFG_OBJ_TYPE_CHK_EN > 0u
if (p_q->Type != OS_OBJ_TYPE_Q) { /* Make sure queue was created */
*p_err = OS_ERR_OBJ_TYPE;
return ((OS_OBJ_QTY)0u);
}
#endif
CPU_CRITICAL_ENTER();
p_pend_list = &p_q->PendList;
if (p_pend_list->NbrEntries == (OS_OBJ_QTY)0u) { /* Any task waiting on queue? */
CPU_CRITICAL_EXIT(); /* No */
*p_err = OS_ERR_PEND_ABORT_NONE;
return ((OS_OBJ_QTY)0u);
}
OS_CRITICAL_ENTER_CPU_EXIT();
nbr_tasks = 0u;
ts = OS_TS_GET(); /* Get local time stamp so all tasks get the same time */
while (p_pend_list->NbrEntries > (OS_OBJ_QTY)0u) {
p_tcb = p_pend_list->HeadPtr->TCBPtr;
OS_PendAbort((OS_PEND_OBJ *)((void *)p_q),
p_tcb,
ts);
nbr_tasks++;
if (opt != OS_OPT_PEND_ABORT_ALL) { /* Pend abort all tasks waiting? */
break; /* No */
}
}
OS_CRITICAL_EXIT_NO_SCHED();
if ((opt & OS_OPT_POST_NO_SCHED) == (OS_OPT)0u) {
OSSched(); /* Run the scheduler */
}
*p_err = OS_ERR_NONE;
return (nbr_tasks);
}