FreeRTOS源码解析 -> vTaskResume()


#if ( INCLUDE_vTaskSuspend == 1 )

	void vTaskResume( xTaskHandle pxTaskToResume )
	{
	    tskTCB *pxTCB;

		/* It does not make sense to resume the calling task. */
		configASSERT( pxTaskToResume );

		/* Remove the task from whichever list it is currently in, and place
		it in the ready list. */
		pxTCB = ( tskTCB * ) pxTaskToResume;

		/* The parameter cannot be NULL as it is impossible to resume the
		currently executing task. */
		//要恢复的task不为空并且不是当前正在运行的task(如果是当前运行的还恢复个毛线)
		//熟悉的链表操作啊
		if( ( pxTCB != NULL ) && ( pxTCB != pxCurrentTCB ) )
		{	
			//进入临界区
			taskENTER_CRITICAL();
			{
				//判断要恢复的task是否在挂起列表中
				if( xTaskIsTaskSuspended( pxTCB ) == pdTRUE )
				{
					traceTASK_RESUME( pxTCB );

					/* As we are in a critical section we can access the ready
					lists even if the scheduler is suspended. */
					//从挂起链表中删除,加入到ready队列中(恢复到就绪态)
					vListRemove(  &( pxTCB->xGenericListItem ) );
					prvAddTaskToReadyQueue( pxTCB );
                    
					//如果恢复的task优先级比当前正在运行的任务的优先级高,强制一次任务调度
					//这里为什么不去判断当前调度器是否在运行(之前可是都判断了的)????
					/* We may have just resumed a higher priority task. */
					if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )
					{
						/* This yield may not cause the task just resumed to run, but
						will leave the lists in the correct state for the next yield. */
						/*强制进行一次上下文切换*/
						portYIELD_WITHIN_API();
					}
				}
			}
			//退出临界区
			taskEXIT_CRITICAL();
		}
	}

#endif


你可能感兴趣的:(FreeRTOS)