RTOS 의 핵심 기술!!!!! 

Context Switching 납시셨습니다 ㅋㅋㅋ

하나의 CPU 로 다중 작업을 수행할수 있도록 해주는 아주 혁신적인 기능이지용 ㅋㅋㅋ 

일단 이놈의 Context Switching 을 이해시키기 위해 아주 간단하게 그림을 하나 그려보았습니다

 

각기 다른 일을 할 수 있는 뇌가 여러개 있다고 생각해 봅시다.

이 모든 일은 동시에 수행이 되어야 하며, 일을 수행할 몸은 한개 밖에 없다고 가정해 보지요

프로그래머는 각각의 뇌에 모두 같은 몸이 달려있다고 가정한 후 프로그래밍을 마쳤습니다.

이제 해야할 일은???

징그럽긴 하지만, 가운데에 머리에사진에 내 뇌를 가져다 끼우기만 하면 되네요.

1번일이 하고싶을때는 1번 뇌를, 2번일이 하고싶을 떄는 2번 뇌를, 3번일이 하고싶을때는?? 3번뇌를 ㅋㅋㅋ 

이렇게 뇌를 통채로 재빠르게 바꾸어주는 과정을 Context Switching 이라고 부릅니다

우리나라 말로 '문맥 전환'

각 테크스가 저 주변의 뇌에 해당되는 것이구요, 실제로 장작되는 뇌를 골라서 끼워넣어주는 작업은

커널의 스케쥴러라는 놈이 수행하게 됩니다.

저 뇌들중에 어떤 뇌를 끼워 넣어 줄 것인가에 대한 기본 원칙이 무엇이냐에 따라 커널의 종류가 선점형과 비 선점형 2가지로 나뉘게 됩니다. 이는 뒤에서 한번더 다뤄보도록 하죠 중요한거니까 ㅋ

그럼 좋은 커널이란 Context Switching 이 빠른 커널이다!!! 라고 정의할수 있나요??

꼭 그렇지많은 않습니당 ㅋ CPU 가 가지고있는 레지스터의 양에 따라서 부과되는 오버헤드의 양이 달라지기 때문이지요. 즉, Context Switching 이 커널 디펜던트 하기도 하지만 CPU 디펜던트 하기도 하므로, 이것 만으로 커널의 성능을 결정 짓기에는 무리가 있다라는 소리입니다.

각각의 테스크 들은 선언이 되어 컴파일 되는 순간 스텍에 자신의 공간을 갖습니다.

CPU 는 Context Switching 을 시작할때 현제 자신의 레지스터 정보를 Stack 에 푸쉬푸쉬푸쉬푸쉬 해서 쭈우 집어 넣어놓고, 수행할 테스크의 레지스터 정보를 팝팝팝팝팝팝 해서 채워놓고 아무일도 없었던것 처럼 해당 일을 수행합니다.

그러다가 또 C.S 를 해야할 떄가 오면 다시 현재의 레지스터 정보를 스텍에 저장, 필요한 정포 팝 해서 수행

이런 일을 굉장히 빠르고도 효율적으로 수행하면서 멀티 테스킹을 하게 되는 것이지요~

 
Posted by J.Bear
흠... 
앞 강의에서 Kernel 을 이야기 한김에 선점혐/비선점형 커널을 이야기 하고 싶은데
그러기에는, 아직 테스크와 스케줄러, 문맥전환에 대해 먼서 설명이 필요하므로 잠시 참고 다시 기초부터~ ㅋㅋ

테스크~ 어디서 많이 들어보지 않으셨습니까? ㅋ 

 
ㅋㅋ 아 욱겨 ㅋㅋㅋ

(특히 힘든, 하기싫은 ) 일 ㅋㅋㅋ

그렇죠 ㅋㅋ  사실 코드짜는게 그렇게 적게 힘들고 하고싶은 일은 아니죠 ㅋㅋ
아 네이버 정의 정확하네 ㅋㅋㅋ

여튼 말그대로 테스크는 일의 단위 입니다. 최소한 여기서 우리는 그렇게 생각하도록 하죠~

하나의 테스크는 크게 볼때 하나의 일을 하고 있는것입니다~

약간 다른 시각에서 보면 하나의 테스크에는 각기 다른 하나의 배경 시스템을 가지고 있습니다.
즉 무한루프를 가지고 있다는 소리지요~

### 여기서 잠시 ####

쓰레드(thread) 와 테스크(Task) 는 같은 말인가요? : 의견이 분분 한데요 약간 다르다는 사람도 있고 ㅋㅋㅋ
제 개인적인 생각으로는, 우리가 지금 공부하고 있는 분야에서는 같은 단어로 간주하고 이야기해도 크게 무리가 없다
입니다. ㅋㅋㅋㅋ 참고하세요~ ㅋㅋ

##################################

그럼 멀티 테스킹은 머냐???

멀티면 여러개라는 뜻 아닙니까 ㅋㅋ 스타 멀티플레이 할때 그 멀티 ㅋㅋ

즉, 태스크가 여러개다 -> (특히 힘들고 하기 싫은) 일이 여러개다 -> 아 ㅆㅃ

가 되는것이죠 ㅋㅋㅋㅋ  일도 많은데 이것을 내보고 다 하라고???

아 이럴바에는 그냥 테스크가 하나밖에 없던 슈퍼루프 방식이 좋았어 ㅆㅃ 이런생각이 들때쯤~~~~
엄청 뛰어나신 고수분들이 말을 해줍니다 ㅋㅋ

야~ 너는 어차피 슈퍼루프 방식 코드짜듯이 그냥 짜기만 하면돼~ 
각각이 하나의 일만 한다고 생각해놓고 쭈욱 코드를 짜 놓으면, 나중에 커널이란 놈이 알아서 번갈아가며 일을
효율적으로 시켜줄꺼야

라고 조언합니다 ㅋㅋㅋㅋ

이렇게 되고나면?? 멀티 테스킹을 하는것이지요 ㅋㅋㅋ

살짝 이해가 되시나요???


생각해보면 매우 당연한 이야기 입니다.

CPU 가 한개인데 무한루프를 여러개 돈다??? 무슨수로??? 말이 안돼자나요 ㅋㅋㅋ
CPU 는 한개인데 10가지 일을 동시에 한다??? 무슨수로??? 말이 안돼자나요 ㅋㅋㅋ

멀티 테스킹이란~~~ 

여러개의 CPU 가 있는것처럼 프로그램을 짜놓고 나면, 1개의 CPU 를 가지고 엄청 빠른 시간동안에
각각의 일들을 번갈아 가면서 처리하다 보니, 사용자의 입장에서 볼때는 동시에 여러가지 일을 처리하는것
처럼 느껴지게 되는 일련의 일처리 방식입니다. 

그럼 이런것들은 어떻게 이루어지나염???

그거슬 더욱 자세히 아실려면 다음강의를 보세요 ㅋㅋ
커널의 스케줄러와 문맥전환(Context Switching) 을 이해하셔야 된답니다 ㅋ

그럼 바이바이~~
Posted by J.Bear
익숙한 단어이지요??

리눅스 무슨 커널, 유닉스 커널 등등 들어보기는 많이 들어보시지 않았나요?

이게 앞에서 말한 Foreground/Background System 의 개량형입니다.

Kernel 이란 Multitasking System 의 일부분 입니다. 
각각의 테스크들의 Management 와 각 테스크간의 통신을 수행해주는 녀석이죠~

제가 포스팅하는 M3 에는 RTX-Kernel 이 올라가 있지요? ㅋㅋ
다른 커널들도 많답니다. 

간혹 이렇게 커널 기반에서 펌웨어를 개발하시는 분들 중에서 "OS 를 올렸다, 얹었다" 
이렇게 표현하시는 분들도 있습니다.

물론 틀린 표현은 아니지만, 저는 ㅋㅋㅋ 좀 낯이 뜨거워서 잘 사용하지 않습니다 ㅋㅋ
사실 별로 대단한것이 아니니까요 ㅋ

훗날 WinCE 나 리눅스 같은 OS 정도 얹어놓고 A8 코딩쯤 할때나 저렇게 표현해야할듯 ㅋㅋ


커널기반 프로그래밍을 이해하실려면, 아셔야 할것이 좀 있습니다.

스케쥴러, 우선순위, 세마포어, 뮤텍스 등등... 이것들은 차차 설명하고 지금은
커널기반의 프로그램이 전경/배경 시스템과 어떻게 다른지만 살펴보지요

1. 커널을 사용하면 2.5% 정도의 시간을 더 허비한다.
2. 커널 사용시 ROM, RAM 을 더 많이 사용하게 된다.

-> 머야 이건 좋은게 아니자나요?? ㅋㅋ 하지만!!!!!

1,2번을 포기함으로 인해서 돌아오는 이점은 엄청 나다는 사실을 명심하세요~

3. Real-time Kernel 은 MCU 의 수행 시간을 컨트롤 한다. (젤로 급한 놈부터 서비스 해준당)
4. 한 프로그램에 여러개의 task 가 존재한다. (즉, 무한루프가 여러개 존재한다.)
5. 이 각각의 task 들은 자기 자신이 온전히 CPU 를 독점하여 사용하는 것처럼 동작한다.

흠... 너무 뜬구름 잡는 식인감 ㅋㅋ

더욱 자세히 아실려면 이 뒤의 개념을 좀더 이해 하셔야하니까요 간단하게 읽고 넘어가세요

아래와 같은 비교가 도움이 되려나 모르겠네요~

(1) 전경/배경 시스템 : 부대의 배치, 일하는 종류, 일을 시작하고 끝내는 시간, 일을 수행하는 순서 등을 모두 하나하나 내가 직접 계산하고 결정해서 한치의 어긋남이 없이 돌아가도록 만들어 놓겠다!!! 

(즉!!! 일을 시키는 사람이 천재이거나 완벽주의자거나 ㅋㅋ 둘중하나)

(2) Kernel 시스템 : 흠...내밑에 강한 권력을 갖는 꼬봉을 하나 만들겠다.(Kernel). 나는 내가 해야할 일들을 크게 가닥을 쳐서 뭐가 더 중요한지 순서만 매겨놓고 일을 수행하는것은 꼬봉에게 맡기겠다. 내 꼬봉은 나의 의도를 참 잘 알아서 중요한 일부터 잘 번갈아가며 일을 착착 진행해 나갈것이다.


(오 스마트 가이의 일처리 방식 ! ㅋㅋㅋㅋ)

점점 뒤로 가시다 보면 진짜 이놈 스마트 하구나 라고 느끼게 됩니다 ㅋ

그럼 아래의 간단한 그림 한편 보시면서 생각해 보시길 바라며 바이바이~
 

 
Posted by J.Bear
TAG Kernel, RTOS
아....

키보드를 들어버렸다 ㅋㅋㅋ 꽤나 긴 포스팅이 될 것 같은뎅 ㅠㅠ

사실 예전부터 정리한다 정리한다 하다가 못한 부분인데

졸업고사도 있고 하니, 다시 공부하는 김에 이곳에서 정리하여 둔다.

많은 이들이 Real-Time Operating System 을 이해하는데 조금이나바 도움이 되었으면 한다.

1. Foreground/Background System 

흔히들 Superloop 방식으로 많이 알고 있다. 왜??? while(1) 때문에 ㅋㅋㅋ
프로그램을 저 무한루프 안에 다가 다 때려 박아 주니까 ㅋㅋ 저 루프를 슈퍼루프 라고 부른다 ㅋㅋ
Atmega 계열, PIC 계열 등의 저급 MCU 코딩에 주로 사용하였을 것이다.

소형이면서 복잡하지 않은 시스템에 적합하다.

그렇다면 도대체 이놈의 슈퍼 루프가 전경(Foreground) 이냐 배경(Background) 이냐? ㅋㅋ

이것을 잘 알아두면 이야기가 쉽다. 또 프로그램을 어떻게 짜야할지도 감이 온다. 

답은!!! 백그라운드 이다. 즉 무한루프 안에서 여러가지 함수들이 쭈우우우욱 콜 콜 콜 되고 있어야한다는 소리.

그럼 전경은 뭐임????

정답은 !!!! ISR 입니다. Interrupt Service Routine !

Background 에서 열심히 작업을 하는데, 꼭 필요한 시기에 작업을 이행 해 주어야 할 것 만 같을때!!
이때 치고들어오는 것이지요. (배경, 너는 좀 쉬고있어. 내가 급하니까 재빠르게 좀 처리할께 의 느낌)

 말로만 들으니 감이 안오는가???

그림 나갑니다 ~ ㅋㅋ

 
백그라운드가 쭉쭉 일하는데 인터럽트가 걸리면 무조건 멈추고 인터럽트부터 처리를 해주고 다시 백그라운드로 복귀하고 있지용 ㅋㅋㅋ

코드를 어떻게 짜야할지 감이 오시나요??

예전에 우리 연구실에 있던 대장 노스페이스 아이가 아트메가 코드를 짜고있길래 뒤에서 보고 있었지요.
메인문에 슈퍼루프가 떡 하니 있는데 그 안에서 하는 일이 하나도 없더이다. ㅋㅋㅋㅋㅋ
그래서 물어보았죠. 왜 너는 메인문에 코드가 하나도 없냐? ㅋ
대장 왈 : 모든것은 인터럽트에서 처리해야하니까요 

알려주려해도 말을 듣지않아서 걍 말아버렸습니다만, 여러분들은 이런 생각을 하시면 안됩니다.

배경이란말이 왜 붙어있을까요? 저 슈퍼루프에서 시퀀셜하게 프로그램은 계속 돌아가고 있어야합니다.
인터럽트는 최소한의 시간에만 머물수있도록 해주어야 이 시퀀스들이 깨지질 않죠. 훗날 코드를 보며 이야기 할 기회가 있으면 그 때 자세히 알려드릴게요.

일단 전경/배경 시스템의 장점

1. 프로그램의 구조가 직관적이며 이해하기가 상대적으로 쉽다.
2. 간단한 프로그램에 짜기에 용의하다.
3. 커널에 의한 메모리손실이나 수행시간적 손실이 없다.

단점

1. 프로그램이 복잡해 질수록 코드를 짜기가 어렵다.
2. 모든 함수는 우선 순위가 같기때문에 프로그래머 자신이 순서대로 잘 돌수있게 코드를 잘 짜주어야 한다.
(즉, 손이 많이 간다는 소리지요잉~ ㅋㅋㅋ)
 

다음번에는 전경/배경/ 시스템에 반대되는 개념인 Kernel System 에 대해서 작성하겠습니다.
실질적으로는 여기서 부터가 정말 RTOS 기초의 시작이겠군요 ㅋㅋ
그럼 다음시간에 ~ 

 
Posted by J.Bear


이상하게 CortexM3 관련 정보들을 찾기가 힘들더군요

8bit 같은 경우는 당근이가 짱인데 ㅋㅋㅋ

크레이지 카페같은 경우는 잘 되어 있기는 하지만, 초보자나 입문하는 사람들이 보면 정말 모르겠더라구요

제가 그랬으니까요 ㅋㅋ

사실 머 지금도 봐도 잘 모르긴 합니다 ㅋㅋ

처음 시작만 어떻게 잘 하면, 이것저것 잘 따라갈것 같은데 그걸 못하니 ㅋㅋ

제가 초보자기 때문에 초보자의 마음으로 처음 부터 기능구현 하는 것들을 포스팅 해보려고 합니다. ㅋㅋ

그 처음으로 시작하는 것이 물론 LED 겠지요 ㅋㅋ

LED 는 MCU 의 기본이니까 ㅋㅋㅋ

사실을 우리 연구실에서 세미나 한다고 그래서 그 겸에 이렇게 자료를 만들어서 올리는 거기도 해용 ㅋㅋ

그리고 이것은 공지사항 ㅋㅋ

앞으로 코드 전문이 포함된 프로젝터 폴더를 올려드리지는 않겠습니다 ㅋㅋㅋ

대신에 아래 보시듯이 핵심 코드들을 모두 공개하니까 보시고 찬찬히 따라하시면 금방 할수 있어요 ㅋㅋ

너무 처음부터 다 줘버리면 공부가 안되자나요? ㅋㅋ

대신에 충분히 보고 따라할수 있도록 코드를 부분적으로 짤라서 드리니까 노력하시면 금방 될거에요


오늘 찾아야할 자료들 : Library, Library 관련 메뉴얼 & 예제, M3 메뉴얼

모두둘 조금만 노력하면 쉽게 찾을 수 있는 자료들입니다. ㅋㅋ

정 못찾겠다 싶으신분은 댓글로 메일주소나 개인적으로 연락주세요 ㅋ

물론 제가 작성하기는 했지만
이번 포스팅 또한 절대로 제 혼자만의 힘으로 된것이 아니며, 이 자료는 연세대학교 의용계측 연구실 전체의 자산임을 밝힙니다. (우리 박철희 포함)

파일이 필요하시면 연락주시면 드리겠지만, 절대로 자료의 변조는 없었으면 좋겠습니다.

그럼 포스팅 시작할께요 ㅋㅋ

사진은 클릭하시면 크게 보입니다.

 

 

 

 

 

Posted by J.Bear