안녕하세요. 이번 포스팅은 FreeRTOS에서 제공하는 Run Time Statistics에 대한 포스팅을 하겠습니다.
공식 홈페이지에서는 매우 간략하게 설명이 나와있습니다. 제가 한 방법을 디테일하게 풀어 작성하겠습니다.
캡처를 할수 없어서 글로만 작성하는 점 양해해주세요.
목적 : FreeRTOS Run Time Statistics 적용
환경 | Zynq 7000(ZC 706)보드 |
IDLE | SDK |
FreeRTOS Version | FreeRTOS10_xilinx 1.2 version |
위 그림은 공식홈페이지에서 런타임 통계 결과에 대한 결과를 캡쳐본입니다. 웹페이지로 제공하진 않고 표에 있는 데이터를 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
참고 : https://support.xilinx.com/s/question/0D52E00006iHlG2SAK/freertos-vtaskgetruntimestats?language=en_US
'임베디드' 카테고리의 다른 글
[임베디드]Zynq 7000 TRM(UG585) - 7. Interrupt - 번역 (0) | 2023.02.07 |
---|---|
[임베디드-eclipse]Eclipse CDT 컴파일 옵션 설정 (0) | 2023.01.09 |
[임베디드-FreeRTOS]HALT : Task [name] overflowed its stack. Test [ProjectName] 오류 (0) | 2022.12.28 |
[임베디드]ARM 아키텍처 (0) | 2022.12.27 |