IDLE task return 0 ulRunTime

josephmuziki wrote on Wednesday, December 04, 2013:

Hi

I am running freeRTOS v7.6.0 on an STM32F4 discovery board. I am currently running 14 tasks and im curious to find out some information about which tasks are taking up the most CPU usage and how much head room i have left. I attempted to use uxTaskGetSystemState function and my idle task(which i am assuming will run when the processor is free) is returning a runtime of 0. The runtime of all the other tasks adds up to about 20% of the total runtime(not sure whats happening the other 80%). I have configured an external clock running at 100 times the speed of the rtos tick. I am not sure what i am doing wrong as i am expecting to IDLE task to be running for the majority of the time.

External Timer Configuration:

::c
//in main.c
void TIM5_IRQHandler(void)
{

/* Check if interrupt has occured /
if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
{
/
Clear interrupt pending bit */
TIM_ClearITPendingBit(TIM5, TIM_IT_Update);

ulHighFrequencyTimerTicks++; //counter incrementing at 100kHz

}

}

//in FreeRTOSConfig.h
extern volatile unsigned long ulHighFrequencyTimerTicks;
/* ulHighFrequencyTimerTicks is already being incremented at 20KHz. Just set
its value back to 0. */

define configUSE_STATS_FORMATTING_FUNCTIONS 1
define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ( ulHighFrequencyTimerTicks = 0UL )
define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTimerTicks

Configuration of task where function call is made:

void vMonitorTask(void *pvParameters) {

signed char stats[ 1024];
xTaskStatusType *pxTaskStatusArray;
volatile unsigned portBASE_TYPE uxArraySize;
unsigned long ulTotalRunTime;

for (;:wink: {

// Take a snapshot of the number of tasks in case it changes while this function is executing.
 uxArraySize = uxTaskGetNumberOfTasks(); //uxCurrentNumberOfTasks();
 WWDG_SetCounter(127);

// Allocate a xTaskStatusType structure for each task. An array could be allocated statically at compile time.
pxTaskStatusArray = pvPortMalloc( (uxTaskGetNumberOfTasks()) * (sizeof( xTaskStatusType )) );

 if( pxTaskStatusArray != NULL )
  {
      // Generate raw status information about each task.
      uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalRunTime );
      WWDG_SetCounter(127);
  }

xTaskStatusType test = pxTaskStatusArray[0];

}
}

Thanks in advance :slight_smile:

davedoors wrote on Wednesday, December 04, 2013:

Presumably the other 80% is used by the idle task but for some reason the value is not being output. Stepping through the uxTaskGetSystemState() in the debugger will show you why that is.