void vTaskDelete( xTaskHandle pxTaskToDelete )
{
tskTCB *pxTCB;
taskENTER_CRITICAL();
{
if( pxTaskToDelete == pxCurrentTCB )
{
pxTaskToDelete = NULL;
}
pxTCB = prvGetTCBFromHandle( pxTaskToDelete );
vListRemove( &( pxTCB->xGenericListItem ) );/* 将任务从就绪链表中删除 */
if( pxTCB->xEventListItem.pvContainer ) /* 检查任务是否等待任何事件 */
{
vListRemove( &( pxTCB->xEventListItem ) );/* 将任务从事件链表中删除 */
}
/*将任务添加到终止链表中,Idle 任务会将其真正删除(prvCheckTasksWaitingTermination) */
vListInsertEnd( ( xList * ) &xTasksWaitingTermination, &( pxTCB->xGenericListItem ) );
++uxTasksDeleted;/* Idle 任务根据这个变量知道有需要删除的任务 */
/* 通知 kernel aware debuggers 更新任务列表. */
uxTaskNumber++; /* 这里似乎应该是 uxTaskNumber--; */
traceTASK_DELETE( pxTCB );
}
taskEXIT_CRITICAL();
/* 如果删除的是当前任务,则需要任务调度 */
if( xSchedulerRunning != pdFALSE )
{
if( ( void * ) pxTaskToDelete == NULL )
{
portYIELD_WITHIN_API();
}
}
}
FreeRTOS 源码注释(vTaskDelete)
最新推荐文章于 2024-07-29 16:48:01 发布