freertos 源码详解五 任务的挂起删除和恢复

任务的删除vTaskDelete()

1、根据任务句柄获取任务控制块,如果句柄为NULL,表示删除任务本身。

pxTCB = prvGetTCBFromHandle( xTaskToDelete );

#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? ( TCB_t * ) pxCurrentTCB : ( TCB_t * ) ( pxHandle ) )

2、将要删除的任务从就绪列表中移除,如果优先级下只有一个任务,就复位该优先级。
3、如果任务等待某些事件,就将任务从相应的事件列表中移除。
if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )
{
( void ) uxListRemove( &( pxTCB->xEventListItem ) );
}
4、
如果删除的是任务自身,那么将任务添加到xTasksWaitingTermination

if( pxTCB == pxCurrentTCB )
{vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xStateListItem ) );
++uxDeletedTasksWaitingCleanUp;
portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending );
}

如果不是任务自身
–uxCurrentNumberOfTasks;
prvDeleteTCB( pxTCB );

prvResetNextTaskUnblockTime();

你可能感兴趣的:(freertos 源码详解五 任务的挂起删除和恢复)