본문 바로가기

임베디드

[임베디드-FreeRTOS]Task 프로파일링 - Run Time Statistics(런타임 통계)

반응형

안녕하세요. 이번 포스팅은 FreeRTOS에서 제공하는 Run Time Statistics에 대한 포스팅을 하겠습니다.

 

공식 홈페이지에서는 매우 간략하게 설명이 나와있습니다. 제가 한 방법을 디테일하게 풀어 작성하겠습니다.

 

캡처를 할수 없어서 글로만 작성하는 점 양해해주세요.

 

 


목적 : FreeRTOS Run Time Statistics 적용

환경  Zynq 7000(ZC 706)보드
IDLE  SDK
FreeRTOS Version FreeRTOS10_xilinx 1.2 version

 

Run Time Statistics 출력 결과

위 그림은 공식홈페이지에서 런타임 통계 결과에 대한 결과를 캡쳐본입니다. 웹페이지로 제공하진 않고 표에 있는 데이터를 ASCII로 받아옵니다.

 

※ZYNQ보드를 사용하기 때문에 제공하는 SDK에서 설정하는 방법에 대해 서술합니다.

   ( 프로젝트는 생성되어 있는 기준으로 작성되었습니다.)

 

1. BSP 프로젝트 설정

    1) SDK에서 [Project Explorer] → BSP 프로젝트 우 클릭 → [Board Support Package Setting] 선택 → [freertos10_xilinx] 탭에서 kernerl_features를 선태

    2) use_stats_formatting_functions, use_task_notifications, use_tace_facility 항목 true로 변경

 

2. FreeRTOSConfig.h 설정

   1) 하단 표 내용을 FreeRTOSConfig.h 가장 하단에 추가

        #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (ulTotalRunTime = 0UL)
        #define portGET_RUN_TIME_COUNTER_VALUE()        ulTotalRunTime
        
        #define configUSE_STATS_FORMATTING_FUNCTIONS    1
        #define configUSE_TRACE_FACILITY                1
        #define configGENERATE_RUN_TIME_STATS             1

 

3. task.c 설정

    1) 하단 표 내용을 xTickCount가 증가하는 함수에 추가

         - xTaskIncrementTick(void)에 추가함

BaseType_t xTaskIncrementTick( void )
{
TCB_t * pxTCB;
TickType_t xItemValue;
BaseType_t xSwitchRequired = pdFALSE;

	/* Called by the portable layer each time a tick interrupt occurs.
	Increments the tick then checks to see if the new tick value will cause any
	tasks to be unblocked. */
	traceTASK_INCREMENT_TICK( xTickCount );
	if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
	{
		/* Minor optimisation.  The tick count cannot change in this
		block. */
		const TickType_t xConstTickCount = xTickCount + 1;

		/* Increment the RTOS tick, switching the delayed and overflowed
		delayed lists if it wraps to 0. */
		xTickCount = xConstTickCount;
        
        ulTotalRunTime = xConstTickCount;	//추가한 내용...

		if( xConstTickCount == ( TickType_t ) 0U )
		{
			taskSWITCH_DELAYED_LISTS();
		}
		else
		{
			mtCOVERAGE_TEST_MARKER();
		}

....

 

4. task.c 설정

    1) 하단 표 내용을 xTickCount가 증가하는 함수에 추가

 

 

5. 런타임 통계 출력

    1) 소스코드로 Task를 생성해서 출력하면 런타임 통계 정보 출력

 

※ 출력

캡쳐를 할 수 없는 환경이기에 예시 데이터를 첨부합니다.

---------------------------------------------------------

print run time stats...

IDLE      10        2%

Task1     50       11%

Task2     80       18%

Task3    300      68%

---------------------------------------------------------

 

※ 주의사항

SDK에서 개발하다보니 자동으로 생성되는 BSP 때문에 FreeRTOSConfig.h, Task.c를 수정해도 계속 원상복구 되는 문제가 있었습니다. 알고보니 BSP에는 2가지의 동일한 파일이 있습니다.

아래 표를 참고하세요. 두개의 같은 파일명이 있습니다. 

    - %프로젝트%\ps7_cortexa9_0\include\FreeRTOSConfig.h  해당 파일은 변경해도 계속 덮어 써짐..(원상복구)
수정 X
    - %프로젝트%\ps7_cortexa9_0\libsc\freertos10_xilinx_v1_2\FreeRTOSConfig.h 해당 파일 수정
수정 O

 

 

 

※ 제약사항

FreeRTOS에서 제공하는 런타임 분석은 마이크로세컨드(?,,, 아닐수도 있습니다.) 단위로 Task를 분석할 수 있습니다. 하지만 제가 작성한 포스팅에는 Tik단위로 CPU의 점유율을 가져옵니다.

 

 

 

 

 

 

출처 : https://www.freertos.org/rtos-run-time-stats.html

 

FreeRTOS Run Time Stats

FreeRTOS is a portable, open source, mini Real Time kernel. A free RTOS for small embedded systems

www.freertos.org

 

참고 : https://support.xilinx.com/s/question/0D52E00006iHlG2SAK/freertos-vtaskgetruntimestats?language=en_US

반응형