How to reset vTaskGetRunTimeStats?

richarddamon wrote on Monday, May 20, 2019:

I work a freertos_tacks_c_additions.h header file that does that shown below:

Call vTaskClearUsage() to reset all the execution time stats.

Hasn’t been thoughouly tested, but seems to work for me.
(FreeRTOSAdditions.h is a header file to provide the prototype for vTaskClearUsage() so other files can call this.)


#ifndef FREERTOS_FREERTOSPP_FREERTOS_TASKS_C_ADDITIONS_H
#define FREERTOS_FREERTOSPP_FREERTOS_TASKS_C_ADDITIONS_H

#include <FreeRTOSAdditions.h>

void vTaskClearUsageSingleList(List_t *pxList)
{
	configLIST_VOLATILE TCB_t *pxNextTCB, *pxFirstTCB;

	if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) {
		listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList );

		/* Clear Usage for each task that is referenced from
		pxList.  See the definition of TaskStatus_t in task.h for the
		meaning of each TaskStatus_t structure member. */
		do {
			listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList );
			pxNextTCB->ulRunTimeCounter = 0;
		} while( pxNextTCB != pxFirstTCB );
	}
}

void vTaskClearUsage() {
	UBaseType_t uxQueue = configMAX_PRIORITIES;
	vTaskSuspendAll();
	/* Clear runtime counter for each task in the Ready State */
	do {
		uxQueue--;
		vTaskClearUsageSingleList(&( pxReadyTasksLists[ uxQueue ] ));
	} while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */

	/* Clear runtime counter for each task in the Blocked state. */
	vTaskClearUsageSingleList(( List_t * ) pxDelayedTaskList);
	vTaskClearUsageSingleList(( List_t * ) pxOverflowDelayedTaskList);

#if( INCLUDE_vTaskDelete == 1 )
	/* Clear runtime counter for each task that has been deleted but not yet cleaned up. */
	vTaskClearUsageSingleList(&xTasksWaitingTermination);
#endif

#if ( INCLUDE_vTaskSuspend == 1 )
	/* Clear runtime counter for each task in the Suspended state. */
	vTaskClearUsageSingleList(&xSuspendedTaskList);
#endif
	ulTaskSwitchedInTime = 0;
	ulTotalRunTime = 0;
	vConfigureTimerForRunTimeStats();
	xTaskResumeAll();
}

#endif /* FREERTOS_FREERTOSPP_FREERTOS_TASKS_C_ADDITIONS_H_ */