eric2013 发表于 2023-7-4 09:15:32

FreeRTOS上电创建首个任务初始化的几个链表



task.c文件:


static void prvInitialiseTaskLists( void )
{
UBaseType_t uxPriority;

      for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
      {
                vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
      }

      vListInitialise( &xDelayedTaskList1 );
      vListInitialise( &xDelayedTaskList2 );
      vListInitialise( &xPendingReadyList );

      #if ( INCLUDE_vTaskDelete == 1 )
      {
                vListInitialise( &xTasksWaitingTermination );
      }
      #endif /* INCLUDE_vTaskDelete */

      #if ( INCLUDE_vTaskSuspend == 1 )
      {
                vListInitialise( &xSuspendedTaskList );
      }
      #endif /* INCLUDE_vTaskSuspend */

      /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList
      using list2. */
      pxDelayedTaskList = &xDelayedTaskList1;
      pxOverflowDelayedTaskList = &xDelayedTaskList2;
}

eric2013 发表于 2023-7-5 01:27:20

链表解析


        UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime )
        {
        UBaseType_t uxTask = 0, uxQueue = configMAX_PRIORITIES;

                vTaskSuspendAll();
                {
                        /* Is there a space in the array for each task in the system? */
                        if( uxArraySize >= uxCurrentNumberOfTasks )
                        {
                                /* Fill in an TaskStatus_t structure with information on each
                                task in the Ready state. */
                                do
                                {
                                        uxQueue--;
                                        uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &( pxReadyTasksLists[ uxQueue ] ), eReady );

                                } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */

                                /* Fill in an TaskStatus_t structure with information on each
                                task in the Blocked state. */
                                uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxDelayedTaskList, eBlocked );
                                uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxOverflowDelayedTaskList, eBlocked );

                                #if( INCLUDE_vTaskDelete == 1 )
                                {
                                        /* Fill in an TaskStatus_t structure with information on
                                        each task that has been deleted but not yet cleaned up. */
                                        uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xTasksWaitingTermination, eDeleted );
                                }
                                #endif

                                #if ( INCLUDE_vTaskSuspend == 1 )
                                {
                                        /* Fill in an TaskStatus_t structure with information on
                                        each task in the Suspended state. */
                                        uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xSuspendedTaskList, eSuspended );
                                }
                                #endif

                                #if ( configGENERATE_RUN_TIME_STATS == 1)
                                {
                                        if( pulTotalRunTime != NULL )
                                        {
                                                #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE
                                                        portALT_GET_RUN_TIME_COUNTER_VALUE( ( *pulTotalRunTime ) );
                                                #else
                                                        *pulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE();
                                                #endif
                                        }
                                }
                                #else
                                {
                                        if( pulTotalRunTime != NULL )
                                        {
                                                *pulTotalRunTime = 0;
                                        }
                                }
                                #endif
                        }
                        else
                        {
                                mtCOVERAGE_TEST_MARKER();
                        }
                }
                ( void ) xTaskResumeAll();

                return uxTask;
        }

页: [1]
查看完整版本: FreeRTOS上电创建首个任务初始化的几个链表