FreeRTOS 源码注释(vTaskDelay)

void vTaskDelay( portTickType xTicksToDelay )
{
    portTickType xTimeToWake;
    signed portBASE_TYPE xAlreadyYielded = pdFALSE;

    /* A delay time of zero just forces a reschedule. */
    if( xTicksToDelay > ( portTickType ) 0 )
    {
        vTaskSuspendAll();
        {
            traceTASK_DELAY();

            /* 计算下次唤醒的时刻. */
            xTimeToWake = xTickCount + xTicksToDelay;

            /* 从 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();
    }
}

你可能感兴趣的:(api,delay)