/*FreeRTOS 中删除任务是分两步的,第一步 vTaskDelete 将其从各个工作链表中断开,放到xTasksWaitingTermination 链表中,第二步 Idle Task 调用这个函数真正的删除任务。代码很简单,不需要注释了。 */
static void prvCheckTasksWaitingTermination( void )
{
#if ( INCLUDE_vTaskDelete == 1 )
{
portBASE_TYPE xListIsEmpty;
if( uxTasksDeleted > ( unsigned portBASE_TYPE ) 0 )
{
vTaskSuspendAll();
xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination );
xTaskResumeAll();
if( xListIsEmpty == pdFALSE )
{
tskTCB *pxTCB;
taskENTER_CRITICAL();
{
pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( ( ( xList * ) &xTasksWaitingTermination ) );
vListRemove( &( pxTCB->xGenericListItem ) );
--uxCurrentNumberOfTasks;
--uxTasksDeleted;
}
taskEXIT_CRITICAL();
prvDeleteTCB( pxTCB );
}
}
}
#endif
}
static void prvDeleteTCB( tskTCB *pxTCB )
{
vPortFreeAligned( pxTCB->pxStack );
vPortFree( pxTCB );
}