您的位置:首页 > 其它

FreeRTOS 源码注释(vTaskDelayUntil)

2012-06-22 21:08 246 查看
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();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: