CS 지식 정리

MCU 스케줄링(Scheduling)의 이해 및 TC275 기반 실습

termuni 2025. 2. 18. 11:18

IVS의 교육 중 제어조교 라고 하시는 유튜버 분이 준교수 신분으로서 교육을 들어오셨었다. 

 

 

제어조교 〈Ctrl튜브〉

제어는 쉽고 재밌고 늘 새롭고 짜릿합니다! 연구실 홈페이지: https://www.cstlab-cau.com/ 질문과 요청은 비지니스 문의를 클릭하고 메일로 보내주세요!

www.youtube.com

 

처음에는 유튜브를 하신다고 하셔서 좀 당황했고, 거기에다 매트랩 수업을 계획중이었는데 취소되어 더욱 당황했었다. 허나 덕분에 MCU에 대해 더 자세히 차근차근 배우게 되었기에, 오히려 좋다고 생각했다.

 

오늘 정리할 내용으로는 Real Time OS 내에서 스케쥴링의 의미와 그 과정을 적을 예정이다.

 

우선 기자재 설명부터 적어두겠다.

TC275 Shield Buddy, Trace32를 사용하였으며 코드 작성 및 디버깅을 위해 Aurix Studio와 DAS 등을 사용하였다.

 

스케쥴러를 만들기 전, 스케쥴러란 무엇이고 왜 필요한지 간략하게 설명하겠다.

 

다른 티스토리 블로거분의 글에서 많이 도움받았다..! 감사합니다... ( https://embeddedchallenge.tistory.com/226 ~ 229 )


우선 스케줄링이란 무엇인가?

 

스케줄링이란 다중 프로그래밍을 가능하게 하는 운영 체제의 동작 방법으로, 운영 체제는 프로세스들에게 CPU 등의 자원 배정을 적절히 함으로서 시스템의 성능 개선이 가능하다.

 

이게 무슨 소리인가 하면, Function Call 타이밍을 임의 조절할 수 있다는 것이다.

 

예를 들어 컴퓨터에서 게임을 하면서 동시에 음악을 듣는다고 해보자.

 

함수 1() : 게임 실행 (약 10ms마다 실행해도 됨)

함수 2() : 영상 재생 (약 100ms마다 실행해도 됨)

 

while(1)

{

    함수 1();

    함수 2();

}

 

이렇게 되어있다면?

 

게임 실행과 영상 재생이 각각 동일한 간격으로 잘 실행이 된다면 문제 없겠지만, 굳이 싶을거다. 함수 1과 함수 2를 저렇게 계속 실행 시킬 이유가 하나도 없고, 심지어 CPU의 부하를 줄이려면 게임은 10ms마다 실행시키고, 영상 재생은 100ms마다 실행시키는 것이 훨 낫다!

 

그렇기에, CPU는 게임 실행 → 영상 재생 → 게임 실행 → 영상 재생을 빠르게 번갈아 가며 실행하기 보다, 각자 함수가 필요한 시간마다 일정 주기로 반복해서 실행하는 방향으로 바꾸는 것이 필요하다!

 

즉 이렇게 다중 프로그래밍을 가능하게 하고, CPU 등의 자원 배정을 적절히 함으로서 시스템 성능 개선을 꾀하는 것이 스케줄링이다. 


그렇다면 이 스케줄링을 하기 위해 필요한 것은 정확히 일정 주기마다 신호를 만들어주는 것이 필요할 것이다. 

 

이에 필요한 것이 클락이며, 그 클락을 생성해주는 소자가 오실레이터 이다. 

TC275 기준으로 달려있는 크리스탈은 약 20Mhz의 사인 파를 발생시켜주며, 주변 모듈을 활용해 이 클락을 200Mhz까지 올려줄 수 있다.

(https://embeddedchallenge.tistory.com/226, https://embeddedchallenge.tistory.com/227 을 보면 더 자세한 내용을 참고할 수 있으며, 오늘 이 글에서는 이런게 있다 정도 짚고 넘어갈 예정)

 

이 방식을 PLL(Phased-Locked Loop)이라고 하며, 

 

이와 같은 구조를 통해 펌핑한다고 한다... 사실 잘 모르겠다!!

오랜시간 붙잡고 고민했는데 이게 무슨소리인가 싶었다. 

 

심지어 그 이후에도 System Timer의 Clock을 분배하는 원리도 있는데, 잘 모르겠다. ㅜㅜ

 

어쨋든 인피니언에서 제공하는 Low Level 드라이버를 통해 (ILLD) 주어진 주파수 값들을 보면 다음과 같다.

ClockSettingInfo.fPllFreq = IfxScuCcu_getPllFrequency();
ClockSettingInfo.fSourceFreq = IfxScuCcu_getSourceFrequency();	//fsource = 200MHz

ClockSettingInfo.fSriFreq = IfxScuCcu_getSriFrequency();	//fSRI = 200MHz
ClockSettingInfo.fSpbFreq = IfxScuCcu_getSpbFrequency();	//fSPB = 100MHz

ClockSettingInfo.fCpu0Freq = IfxScuCcu_getCpuFrequency(0);	//fCPU0 = 200MHz
ClockSettingInfo.fCpu1Freq = IfxScuCcu_getCpuFrequency(1);	//fCPU1 = 200MHz
ClockSettingInfo.fCpu2Freq = IfxScuCcu_getCpuFrequency(2);	//fCPU2 = 200MHz

ClockSettingInfo.fFsiFreq = IfxScuCcu_getFsiFrequency();	//fFSI = 100MHz
ClockSettingInfo.fFsi2Freq = IfxScuCcu_getFsi2Frequency();	//fFSI2 = 200MHz

ClockSettingInfo.fStmFreq = IfxScuCcu_getStmFrequency();	//fSTM = 100MHz
ClockSettingInfo.fGtmFreq = IfxScuCcu_getGtmFrequency();	//fGTM = 100MHz

ClockSettingInfo.fCanFreq = IfxScuCcu_getCanFrequency();	//fCAN = 100MHz

 

 


위 값들 중 STM(System Timer Module)을 사용하여 1ms 주기마다 실행되는 영역을 만들어 주려고 하는데... 어떻게 만들어 주어야 할까?

 

그것은 바로 STM이 10만번 진동하는 순간마다 인터럽트(interrupt)를 발생시켜주는 것이다. 

 

인터럽트를 사용하는 이유는, 어떤 상황이던 상관 없이 정확히 같은 주기로 유지해줄 수 있기 때문!!

 

만약 관련 실습 코드를 보고싶다면, 

https://embeddedchallenge.tistory.com/229

 

스케줄링(scheduling)에 대한 정리, 인피니언 MCU Scheduler 설계 정리

안녕하세요. 지난 글에서, 인터럽트에 대해서 설명을 드리고, Timer를 이용하여 주기적인 인터럽트를 만들어 보았습니다. 이제 이 주기적인 인터럽트를 이용하여 스케줄링(scheduling)을 수행하는 Sc

embeddedchallenge.tistory.com

여기에 스케줄링 코드가 잘 나와있다.(교재랑 같은 내용..)

참고하면 좋을 듯.