voidOSTimeDly(INT32U ticks){
INT8U y;#ifOS_CRITICAL_METHOD ==3u/* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr =0u;#endifif(OSIntNesting >0u)/* See if trying to call from an ISR */{return;}if(OSLockNesting >0u)/* See if called with scheduler locked */{return;}if(ticks >0u)/* 0 means no delay! */{OS_ENTER_CRITICAL();
y = OSTCBCur->OSTCBY;/* Delay current task */
OSRdyTbl[y]&=(OS_PRIO)~OSTCBCur->OSTCBBitX;if(OSRdyTbl[y]==0u){
OSRdyGrp &=(OS_PRIO)~OSTCBCur->OSTCBBitY;}
OSTCBCur->OSTCBDly = ticks;/* Load ticks in TCB */OS_EXIT_CRITICAL();OS_Sched();/* Find next task to run! */}}
按时、分、秒、毫秒延时
#ifOS_TIME_DLY_HMSM_EN >0u
INT8U OSTimeDlyHMSM(INT8U hours,
INT8U minutes,
INT8U seconds,
INT16U ms){
INT32U ticks;if(OSIntNesting >0u)/* See if trying to call from an ISR */{return(OS_ERR_TIME_DLY_ISR);}if(OSLockNesting >0u)/* See if called with scheduler locked */{return(OS_ERR_SCHED_LOCKED);}#ifOS_ARG_CHK_EN >0uif(hours ==0u){if(minutes ==0u){if(seconds ==0u){if(ms ==0u){return(OS_ERR_TIME_ZERO_DLY);}}}}if(minutes >59u){return(OS_ERR_TIME_INVALID_MINUTES);/* Validate arguments to be within range */}if(seconds >59u){return(OS_ERR_TIME_INVALID_SECONDS);}if(ms >999u){return(OS_ERR_TIME_INVALID_MS);}#endif/* Compute the total number of clock ticks required.. *//* .. (rounded to the nearest tick) */
ticks =((INT32U)hours *3600uL+(INT32U)minutes *60uL+(INT32U)seconds)* OS_TICKS_PER_SEC
+ OS_TICKS_PER_SEC *((INT32U)ms +500uL/ OS_TICKS_PER_SEC)/1000uL;OSTimeDly(ticks);return(OS_ERR_NONE);}#endif
恢复被延时的Task
#ifOS_TIME_DLY_RESUME_EN >0u
INT8U OSTimeDlyResume(INT8U prio){
OS_TCB *ptcb;#ifOS_CRITICAL_METHOD ==3u/* Storage for CPU status register */
OS_CPU_SR cpu_sr =0u;#endifif(prio >= OS_LOWEST_PRIO){return(OS_ERR_PRIO_INVALID);}OS_ENTER_CRITICAL();
ptcb = OSTCBPrioTbl[prio];/* Make sure that task exist */if(ptcb ==(OS_TCB *)0){OS_EXIT_CRITICAL();return(OS_ERR_TASK_NOT_EXIST);/* The task does not exist */}if(ptcb == OS_TCB_RESERVED){OS_EXIT_CRITICAL();return(OS_ERR_TASK_NOT_EXIST);/* The task does not exist */}if(ptcb->OSTCBDly ==0u)/* See if task is delayed */{OS_EXIT_CRITICAL();return(OS_ERR_TIME_NOT_DLY);/* Indicate that task was not delayed */}
ptcb->OSTCBDly =0u;/* Clear the time delay */if((ptcb->OSTCBStat & OS_STAT_PEND_ANY)!= OS_STAT_RDY){
ptcb->OSTCBStat &=~OS_STAT_PEND_ANY;/* Yes, Clear status flag */
ptcb->OSTCBStatPend = OS_STAT_PEND_TO;/* Indicate PEND timeout */}else{
ptcb->OSTCBStatPend = OS_STAT_PEND_OK;}if((ptcb->OSTCBStat & OS_STAT_SUSPEND)== OS_STAT_RDY)/* Is task suspended? */{
OSRdyGrp |= ptcb->OSTCBBitY;/* No, Make ready */
OSRdyTbl[ptcb->OSTCBY]|= ptcb->OSTCBBitX;OS_EXIT_CRITICAL();OS_Sched();/* See if this is new highest priority */}else{OS_EXIT_CRITICAL();/* Task may be suspended */}return(OS_ERR_NONE);}#endif
返回系统当前的Tick计数值
#ifOS_TIME_GET_SET_EN >0u
INT32U OSTimeGet(void){
INT32U ticks;#ifOS_CRITICAL_METHOD ==3u/* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr =0u;#endifOS_ENTER_CRITICAL();
ticks = OSTime;OS_EXIT_CRITICAL();return(ticks);}#endif
设置系统的Tick计数值
#ifOS_TIME_GET_SET_EN >0uvoidOSTimeSet(INT32U ticks){#ifOS_CRITICAL_METHOD ==3u/* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr =0u;#endifOS_ENTER_CRITICAL();
OSTime = ticks;OS_EXIT_CRITICAL();}#endif
作者:Carly Richmond, Marco Vettorello, Giovanni Magni 开发人员、SRE 工程师和才华横溢的技术人员通常需要构建快速仪表板来展示有关其应用程序状态的重要信息,这些信息可供混合受众使用。 如果你不是前端开发人员或设计师,那么构建所有人…
shigen日更文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 🧑💻🧑💻🧑💻Make things differe…