由于后面的源码分析会涉及到一些任务的操作函数,所以这里先分析一下任务的一些相关操作,包括任务的删除、挂起、恢复操作。
任务删除:
#if ( INCLUDE_vTaskDelete == 1 )
void vTaskDelete( TaskHandle_t xTaskToDelete )
{
TCB_t *pxTCB;
/* 进入临界区 */
taskENTER_CRITICAL();
{
/* 如果没有指定删除的任务(参数为NULL),则默认删除当前任务(即自己删自己),否则删除形参指定的任务 */
/* #define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? pxCurrentTCB : ( pxHandle ) )
*/
pxTCB = prvGetTCBFromHandle( xTaskToDelete );
/* 将任务从就绪列表中删除 */
if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
{
/* 清除对应的就绪标志 */
taskRESET_READY_PRIORITY( pxTCB->uxPriority );
}
else
{
mtCOVERAGE_TEST_MARKER();
}
/* 如果任务有等待事件(如信号量、队列等),将任务从相应的事件列表中删除 */
/* #define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pxContainer ) */
if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )
{
( void ) uxListRemove( &( pxTCB->xEventListItem ) );
}
else
{
mtCOVERAGE_TEST_MARKER();
}
/* 递增任务数量,空闲任务根据这个变量知道有任务需要删除 */
uxTaskNumber++;
if( pxTCB == pxCurrentTCB )
{
/* 如果要删除的任务是当前任务(即自己删自己) */
/* 将任务插入到等待删除列表,不能立即删除的原因是由于任务控制块和堆栈的内存不能被