vTaskGetRunTimeStats Errors

gstenos wrote on Friday, August 05, 2016:

I’m running FreeRTOS v 7.3.0 and am having trouble getting vTaskGetRunTimeStats() to compile in my code.

In FreeRTOSConfig.h I added the following line at the top of the file;
extern volatile unsigned long ulHighFrequencyTimerTicks;

This is how my code looks like for enabling run time stats in the file, in code it is just # and not (#), for some reason when I just do # as the first character on the line it turns the text into huge header text.

/* Run time stats gathering definitions. */
(#)if defined (GNUC) || defined (ICCARM)
void configure_timer_for_run_time_stats( void );
uint32_t get_run_time_counter_value( void );

(#)define configGENERATE_RUN_TIME_STATS 1
(#)define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ( ulHighFrequencyTimerTicks = 0UL )
(#)define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTimerTicks

These are the errors I get, they are all located in tasks.c:
undefined reference to `ulHighFrequencyTimerTicks’ tasks.c 1098
Code at 1098:
pxCurrentTCB = NULL;

undefined reference to `ulHighFrequencyTimerTicks’ tasks.c 1594
Code at 1594:
prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) pxDelayedTaskList, ulTotalRunTime );

undefined reference to `ulHighFrequencyTimerTicks’ tasks.c 1851
Code at 1851:

undefined reference to `ulHighFrequencyTimerTicks’ tasks.c 2414
Code at 2414:
vPortFree( pxNewTCB );

I’ve made certain tasks.c includes FreeRTOS.h which includes FreeRTOSConfig.h where the variable is decalred. Is there something else I need to do to the variable in order for it to be used in tasks.c?

edwards3 wrote on Friday, August 05, 2016:

I can only see an extern declaration for ulHighFrequencyTimerTicks in the code you posted, you need also to declare the variable somewhere in a C file.

ulHighFrequencyTimerTicks is not provided with FreeRTOS, you have to provide it yourself. The example on the web shows the variable being incremented in a fast timer isr, which is ok if your app has a fast timer isr anyway, but if not its more efficient to have portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() call a function that starts a free running timer, then have portGET_RUN_TIME_COUNTER_VALUE() just return the timer count value so you dont need a variable at all. I think the web has such an example too.

gstenos wrote on Friday, August 05, 2016:

Ahhhh I see, I thought tasks.c would still have scope of the variable. If that’s the case then would I be able to just use xTaskGetTickCount() instead of creating a new timer entirely?

rtel wrote on Saturday, August 06, 2016:

See the description of the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
macro on the following page:

While you could use the tick count, the resolution would not be high
enough to give you accurate results because you could not measure tasks
that executed for a fraction of a tick period.