FreeRTOS 源码注释(prvCheckTasksWaitingTermination)

/*FreeRTOS 中删除任务是分两步的,第一步 vTaskDelete 将其从各个工作链表中断开,放到xTasksWaitingTermination 链表中,第二步 Idle Task 调用这个函数真正的删除任务。代码很简单,不需要注释了。 */

static void prvCheckTasksWaitingTermination( void ) { #if ( INCLUDE_vTaskDelete == 1 ) { portBASE_TYPE xListIsEmpty; if( uxTasksDeleted > ( unsigned portBASE_TYPE ) 0 ) { vTaskSuspendAll(); xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination ); xTaskResumeAll(); if( xListIsEmpty == pdFALSE ) { tskTCB *pxTCB; taskENTER_CRITICAL(); { pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( ( ( xList * ) &xTasksWaitingTermination ) ); vListRemove( &( pxTCB->xGenericListItem ) ); --uxCurrentNumberOfTasks; --uxTasksDeleted; } taskEXIT_CRITICAL(); prvDeleteTCB( pxTCB ); } } } #endif } static void prvDeleteTCB( tskTCB *pxTCB ) { vPortFreeAligned( pxTCB->pxStack ); vPortFree( pxTCB ); }

/*FreeRTOS 中删除任务是分两步的,第一步 vTaskDelete 将其从各个工作链表中断开,放到xTasksWaitingTermination 链表中,第二步 Idle Task 调用这个函数真正的删除任务。代码很简单,不需要注释了。 */ static void prvCheckTasksWaitingTermination( void ) { #if ( INCLUDE_vTaskDelete == 1 ) { portBASE_TYPE xListIsEmpty; if( uxTasksDeleted > ( unsigned portBASE_TYPE ) 0 ) { vTaskSuspendAll(); xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination ); xTaskResumeAll(); if( xListIsEmpty == pdFALSE ) { tskTCB *pxTCB; taskENTER_CRITICAL(); { pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( ( ( xList * ) &xTasksWaitingTermination ) ); vListRemove( &( pxTCB->xGenericListItem ) ); --uxCurrentNumberOfTasks; --uxTasksDeleted; } taskEXIT_CRITICAL(); prvDeleteTCB( pxTCB ); } } } #endif } static void prvDeleteTCB( tskTCB *pxTCB ) { vPortFreeAligned( pxTCB->pxStack ); vPortFree( pxTCB ); }
经验分享 程序员 微信小程序 职场和发展