使用说明:
任务中。小时 (任务句柄_t xTask); INCLUDE_vTaskDelete必须定义为1,才能使用此函数。有关更多信息,请参见RTOS配置文档。 从RTOS内核管理中删除任务。正在删除的任务将从所有就绪、阻止、暂停和事件列表中删除。 注:空闲任务负责从已删除的任务中释放RTOS内核分配的内存。因此,如果应用程序调用vTaskDelete(),则空闲任务不会缺少微控制器处理时间,这一点非常重要。任务代码分配的内存不会自动释放,应该在删除任务之前释放。 请参见应用程序文件死亡演示。c获取使用vTaskDelete()的示例代码。
使用用途:
一般是使用在初始化任务中,当初始化完成所有任务之后进行删除初始化任务,
一般是删除自身任务或者是强制删除其他任务
条件:
FreeRTOSConfig.h中定义
#define INCLUDE_vTaskDelay 1
函数使用:
/**
* @description: 初始化任务列表
* @detail:
* @return {*}
* @author: lkc
*/
void Task_InitList(void *pvParameters)
{
while (1)
{
printf("init task init success\n");
/* 第一种。删除选中任务 */
vTaskDelete(pxStartTaskHandle);
/* 或者第二种,删除当前运行任务 */
/* vTaskDelete(NULL); */
}
}
函数源码解释:
void vTaskDelete( TaskHandle_t xTaskToDelete )
{
TCB_t * pxTCB;
/* 进入临界区 */
taskENTER_CRITICAL();
{
/* 如果xTaskToDelete为空,那么调用该函数的任务将会被删除 */
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++;
/* 如果是当前任务 */
if( pxTCB == pxCurrentTCB )
{
/* 任务正在删除自己。这不能在任务本身,因为上下文切换到另一个任务是必需的。 将任务放入终止列表中。空闲任务将检查终止列表,释放任何内存分配被删除任务的TCB和堆栈的调度程序。*/
vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xStateListItem ) );
/* 增加ucTasksDeleted变量,以便空闲任务知道有一个任务被删除了,因此它应该被删除检查xtaskswaitingterminate列表 */
++uxDeletedTasksWaitingCleanUp;
/* Call the delete hook before portPRE_TASK_DELETE_HOOK() as
* portPRE_TASK_DELETE_HOOK() does not return in the Win32 port. */
traceTASK_DELETE( pxTCB );
/* The pre-delete hook is primarily for the Windows simulator,
* in which Windows specific clean up operations are performed,
* after which it is not possible to yield away from this task -
* hence xYieldPending is used to latch that a context switch is
* required. */
portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending );
}
/* 如果非当前任务 */
else
{
--uxCurrentNumberOfTasks;
traceTASK_DELETE( pxTCB );
prvDeleteTCB( pxTCB );
/* Reset the next expected unblock time in case it referred to
* the task that has just been deleted. */
prvResetNextTaskUnblockTime();
}
}
taskEXIT_CRITICAL();
/* 如果它是当前运行的任务,则强制重新调度 */
if( xSchedulerRunning != pdFALSE )
{
if( pxTCB == pxCurrentTCB )
{
configASSERT( uxSchedulerSuspended == 0 );
portYIELD_WITHIN_API();
}
else
{
mtCOVERAGE_TEST_MARKER();
}
}
}