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 configuretimerforruntimestats( void );
uint32t getruntimecountervalue( void );
(#)define configGENERATERUNTIMESTATS 1
(#)define portCONFIGURETIMERFORRUNTIMESTATS() ( ulHighFrequencyTimerTicks = 0UL )
(#)define portGETRUNTIMECOUNTERVALUE() 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?
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 portCONFIGURETIMERFORRUNTIMESTATS() call a function that starts a free running timer, then have portGETRUNTIMECOUNTER_VALUE() just return the timer count value so you dont need a variable at all. I think the web has such an example too.
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?
See the description of the portCONFIGURETIMERFORRUNTIME_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.