• μC/OS-II---时间管理(os_time.c)


    在这里插入图片描述

    时间管理相关(os_time.c)

    Task延迟

    void  OSTimeDly (INT32U ticks)
    {
    	INT8U      y;
    #if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */
    	OS_CPU_SR  cpu_sr = 0u;
    #endif
    	
    	if (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!                             */
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    按时、分、秒、毫秒延时

    #if OS_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);
    	}
    	
    #if OS_ARG_CHK_EN > 0u
    	
    	if (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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    恢复被延时的Task

    #if OS_TIME_DLY_RESUME_EN > 0u
    INT8U  OSTimeDlyResume (INT8U prio)
    {
    	OS_TCB    *ptcb;
    #if OS_CRITICAL_METHOD == 3u                                   /* Storage for CPU status register      */
    	OS_CPU_SR  cpu_sr = 0u;
    #endif
    	
    	if (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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    返回系统当前的Tick计数值

    #if OS_TIME_GET_SET_EN > 0u
    INT32U  OSTimeGet (void)
    {
    	INT32U     ticks;
    #if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */
    	OS_CPU_SR  cpu_sr = 0u;
    #endif
    	OS_ENTER_CRITICAL();
    	ticks = OSTime;
    	OS_EXIT_CRITICAL();
    	return (ticks);
    }
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    设置系统的Tick计数值

    #if OS_TIME_GET_SET_EN > 0u
    void  OSTimeSet (INT32U ticks)
    {
    #if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */
    	OS_CPU_SR  cpu_sr = 0u;
    #endif
    	OS_ENTER_CRITICAL();
    	OSTime = ticks;
    	OS_EXIT_CRITICAL();
    }
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    Linux高性能服务器——状态机
    艾美捷 抗人IL-12/-23(p40)mAbs MT86/221,纯化方案
    sqlplus rlwrap: error: Cannot execute sqlplus: Too many levels of symbolic lin
    策略模式和模板模式
    Docker Desktop创建ZK集群和Kafka集群 详解
    堆排序思想分享
    【Jquery】-------JS实现关键字检索html内容,符合关键字的匹配项,进行标注背景色,可进行上一个,下一个切换定位
    SpringCloud Eureka搭建会员中心服务提供方-集群
    RDMA概览
    数字赋能机械制造业,供应链协同管理系统解决方案助力企业供应链再升级
  • 原文地址:https://blog.csdn.net/weixin_45880844/article/details/134314403