FreeRTOS 源码注释(vTaskDelayUntil)

void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement )
{
    portTickType xTimeToWake;
    portBASE_TYPE xAlreadyYielded, xShouldDelay = pdFALSE;

    vTaskSuspendAll();
    {
        /* 计算下次唤醒的时刻. */
        xTimeToWake = *pxPreviousWakeTime + xTimeIncrement;

        if( xTickCount < *pxPreviousWakeTime ) /* 说明 xTickCount 溢出了 */
        {
            /* 这时只有 xTimeToWake 也溢出了,并且 xTimeToWake > xTickCount 才需要休眠 */
            if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xTickCount ) )
            {
                xShouldDelay = pdTRUE;
            }
        }
        else
        {
            /* 下面两种情况才需要休眠 */
            if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xTickCount ) )
            {
                xShouldDelay = pdTRUE;
            }
        }

        /* 为下一次 Delay 更新 pxPreviousWakeTime. */
        *pxPreviousWakeTime = xTimeToWake;

        if( xShouldDelay != pdFALSE ) /* 这时需要休眠 */
        {
            traceTASK_DELAY_UNTIL();

            /* 从 Ready 链表中删除,加入 DelayedList */
            vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );
            prvAddCurrentTaskToDelayedList( xTimeToWake );
        }
    }
    xAlreadyYielded = xTaskResumeAll(); /* 不知道作用,找时间仔细看看 */

    /* Force a reschedule if xTaskResumeAll has not already done so, we may
    have put ourselves to sleep. */
    if( !xAlreadyYielded )
    {
        portYIELD_WITHIN_API();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值