一、任务删除
vTaskDelete()
精简代码
void vTaskDelete( TaskHandle_t xTaskToDelete )
{
TCB_t *pxTCB;
taskENTER_CRITICAL();
pxTCB = prvGetTCBFromHandle( xTaskToDelete );//(1)
//(2)
if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
{
taskRESET_READY_PRIORITY( pxTCB->uxPriority );
}
//(3)
if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )
{
( void ) uxListRemove( &( pxTCB->xEventListItem ) );
}
//(4)
if( pxTCB == pxCurrentTCB )
{
vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xStateListItem ) );
++uxDeletedTasksWaitingCleanUp;
portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending );
}
//(5)
else
{
--uxCurrentNumberOfTasks;
prvDeleteTCB( pxTCB );
prvResetNextTaskUnblockTime();
}
taskEXIT_CRITICAL();
}
(1)获取任务句柄
(2)(3)将要删除的任务从相应的状态列表和时间列表中移除
(4)如果是删除自身,就添加到空闲任务中
(5)不是删除自身,系统任务数量减一,重置下一个预期的解除阻塞时间
二、任务挂起
vTaskSuspend()
精简代码
void vTaskSuspend( TaskHandle_t xTaskToSuspend )
{
TCB_t *pxTCB;
taskENTER_CRITICAL();
{
pxTCB = prvGetTCBFromHandle( xTaskToSuspend );//(1)
//(2)
if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
{
taskRESET_READY_PRIORITY( pxTCB->uxPriority );
}
//(3)
if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )
{
( void ) uxListRemove( &( pxTCB->xEventListItem ) );
}
(4)
vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xStateListItem ) );
}
taskEXIT_CRITICAL();
taskENTER_CRITICAL();
{
prvResetNextTaskUnblockTime();//(5)
}
taskEXIT_CRITICAL();
if( pxTCB == pxCurrentTCB )
{
if( xSchedulerRunning != pdFALSE )
{
portYIELD_WITHIN_API();(6)
}
}
(1)获取要挂起任务句柄
(2)(3)将要挂起的任务从相应的状态列表和时间列表中移除
(4)将要挂起的任务添加到任务挂起列表中
(5)重置下一个预期的解除阻塞时间
(6)如果挂起的是自身且调度器正在运行,进行任务切换
三、任务恢复
vTaskResume()
精简代码
void vTaskResume( TaskHandle_t xTaskToResume )
{
TCB_t * const pxTCB = ( TCB_t * ) xTaskToResume;
taskENTER_CRITICAL();
( void ) uxListRemove( &( pxTCB->xStateListItem ) );//(1)
prvAddTaskToReadyList( pxTCB ); //(2)
if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )
{
taskYIELD_IF_USING_PREEMPTION(); //(3)
}
taskEXIT_CRITICAL();
}
(1)将要恢复的任务从挂起任务列表中移除
(2)调用prvAddTaskToReadyList()将任务添加到就绪列表中
(3)根据任务优先级判断是否需要进行任务切换