<pre name="code" class="objc">void vTaskDelete( TaskHandle_t xTaskToDelete )
{
TCB_t *pxTCB;
taskENTER_CRITICAL();
{
//若传进来的值为NULL则用此函数的就是任务本身。
pxTCB = prvGetTCBFromHandle( xTaskToDelete );//根据任务句柄获取对应任务的句柄或TCB
//将任务从就绪链表中移除放入到终止链表中去。调度器将终止这个任务的执行。
//空闲任务将检测这个终止链表并通过调度器释放任何可以释放的内存(堆栈,TCB)
if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )//若链表中剩余链表项为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();
}
//将任务添加到终止链表中,Idle 任务会将其真正删除(prvCheckTasksWaitingTermination)
vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xGenericListItem ) );
++uxTasksDeleted;//Idle 任务根据这个变量知道有需要删除的任务
uxTaskNumber++;//通知 kernel aware debuggers 更新任务列表
traceTASK_DELETE( pxTCB );
}
taskEXIT_CRITICAL();
//如果删除的是当前任务,则需要任务调度
if( xSchedulerRunning != pdFALSE )//若任务调度器正在执行
{
if( pxTCB == pxCurrentTCB )//若删除的任务TCB就是当前的任务TCB
{
configASSERT( uxSchedulerSuspended == 0 );
portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending );
portYIELD_WITHIN_API();//进行任务切换
}
else//若删除的任务TCB不是当前任务的TCB
{
taskENTER_CRITICAL();
{
prvResetNextTaskUnblockTime();//重新设置下一个唤醒的时间。
}
taskEXIT_CRITICAL();
}
}
}
FreeRTOS(V8.0.1)系统之vTaskDelete()
最新推荐文章于 2024-03-31 10:31:33 发布