Task 별 cpu 사용량
656
작성한 질문수 2
Task를 여러 개 생성 후, 우선 순위의 변화에 따라 cpu 사용량이 어떻게 변하는지 보고 싶어 "osGetCPUUsage" 함수를 통해 CPU 사용량을 측정하였습니다.
그런데 위의 함수는 전체 CPU 사용량을 측정하는 것으로 알고 있습니다.
저는 우선순위를 랜덤으로 준 후, 각 Task별 cpu 사용량을 알아 보고 싶은데, 혹시 각 Task의 cpu 사용량을 볼 수 있는 방법은 없을까요?
답변 1
0
안녕하세요. refwfa15y님!
태스크별로 CPU 점유시간및 백분율 통계를 실시간 확인하고 싶으신 것으로 이해하였습니다. 맞나요?
아래 참고 그림은 uC/OS-ii 에서의 관련 구현을 보여줍니다.
태스크 별 실행시간과 백분율을 보여주고 있습니다.
마이크로씨 오에스에서도 이러한 구현은 사용자가 직접 만들어야만 합니다. 커널 API 로 제공해주었으면 좋겠지만 실상은 그렇지 못합니다. 아래 설명드릴 내용들을 참고하셔서 freeRTOS 에서도 이와 비슷하게 구현하여 사용하시면 됩니다.
제가 과거에 구현해보았으니, 요약해서 말씀드리자면,
우선 SYSTICK 타이머외에 별도의 타이머 1개를 고해상도 타이머로 지정하여, micro seconds 해상도로 태스크 실행 시간을 측정할 수 있도록 합니다. 이때 사용자가 만들어야 하는 함수는 PC_ElapsedStart 와 PC_ElapsedStop 입니다.
마이크로씨 오에스에서는 OSTaskSwHook() 라는 콜백 함수를 지원합니다. 이 함수는 문맥 전환 때마다 커널이 호출해주는 사용자 작성 함수입니다.
아래 코드 (1) 라인을 보시면 time = PC_ElapsedStop(); 가장 최근에 실행한 태스크 실행 시간이 이 변수(time) 에 기록됩니다. 시간 단위는 마이크로 초입니다. 태스크 별로 미리 생성해 놓은 구조체 변수를TASK_USER_DATA *puser 구조체 포인터로 접근하여 time 을 저장하면 되는 것이죠. (7) 라인 참조
이렇게 해두면 실시간으로 개별 태스크별 실행 시간 통계 정보가 구조체에 지속적으로 기록됩니다.
현재 시간 기준 통계 정보를 보고 싶을 때 출력해서 보면 그것이 위에 보여드렸던 그림처럼 됩니다.
void OSTaskSwHook (void)
{
INT16U time;
TASK_USER_DATA *puser;
time = PC_ElapsedStop(); (1)
PC_ElapsedStart(); (2)
puser = OSTCBCur->OSTCBExtPtr; (3)
if (puser != (TASK_USER_DATA *)0) { (4)
puser->TaskCtr++; (5)
puser->TaskExecTime = time; (6)
puser->TaskTotExecTime += time; (7)
}
}관련 마이크로씨 오에스 소스 코드는 다음을 참고해주세요.
https://github.com/janwillemCA/UCOS-II-x86- <<< 저장소(repository)
https://github.com/janwillemCA/UCOS-II-x86-/blob/master/Ports/80x86/WIN32/GCC-MINGW/examples/example2/test.c <<< 통계 정보를 출력
https://github.com/janwillemCA/UCOS-II-x86-/blob/master/Ports/80x86/WIN32/GCC-MINGW/src/pc.c <<< 고해상도 타이머 제어
https://github.com/janwillemCA/UCOS-II-x86-/blob/master/Ports/80x86/WIN32/GCC-MINGW/src/os_cpu_c.c <<< 콜백 함수
만약에 포팅을 할때 1년에 한번 잡는 치명적인 문제를 해결하는 코드가 들어갔다고 가정하면
0
57
2
STM32 포팅할 때 STM32 Project가 없음
0
168
2
FreeRTOS 멀티코어 지원안됨?
0
87
2
[소스코드 분석-configUSE_TIME_SLICING] TASK1,2의 우선순위가 동일할 때, configUSE_TIME_SLICING값 변경에 따른 출력 변화
0
86
2
포팅 부탁드립니다!
0
60
1
포팅 부탁드립니다. <NUCLEO-G071RB>
0
67
2
상호배제 후 되지를 않아서 질문드립니다.
0
62
1
수료증 발급 기준 수정 요청
1
72
1
재진입가능여부에 관한 질문
1
68
1
01_TASKMAN프로젝트 디버깅 모드 실패
1
77
2
그러면 malloc/free가 아닌 동적할당자를 써서 메모리를 할당했기떄문에
1
71
2
실행순서
1
77
2
uart 전송중에는 스위칭이 금지되나요?
1
74
2
스택오버플로우 실습 중 stack size 설정 질문
0
82
2
포팅 원합니다.
2
77
2
코루틴 실습질문
1
101
2
TODO 2번 문제
1
141
4
10. 선점형 커널 그림 설명중 우선순위가 반대인 경우에도 Task B가 먼저 수행되나요?
1
82
2
디버거모드에 진입이 안됩니다.
0
176
2
prvExampleTaskHook 함수 호출 부분에 대해 문의드립니다.
0
120
2
보드 STM32H735IG와 강의 호환 여부 문의
1
153
3
[ L152RE ] 원샷 소프트타이머 실행 잘 되시나요?
1
159
2
Deferred Interrupt Processing 샘플 예제 문의 드립니다.
1
121
2
포팅 서비스 부탁드립니다
1
125
2





