μC/OS-II--时间管理

本文详细介绍了μC/OS-II操作系统中的时间管理,包括任务延时、指定时分秒延时和取消延时。任务延时通过OSTimeDly使任务进入等待状态,延时结束后进入就绪态。指定时分秒延时则将时间转换为时钟节拍进行延时。取消延时通过清除任务等待时间,调整任务状态来实现。同时,还提及了系统时间的获取与设置功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间管理主要将任务进行延时,进入等待状态,以及取消延时,结束等待。

1、任务延时

调用OSTimeDly可以使任务进入等待状态,进行一段特定时间的延时,同时系统进行以一次任务调度,执行下一个优先级最高的就绪态任务,一旦时间期满或者其他任务调用了OSTimeDlyResume取消了延时,等待状态的任务就会进入就绪态。

void  OSTimeDly (INT16U ticks)
{
    INT8U      y;
#if OS_CRITICAL_METHOD == 3                      //为CPU状态寄存器分配内存
    OS_CPU_SR  cpu_sr = 0;
#endif



    if (OSIntNesting > 0) {                     //检查是否中断
        return;
    }
    if (ticks > 0) {                            //延时时间大于0
        OS_ENTER_CRITICAL();
        y            =  OSTCBCur->OSTCBY;        //获取就绪表组                              
        OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;    //将就绪表该任务为清0
        if (OSRdyTbl[y] == 0) {//如果就绪表该字节为0,说明该组的任务都没有就绪
            OSRdyGrp &= ~OSTCBCur->OSTCBBitY;  //就绪组清零
        }
        OSTCBCur->OSTCBDly = ticks;              //将当前任务的延时时间设置为ticks
        OS_EXIT_CRITICAL();
        OS_Sched();                             //任务调度
    }
}

 

2、指定时分秒延时

将时,分,秒,毫秒转换为时钟节拍值,然后分批进行调用OSTimeDly。

#if OS_TIME_DLY_HMSM_EN > 0
INT8U  OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U ms)
{
    INT32U ticks;
    INT16U loops;


    if (OSIntNesting > 0) {                     //检查是否进入中断
        return (OS_ERR_TIME_DLY_ISR);
    }
#if OS_ARG_CHK_EN > 0
    if (hours == 0) {//检查各个时间单位时间值是否全为0
        if (minutes == 0) {
            if (seconds == 0) {
                if (ms == 0) {
                    return (OS_ERR_TIME_ZERO_DLY);
                }
            }
        }
    }
    if (minutes > 59) {
        return (OS_ERR_TIME_INVALID_MINUTES);   //分钟检查
    }
    if (seconds > 59) {
        return (OS_ERR_TIME_INVALID_SECONDS);  //秒检查
    }
    if (ms > 999) {
        return (OS_ERR_TIME_INVALID_MS);      //毫秒检查
    }
#endif
                                                 /* Compute the total number of clock ticks required.. */
                                                 /* .. (rounded to the nearest tick)                   */
    ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC
          + OS_TICKS_PER_SEC * ((INT32U)ms + 500L / OS_TICKS_PER_SEC) / 1000L;
    
    loops = (INT16U)(ticks >> 16);               /* Compute the integral number of 65536 tick delays   */
    ticks = ticks & 0xFFFFL;                     /* Obtain  the fractional number of ticks             */
    OSTimeDly((INT16U)ticks);
    while (loops > 0) {
        OSTimeDly((INT16U)32768u);
        OSTimeDly((INT16U)32768u);
        loops--;
    }
    return (OS_ERR_NONE);
}
#endif

3、取消延时

首先将当前根据prio优先级找出对应的任务,将该任务的等待时间清零。判断该任务是否还在等待某个事件,如果是将任务状态中等待事件的标志位清零,将等待状态设置为超时状态,没有等待事件的话,等待状态设置为等待成功。判断该任务是不是挂起态,如果是直接将任务状态转为就绪态,进行一次任务调度。

#if OS_TIME_DLY_RESUME_EN > 0
INT8U  OSTimeDlyResume (INT8U prio)
{
    OS_TCB    *ptcb;
#if OS_CRITICAL_METHOD == 3                                   //为CPU状态寄存器分配内存
    OS_CPU_SR  cpu_sr = 0;
#endif



    if (prio >= OS_LOWEST_PRIO) {                             //检查优先级是否有效
        return (OS_ERR_PRIO_INVALID);
    }
    OS_ENTER_CRITICAL();
    ptcb = OSTCBPrioTbl[prio];                                //获取任务控制块的指针
    if (ptcb == (OS_TCB *)0) {
        OS_EXIT_CRITICAL();
        return (OS_ERR_TASK_NOT_EXIST);                       //检查任务是否存在
    }
    if (ptcb == OS_TCB_RESERVED) {
        OS_EXIT_CRITICAL();
        return (OS_ERR_TASK_NOT_EXIST);                       //
    }
    if (ptcb->OSTCBDly == 0) {                                //任务不存在延时
        OS_EXIT_CRITICAL();
        return (OS_ERR_TIME_NOT_DLY);                         
    }

    ptcb->OSTCBDly = 0;                                        //清除延时时间
    if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {//如果是等待
        ptcb->OSTCBStat     &= ~OS_STAT_PEND_ANY;              //清除等待状态
        ptcb->OSTCBStatPend  =  OS_STAT_PEND_TO;              // 等待超时
    } else {
        ptcb->OSTCBStatPend  =  OS_STAT_PEND_OK;              //等待成功
    }
    
    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) {  //未挂起状态
        OSRdyGrp               |= ptcb->OSTCBBitY;            //设置就绪状态
        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
        OS_EXIT_CRITICAL();
        OS_Sched();                                            //任务调度
    } else {
        OS_EXIT_CRITICAL();                                  
    }
    return (OS_ERR_NONE);
}
#endif

系统时间

利用OSTimeGet和OSTimeSet分别获取和设置系统时间。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值