电子工程师站

free rtos源码分析(四)

2018-06-11  本文已影响0人  SunShine__鹏

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();

}

}

}

上一篇 下一篇

猜你喜欢

热点阅读