FreeRTOS学习笔记(14)---- 任务删除、挂起和恢复分析

一、任务删除

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)根据任务优先级判断是否需要进行任务切换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值