안녕하세요.
지난 글에서, 인터럽트에 대해서 설명을 드리고, Timer를 이용하여
주기적인 인터럽트를 만들어 보았습니다.
이제 이 주기적인 인터럽트를 이용하여 스케줄링(scheduling)을 수행하는 Scheduler를 만들어
보도록 하겠습니다.
를 만들어 보도록 하겠습니다.
참고로 이 글은 개발의 전체적인 내용을 연재하고 있는 글이 중에 하나입니다.
그래서, 앞에쓴 글을 보시면 더욱 도움이 되실것 같습니다.
아래 글을 링크 걸어둘께요. 필요하신 분은 한번 읽어 보세요.
(물론 이 글만 보셔도 크게 문제는 없습니다.)
1) 임베디드 SW, MCU에 대한 정리 (feat. 임베디드 SW 비전)
https://embeddedchallenge.tistory.com/210
2) MCU 개발 장비 구매 방법 정리 (인피니언 MCU TC275 Lite)
https://embeddedchallenge.tistory.com/211
3) 임베디드 SW 개발 환경 세팅 방법 정리 (소스코드 편집기, 컴파일러, 디버거 환경 설정 방법)
https://embeddedchallenge.tistory.com/212
4) 인피니언 IDE Tool 사용방법 정리 (프로젝트 생성 및 다운로드 수행)
https://embeddedchallenge.tistory.com/219
5) 인피니언 MCU LED Blinking (TC275 GPIO 설정)
https://embeddedchallenge.tistory.com/225
6) 인피니언 MCU Clock, 오실레이터 에 대한 이해 (TC275 보드에서 확인)
https://embeddedchallenge.tistory.com/226
7) 인피니언 MCU PLL 설정 및 주변기기 Clock 설정 (TC275)
https://embeddedchallenge.tistory.com/227
8) 인피니언 MCU 인터럽트/Interrupt 설정 (TC275 동작 확인)
https://embeddedchallenge.tistory.com/228
그럼 Scheduler를 만들어 보도록 하겠습니다.
그전에 Scheduling이란 무엇을 의미하는 것일까요? 또 Scheduler는 무엇을 의미하는 것일까요?
1. Scheduling이란 무엇인가?
아래는 위키에서 설명하는 내용입니다.
스케줄링(scheduling)은 다중 프로그래밍을 가능하게 하는 운영 체제의 동작 기법입니다.
운영 체제는 프로세스들에게 CPU 등의 자원 배정을 적절히 함으로써 시스템의 성능을 개선할 수 있습니다.
그런데 조금 어렵죠?
쉽게 설명해 보도록 하겠습니다.
제가 자율 주행 자동차를 만들어 보겠습니다.
아주 저렴한 자율 주행 자동차여서,
일정한 속도로 자동차가 움직이다가,
자동차 앞에 부착된 센서에 사람이 인식하게 되면
차량을 멈추도록 설계해 보겠습니다.
그렇다면 3가지 큰 기능 함수가 필요할 것입니다.
1) 자동차가 일정한 속도로 움직이게 하는 기능
- function1();
2) 센서에서 장애물을 인식하는 기능
- function2();
3) 장애물을 인식하였을때, 차량을 멈추는 기능
- function3();
이렇게 3가지의 함수를 어떻게 할당해야 할까요?
아래와 같이 할당해야 할까요?
void main(void)
{
DrvSysInit();
while(1)
{
function1();
function2();
function3();
}
}
우선 저는 기능을 3개로 나누어서 돌리고 있습니다.
while 구문안에 계속 함수를 돌리는 것은 비효율 적입니다.
제가 만일 저 함수들을 1ms마다 동작시켜도 문제가 없도록 설계했다면
1ms 마다 저 함수들을 할당하면 조금더 CPU 부하를 줄일 수 있을 것입니다.
갑자기 위에서 이야기했던 내용이 떠오르네요.
'스케줄링(scheduling)은 다중 프로그래밍을 가능하게 하는 운영 체제의 동작 기법입니다.'
'운영 체제는 프로세스들에게 CPU 등의 자원 배정을 적절히 함으로써 시스템의 성능을 개선할 수 있습니다.'
만일 제가 1ms 마다 저 함수를 동작하도록 설계하고
저함수 들을 1ms마다 동작하는 함수안에 할당을 한다면
저는 이미 작은 운영체제를 만든 것입니다.
1ms Task 뿐만 아니라 10ms Task, 100ms Task를 만들어서, 적절하게
함수들을 배치해 준다면
다양한 기능들이 동시에 동작을 함으로서, 다중 프로그래밍이 가능해 집니다.
그렇다면 지금부터 한번 Scheduling을 수행해 보도록 하겠습니다.
Scheduling을 수행하기 위해서 먼저 Scheduler를 만들어야 겠네요.
2. Scheduler를 만들어 보자!
저는 우선 간단한 비선점형 static scheduling이 가능한 scheduler를 만들어 보도록 하겠습니다.
선점형, 비선점형이 무엇인지
static, dynamic이 무엇인지는 추후에 자세히 설명드리겠습니다.
저의 설계 목표는 아래와 같습니다.
1) 1ms, 10ms, 100ms 1s Task 할당이 가능한 Scheduler를 만듬
2) 각각의 Task에 다양한 함수를 할당
- 1ms Task에는 counter가 증가하는 함수를 할당
- 1s Task에는 LED를 Toggle하여 켰다 껏다를 반복하는 함수를 할당
이제 이 Scheduler를 만들어서 다중 프로그래밍 (1ms 마다 카운터증가 기능, 1초마다 LED Blinking 기능)이 가능해 졌습니다. 스톱워치 기능과 LED Blinking 기능이 들어갔네요.
앞장에서 설명했던 인터럽트 내용을 한번 회상해 보겠습니다.
이미 아래글에서 우리는 1ms 마다 인터럽트를 발생하는 동작을 구현하였습니다.
https://embeddedchallenge.tistory.com/228
우선 이것을 이용하여 스케쥴러를 구현해 보도록 하겠습니다.
아래와 같이 구현을 하였습니다.
먼저 Scheduler_Init 함수를 만들었습니다.
Scheduler를 만들기 위해 초기화가 필요한 부분입니다.
그리고 드디어 Scheduler를 만들었습니다.
저 Scheduler 함수가 돌면서
알아서 1ms, 10ms, 100ms 마다 아래 함수가 실행될 것입니다.
그리고 아래와 같이 1초에는 LED가 Toolge하는 기능을 할당하였습니다.
이제 저 함수안에 원하는 기능함수를 만들어 할당을 하면됩니다.
그러면 저 안의 구조는 어떻게 이루어져 있을까요?
우리는 지난시간 1ms마다 인터럽트 ISR 함수가 실행된다는 것을 알게 되었습니다.
따라서 1ms 마다 아래 STM_Int0Handler 함수가 실행될 것이고
아래 빨강 박스의 함수가 실행이 될것입니다.
빨강박스는 함수포인터입니다.
따라서 저 함수를 아래 함수와 연결시켜주면 아래 함수가 실행이 되게 됩니다.
Callback 함수 개념인데,
우선 넘어가도록 하게요 ㅎㅎ
중요한건 위의 빨강박스함수가 TaskScheulerCallbackFnc 이라는 것입니다.
TaskSchedulerCallbackFnc에서는
ulSchduler1msCounter가 1ms마다 1씩 증가하고 있습니다.
그리고 1m마다 Flag를 ON 시켜 주는 것을 볼수 있습니다.
그리고
드디어 While 구문에서 무한 반복하는 Scheduler는
아래와 같이 생겼습니다.
즉 인터럽트에서 Flag ON이 되면
이 Scheduler에서 Task 함수를 수행하고 Flag를 OFF로 만들어 주고 있습니다.
실제로 OS가 들어가지 않은 SW에서 가장 쉽게 만들수 있는 Scheduler 설계 방법입니다.
여기서 Task 마다 Offset 설정도 가능합니다.
실제로 Embdded SW는 내장된 기계에서 정해진 동작을 수행하기 때문에
Table화되어져 있는 위의 Schduler를 많이 사용합니다.
다시 설계목표를 확인해 볼게요.
1) 1ms, 10ms, 100ms 1s Task 할당이 가능한 Scheduler를 만듬
-> 위에서 만들었습니다.
2) 각각의 Task에 다양한 함수를 할당
- 1ms Task에는 counter가 증가하는 함수를 할당
- 1s Task에는 LED를 Toggle하여 켰다 껏다를 반복하는 함수를 할당
이제 우리는 원하는 함수단위의 기능을 만들어
Scheduler에 할당을 할면 됩니다.
드디어 SW를 설계할수 있는 기틀을 만들었습니다.
오늘 포스팅은 이것으로 마치도록 하겠습니다.
감사합니다.
'Embedded SW > [Infineon] TC275 Lite Project' 카테고리의 다른 글
Motor Driver L298N 사용법 정리 (인피니언 MCU 개발) (2) | 2021.11.26 |
---|---|
PWM이란 무엇인가? 인피니언 MCU를 이용한 PWM 설계 수행 (3) | 2021.11.21 |
인피니언 MCU 인터럽트/Interrupt 설정 (TC275 동작 확인) (4) | 2021.11.17 |
인피니언 MCU PLL 설정 및 주변기기 Clock 설정 (TC275) (7) | 2021.11.16 |
인피니언 MCU Clock, 오실레이터 에 대한 이해 (TC275 보드에서 확인) (2) | 2021.11.15 |
댓글