free rtos源码分析(四)
void vTaskDelete( TaskHandle_t xTaskToDelete )
{
TCB_t *pxTCB;
taskENTER_CRITICAL();
{
/* 如果在这里传递了null,则调用的任务被删除了 */
pxTCB = prvGetTCBFromHandle( xTaskToDelete );
/* 从就绪列表中删除任务 */
if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
{
taskRESET_READY_PRIORITY( pxTCB->uxPriority );
}
else
{
mtCOVERAGE_TEST_MARKER();
}
/*任务是否在等待事件触发? */
if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )
{
( void ) uxListRemove( &( pxTCB->xEventListItem ) );
}
else
{
mtCOVERAGE_TEST_MARKER();
}
/* 递减 uxTaskNumber ,可能是 - - 操作. */
uxTaskNumber++;
if( pxTCB == pxCurrentTCB )
{
/* 删除任务本身。任务本身无法完成这个操作,作为一个上下文切换到另一个任务是必需的。
添加进终止的任务列表。空闲任务检查终端列表和释放分配的任何内存调度器的TCB和堆栈 删除任务 */
vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xStateListItem ) );
/* 让 ucTasksDeleted 变量增加计数使空闲任务知道有任务需要被删除并且需要检查 xTasksWaiting终端列表. */
++uxDeletedTasksWaitingCleanUp;
portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending );
}
else
{
--uxCurrentNumberOfTasks;
prvDeleteTCB( pxTCB );
/* 重置下期望开启时间,以防它指的刚刚删除的任务。*/
prvResetNextTaskUnblockTime();
}
traceTASK_DELETE( pxTCB );
}
taskEXIT_CRITICAL();
/* Force a reschedule if it is the currently running task that has just
been deleted. */
if( xSchedulerRunning != pdFALSE )
{
if( pxTCB == pxCurrentTCB )
{
configASSERT( uxSchedulerSuspended == 0 );
portYIELD_WITHIN_API();
}
else
{
mtCOVERAGE_TEST_MARKER();
}
}
}