看源碼
void vTaskDelay( const TickType_t xTicksToDelay ) //任務睡眠函數
{
BaseType_t xAlreadyYielded = pdFALSE;
if( xTicksToDelay > ( TickType_t ) 0U )
{
configASSERT( uxSchedulerSuspended == 0 );
vTaskSuspendAll();
{
traceTASK_DELAY();
prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );
}
xAlreadyYielded = xTaskResumeAll();
}
else
{
mtCOVERAGE_TEST_MARKER();
}
if( xAlreadyYielded == pdFALSE )
{
portYIELD_WITHIN_API();
}
else
{
mtCOVERAGE_TEST_MARKER();
}
}
看到源碼中的掛機函數vTaskSuspendAll(); 和恢復函數xTaskResumeAll(); 了嗎,任務中調用延時只是把任務掛起,等待延時時間到,再把任務恢復。掛起了當前任務,內核將分配時間給其他任務執行