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 configGENERATERUNTIMESTATS 1 (#)define portCONFIGURETIMERFORRUNTIMESTATS() ( ulHighFrequencyTimerTicks = 0UL ) (#)define portGETRUNTIMECOUNTERVALUE() ulHighFrequencyTimerTicks (#)endif 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: taskFIRSTCHECKFORSTACKOVERFLOW(); 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: http://www.freertos.org/rtos-run-time-stats.html 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.
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.