FreeRTOS源码解析 -> vTaskResume()

来源:互联网 发布:iphone铃声下载软件 编辑:程序博客网 时间:2024/05/29 10:12


#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 placeit in the ready list. */pxTCB = ( tskTCB * ) pxTaskToResume;/* The parameter cannot be NULL as it is impossible to resume thecurrently 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 readylists 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, butwill leave the lists in the correct state for the next yield. *//*强制进行一次上下文切换*/portYIELD_WITHIN_API();}}}//退出临界区taskEXIT_CRITICAL();}}#endif


0 0
原创粉丝点击