FreeRTOS(V8.0.1)系统之vTaskDelete()

<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();
			}
		}
	}


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值