void IBN_ListTaskWithinSingleList (xList *pxList, char *pcStatus ) { volatile tskTCB *pxNextTCB, *pxFirstTCB; u16 usStackRemaining; u64 ullTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); u64 ullStatsAsPercentage; /* Write the details of all the TCB's in pxList into the buffer. */ listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); do { listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); usStackRemaining = usTaskCheckFreeStackSpace( ( unsigned char * ) pxNextTCB->pxStack ); ullStatsAsPercentage = (u64)0; if ((u64)0 != ullTotalRunTime) { ullStatsAsPercentage = (u64)10000 * (u64)(pxNextTCB->ullRunTimeCounter); ullStatsAsPercentage /= ullTotalRunTime; } CI_LocalPrintf("%-21.21s ", pxNextTCB->pcTaskName); CI_LocalPrintf("%s ", pcStatus); CI_LocalPrintf("%u ", ( unsigned int ) pxNextTCB->uxPriority); CI_LocalPrintf("%5u ", usStackRemaining); CI_LocalPrintf("%10u ", (u32)(pxNextTCB->ullRunTimeCounter / 60ULL)); CI_LocalPrintf("%s ", TIME_MEASURING_ShortText (pxNextTCB->ullRunTimeCounter / 60ULL)); CI_LocalPrintf("%6.2f %% ",(float)ullStatsAsPercentage/100.0); CI_LocalPrintf("%7u \r\n", pxNextTCB->ulRunCounter); // CI_LocalPrintf( ( char * ) "%-21.21s %s %u %5u %9u %6.2f %%\r\n", pxNextTCB->pcTaskName, pcStatus, ( unsigned int ) pxNextTCB->uxPriority, usStackRemaining,pxNextTCB->ullRunTimeCounter/60,(float)ullStatsAsPercentage/100.0); } while( pxNextTCB != pxFirstTCB ); }
/** * Initialize library */ int32_t TaskMonitorInitialize(void) { lock = xSemaphoreCreateRecursiveMutex(); memset(handles, 0, sizeof(xTaskHandle)*TASKINFO_RUNNING_NUMELEM); lastMonitorTime = portGET_RUN_TIME_COUNTER_VALUE(); return 0; }
void IBN_Taskdata (u8 i) { u64 ullTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); u64 ullStatsAsPercentage; u16 usStackRemaining; usStackRemaining = usTaskCheckFreeStackSpace( ( unsigned char * ) IBN_Tasklist_st[i]->pxStack ) * sizeof (portSTACK_TYPE); ullStatsAsPercentage = (u64)0; if ((u64)0 != ullTotalRunTime) { ullStatsAsPercentage = (u64)10000 * (u64)(IBN_Tasklist_st[i]->ullRunTimeCounter); ullStatsAsPercentage /= ullTotalRunTime; } CI_LocalPrintf( ( char * ) "%-21.21s ", IBN_Tasklist_st[i]->pcTaskName); CI_LocalPrintf( ( char * ) "%s ", IBN_TaskStates[IBN_TasklistState_u8[i]]); CI_LocalPrintf( ( char * ) "%u ", ( unsigned int ) IBN_Tasklist_st[i]->uxPriority); CI_LocalPrintf( ( char * ) "%5u ", usStackRemaining); // CI_LocalPrintf( ( char * ) "%10u ", (u32)(IBN_Tasklist_st[i]->ullRunTimeCounter / 60ULL)); CI_LocalPrintf("%s ", TIME_MEASURING_ShortText (IBN_Tasklist_st[i]->ullRunTimeCounter / 60ULL)); CI_LocalPrintf( ( char * ) "%6.2f %% ",(float)ullStatsAsPercentage/100.0); CI_LocalPrintf( ( char * ) "%6.2f %% ",(float)IBN_Tasklist_st[i]->ullRunTimeCounterLastMinute/(10000.0*60.0*60.0)*(float)(configTICK_RATE_HZ)/1000.0); CI_LocalPrintf( ( char * ) "%8u \r\n", IBN_Tasklist_st[i]->ulRunCounter); }
/** * Update the status of all tasks */ void TaskMonitorUpdateAll(void) { #if defined(DIAGNOSTICS) TaskInfoData data; int n; // Lock xSemaphoreTakeRecursive(lock, portMAX_DELAY); #if ( configGENERATE_RUN_TIME_STATS == 1 ) uint32_t currentTime; uint32_t deltaTime; /* * Calculate the amount of elapsed run time between the last time we * measured and now. Scale so that we can convert task run times * directly to percentages. */ currentTime = portGET_RUN_TIME_COUNTER_VALUE(); deltaTime = ((currentTime - lastMonitorTime) / 100) ? : 1; /* avoid divide-by-zero if the interval is too small */ lastMonitorTime = currentTime; #endif // Update all task information for (n = 0; n < TASKINFO_RUNNING_NUMELEM; ++n) { if (handles[n] != 0) { data.Running[n] = TASKINFO_RUNNING_TRUE; #if defined(ARCH_POSIX) || defined(ARCH_WIN32) data.StackRemaining[n] = 10000; #else data.StackRemaining[n] = uxTaskGetStackHighWaterMark(handles[n]) * 4; #if ( configGENERATE_RUN_TIME_STATS == 1 ) /* Generate run time stats */ data.RunningTime[n] = uxTaskGetRunTime(handles[n]) / deltaTime; #endif #endif } else { data.Running[n] = TASKINFO_RUNNING_FALSE; data.StackRemaining[n] = 0; data.RunningTime[n] = 0; } } // Update object TaskInfoSet(&data); // Done xSemaphoreGiveRecursive(lock); #endif }
/** * Update the status of all tasks */ void TaskMonitorUpdateAll(void) { #if defined(DIAG_TASKS) TaskInfoData data; int n; // Lock PIOS_Mutex_Lock(lock, PIOS_MUTEX_TIMEOUT_MAX); uint32_t currentTime; uint32_t deltaTime; /* * Calculate the amount of elapsed run time between the last time we * measured and now. Scale so that we can convert task run times * directly to percentages. */ #if defined(PIOS_INCLUDE_FREERTOS) currentTime = portGET_RUN_TIME_COUNTER_VALUE(); #elif defined(PIOS_INCLUDE_CHIBIOS) currentTime = hal_lld_get_counter_value(); #endif /* defined(PIOS_INCLUDE_CHIBIOS) */ deltaTime = ((currentTime - lastMonitorTime) / 100) ? : 1; /* avoid divide-by-zero if the interval is too small */ lastMonitorTime = currentTime; // Update all task information for (n = 0; n < TASKINFO_RUNNING_NUMELEM; ++n) { if (handles[n] != 0) { data.Running[n] = TASKINFO_RUNNING_TRUE; data.StackRemaining[n] = PIOS_Thread_Get_Stack_Usage(handles[n]); /* Generate run time stats */ data.RunningTime[n] = PIOS_Thread_Get_Runtime(handles[n]) / deltaTime; } else { data.Running[n] = TASKINFO_RUNNING_FALSE; data.StackRemaining[n] = 0; data.RunningTime[n] = 0; } } // Update object TaskInfoSet(&data); // Done PIOS_Mutex_Unlock(lock); #endif }
/** * Initialize library */ int32_t TaskMonitorInitialize(void) { lock = PIOS_Mutex_Create(); PIOS_Assert(lock != NULL); memset(handles, 0, sizeof(struct pios_thread) * TASKINFO_RUNNING_NUMELEM); lastMonitorTime = 0; #if defined(DIAG_TASKS) #if defined(PIOS_INCLUDE_FREERTOS) lastMonitorTime = portGET_RUN_TIME_COUNTER_VALUE(); #elif defined(PIOS_INCLUDE_CHIBIOS) lastMonitorTime = halGetCounterValue(); #endif /* defined(PIOS_INCLUDE_CHIBIOS) */ #endif return 0; }
/** * Update the status of all tasks */ void TaskMonitorUpdateAll(void) { TaskInfoData data; int n; // Lock xSemaphoreTakeRecursive(lock, portMAX_DELAY); // Update all task information for (n = 0; n < TASKINFO_RUNNING_NUMELEM; ++n) { if (handles[n] != 0) { data.Running[n] = TASKINFO_RUNNING_TRUE; #if defined(ARCH_POSIX) || defined(ARCH_WIN32) data.StackRemaining[n] = 10000; #else data.StackRemaining[n] = uxTaskGetStackHighWaterMark(handles[n]) * 4; #if ( configGENERATE_RUN_TIME_STATS == 1 ) /* Generate run time stats */ data.RunningTime[n] = 100 * (float) uxTaskGetRunTime(handles[n]) / portGET_RUN_TIME_COUNTER_VALUE(); #endif #endif } else { data.Running[n] = TASKINFO_RUNNING_FALSE; data.StackRemaining[n] = 0; data.RunningTime[n] = 0; } } // Update object TaskInfoSet(&data); // Done xSemaphoreGiveRecursive(lock); }