이전 포스팅에서 에디터 창의 색을 바꾸는 부분을 보여드렸지요?

이번에는 주변의 창 색깔들도 에디터 창에 맞추어 바꾸는 방법을 알려드리겠습니다.

MicroSoft 에서는 이를 할수 있도록 확장팩을 만들어 배포하고있습니다.

MSDN 에서 제공하구요

1. ThemeManagerPackage
2. ProPowerTools


사용법이랄것도 없습니다.

두 확장팩을 설치하고 나면 메뉴가 생성이 되요

거기서 원하는 색깔로 바꾸면 됩니다.

ProPowerTools 같은 경우는 솔루션 탐색기의 색깔을 주변의 색에 맞추어 자동으로 변경해주지요

첨부파일로 올려놓겠습니다.

(나중에 컴터 포멧하면 나도 여기서 다운받아 쓸려고 ㅋㅋㅋㅋ)

Tip !

코드 정의창, 출력 창등의 배경 색깔을 위의 확장팩으로 바뀌지 않습니다.

직접 도구 - 옵션 - 환경 - 글꼴 및 색 에 가셔서
해당되는 메뉴를 찾아서 바꾸셔야합니다.


붉은색 네모 박스를 바꿔가면서 해당되는 곳을 찾으세요 ㅋ

아래는 저의 작업 환경이랍니다.



어둠의 아들 스타일이군요 ㅋㅋㅋㅋㅋ

Posted by J.Bear

댓글을 달아 주세요

여러분은 Visual Studio 를 어떻게 쓰십니까? ㅋ

저도 흰바탕 쓰다가 계속 쓰다보니 지겹기도 하고 ㅋㅋㅋ

그래서 변화를 좀 주었지요 ㅋㅋ

http://studiostyl.es

라는 사이트에 가시면 여러가지 테마를 무료로 다운로드 받을 수 있습니다.

여기에 가시면 전세계의 프로그래머들이 선호하는 테마를 보실 수가 있습니다 ㅋㅋ

투표를 해 놓았거든요 ㅋㅋ

1위는 Son of Obsidian : 흑요석의 후예

정도로 해석 가능하겠군요 ㅋㅋ

저도 그 테마로 적용해 보았습니다 ㅋㅋ


맘에 드시나요? ㅋ

C# 을 작성할때 이런식으로 나옵니다 ㅋ

브레이크 포인트 걸었을때 하잍라이트도 예뿌게 되더군요 ㅋㅋ

파일은 제가 첨부하도록 하죠~

하는 방법은 다른 네이버 뒤져보시면 쉽게 알수있으니 생략하도록 하겠습니다.

참고로 글자체는

전세계 프로그래머들이 선호하는 글자체 1등인

Bitstream Vera Sans Mono 체 입니다 ㅋ

이것도 쉽게 구하실수 있어요 ㅋㅋ

근데 영 안맞다고 하시는 분들도 많고 ㅋㅋ

취향 따라 가는거죠 머 ㅋㅋㅋ


Posted by J.Bear

댓글을 달아 주세요

  1. 그런데... 2012.01.21 09:01  댓글주소  수정/삭제  댓글쓰기

    vc++도 되나요?

굿 모닝 에브리 바디 ㅋㅋ

날씨가 굉장히 춥군요 ㅋ

여친님이 모닝콜 안했으면 아조 그냥 저세상 갈때까지 잠만 잘뻔했네 ㅋㅋ

오늘의 주제는 if 문과 switch 문의 최적화 입니다.

if 문과 switch 문의 차이점은 다 아시지요???

간단하게 한번 집고 넘어가자면,

다중 if 문을 쓸경우 (if, else if, else if ...... , else) 순차적으로 조건을 모두 비교해나가고,
switch 문은 비교 변수 인자와 비교를 해서 해당되는 case 로 바로 분기한다.


이해가 되실려나?? 

아 이게 안좋은 점이야 ㅋㅋ 분명히 최적화 글을 읽으려고 오신분 들은 저 정도 차이는 아실텐데 자꾸 자세히 쓰게되네 ㅠㅠ

Psudo Code 로 잠시 표현을 해보지요 

if(a==1)
else if(a==2)
else if(a==3)
....
else

와 같이 썼다고 가정해보지요. a == 100 까지 있다고 치공 ㅋㅋ

a ==99 가 들어왔어요 ㅋㅋ

그럼 바로  else if (a==99) 로 가지를 못하고, a==1 이였나??/ 거짓 ! 그럼 a==2야?? 아니 ㅋㅋ

이러면서 99 가 나올때까지 계속 비교를 한다는 것이지요 ㅋㅋ

하지만!!!

 switch 문은 a ==99 가 들어오면 99번에 해당하는 케이스로 바로 분기를 해 간다는 소리입니다.

즉! 차이점은?? 비교를 여러번 하느냐 한번만 하느냐의 차이라고 볼수 있습니다.

근데 여기서 하려고 했던 이야기는 이런것이 아니고 ㅋㅋㅋ

부득이 하게 위와 같은 다중 if 문을 쓸 경우에는 다중 분리 분기문을 이용해서 사용하면 오버헤드를 줄일수있습니다. 

예를 볼까요???

if(a==1)
else if(a==2)
....
else if(a==8)

과 같이 짜진 코드를 이진 분리해보면

if(a<=4)
{
if (a==1)
...
else if(a==4)
}
else
{
else if(a==5)
....
else if (a==8)
}
 
이런 식으로 짜면 확실히 비교의 횟수가 줄어들었지요????

switch 문 같은경우도 좀더 효율적으로 사용하기 위해서는

비교 인자를 문자로 사용할 때 보다 바로 숫자로 사용할때가 훨씬 좋습니다. 문자로 사용할때는 컴파일러가 형변환을 하게 되어서 시간이 조금 더 걸리거등여 ㅋㅋ

그리고 확률적으로 자주 사용될수 있는 케이스를 앞쪽에 위치시켜 주는 것도 한 방법이라 할 수 있겠습니다.
이것은 if 문에도 적용되는 이야기 입니다.

정리해 볼까용?

(1) 다중 분기문의 비교문에서 사용하는 연산은 한번만 수행하고, 이를 변수에 저장하여 사용한다.
(2) if 문 보다는 switch문이 속도, 메모리 적인 측면에서 모두 효율적이다.
(3) if 문으로 표현해야 한다면 선택될 확률이 높은 비교문을 앞쪽에 위치시기고, 이진 분리 분기 등과 같이 비교문의 실행을 줄이는 방법을 모색하도록 한다.
(4) 비교문과 같이 반복적으로 사용되는 데이터의 데이터 타입을 잘 선택한다.

등으로 정리 할 수 있겠군요.

이것 또한 자투리 지식으로 알아 둔다면 나중에 아는 척 하기 딱 좋겠지요? ㅋㅋㅋ

그럼 바이바바이
 
 
Posted by J.Bear

댓글을 달아 주세요

제목이 이상한가??

ㅋㅋㅋ

어차피 이 글을 클릭하시는 분들은 C에대해 어느정도 자신감이 붙으신 분들이실테고 ㅋㅋㅋ

근데 ! 연산자와 ~연산자의 정확한 차이를 알고 계신감용???

헷갈리시는 분들 많으실겁니다 ㅋㅋㅋ

(1) ! 연산자

Logic NOT 입니다.
C 언어에서는 0 이 아닌 모든 수는 다 1로 생각하죠 ㅋㅋ LOGIC 적으로 말이에요 ㅋㅋ

단편적인 예로 if(3) 이렇게 써도 무조건 참으로 알고 돌자나영 ㅋ

! 연산자는 이렇듯 로직을 바꾸어주는 역할을 한답니다.

값을 바꾸는것이 아니라요 ㅋㅋ

예는 ~ 연산자와 함께 보여드리지요

(2) ~ 연산자

Bit Value NOT 입니다.

이해가 되시나영??

모든 수는 2진수로 저장됨은 알고 계시겠지요?/

각각의 비트에 들어갈수 있는 값은 1 아니면 0 입니다.

이 각각의 비트의 값을 반대로 바꾸는 것입니다.
 

(예제) 

 int main(void)
{
volatile unsigned int test_a = 10;
test_a = !test_a;


test_a =  ~test_a ;
}

(이해를 돕기 위해서 unsigned int 로했습니다. signed 로하면 부호가 바뀌겠지요?)

아래는 정답입니다.

 


아시겠지요????


여기서 제가 원래 이야기 하고 싶었던 부분은

LOGIC NOT 연산자의 최적화 입니다.

도대체 뭘 최적화 한다는 것이냐??

로직을 바꾸는데 ! 연산자를 쓸수도 있지만 ^ 연산자를 쓸수도 있습니다.
Exclusive OR 연산자 이지요~


1과 XOR 를 계속해주면 1,0,1,0 순서로 값이 반전됩니다.

과연 어떤 연산자를 써서 LOGIC NOT 을 하는 것이 더 빠를까요? ㅋㅋㅋ

일단 정답을 XOR 입니다 ㅋㅋ

아래는 비교하기 위한 코드이고 그 아래에서 어셈코드 보시죠 

int main(void)

{


volatile unsigned int test_a = 1;

test_a = !test_a;

test_a ^= 1;



[##_http://jbear.tistory.com/script/powerEditor/pages/1C%7Ccfile7.uf@196544404F0CE9551E0090.PNG%7Cwidth=%22363%22%20height=%22263%22%20alt=%22%22%20filename=%22dddddd.PNG%22%20filemime=%22image/jpeg%22%7C_##]

 역어셈 코드 잠시 알아볼까요??

MOVS(r4,#0x01) : r4 레지스터 1을 집어넣었군요

CBNZ : 0이거나 0이 아닌경우 비교 분기 (r4 는 피연산자가 들어가는 레지스터, 분기할 주소)
MOVS : r4 에 있던 값을  r0 레지스터로 옮기넹??
B : 다시 분기를 하는군요 0x080004C0 로 ㅋㅋ
MOVS : r0 에 0을 이동시켜놓고
MOV : r4 에다가 변화된 r0 를 이동시켜 놓으면서 ! 연산자 수행이 끝납니다

총 5개의 Instruction Set 을 돌았네용

아래는 ^ 연산자군요 ㅋㅋ

걍 EOR 하나죠? ㅋㅋ Exclusive OR 명령어 SET 을 가지고 있나바여 ㅋㅋ

아 참, 이 컴파일러는 uVision4 를 사용했습니다
Target CPU 는  ST 사에서 CortexM3 코어로 만든 STM32F103ZG 입니다

여튼 1개의 명령어로 끝나는군요 ㅋㅋ 

수행시간 차이를 볼까요??



! 연산자 : 4ns
^ 연산자 : 2ns

약 2배정도 차이가 나는군요~

물론 엄청 작은시간입니다 ㅋ 하지만 이런게 있다는것을 알아두는 것이 나쁘지는 않을듯 싶네요


Posted by J.Bear

댓글을 달아 주세요

연구실에 들어온지도 어언 1년이 넘어갔다.

이제서야 Cortex M3 와 말트고 지낼 친구가 된 기분이랄까???

사실 M3 를 사용함에 있어 크게 코드를 최적화 해야겠다라고 느낀적이 없다.

빠른 코어클락과 넉넉한 메모리 덕에 맘대로 짜도 다 돌아갔으니까 ㅋㅋ

하지만 임베디드 프로그래밍을 하는 사람으로써 코드 최적화 기법은 어느정도 알고 있어야하지 않을까??

지금 레퍼런스로 잡고 포스팅 하려는 책이 굉장히 쉽지만은 않다.

구현은 된다는 가정하에 얼마나 최적화해서 프로그래밍을 짜느냐에 초점이 맞추어졌는데, 쉬운게 이상하지.

(암 그렇고 말고 ㅋㅋㅋ)

정확하게 한번을 보는데 약 반년이라는 시간을 꾸준히 사용한것 같다.

그동안 내 실력도 늘어가면서 이해가 가지 않던 말 들이 이해가 가기도 하고 ㅋㅋ

아래는 내가 참조로 하여 포스팅할 책의 제목이다.

한빛 미디어에서 출판한 임베디드 프로그래밍 C코드 최적화 라는 책이다.

책에 나오는 내용을 글로만 읽으며 접근할때 잘 이해가 되지 않던 내용이 이 포스팅을 보면서,

필자 나름대로 해석한 생각까지 같이 읽을때 이해가 조금 더 쉬워지는 효과가 있었으면 한다.

물론 나도 이것을 정리하면서 나의 지식을 확고히 다지는 계기가 되었으면 하는 바램이 우선이지만 ㅋㅋ

책의 순서와 관계없이

내가 읽던 과정에서 정말 영감을 얻은 부분들을 위주로 기술해보려한다.

훗날 내가 내 포스팅을 보며 기억을 떠올릴 날들을 생각하며......

 
Posted by J.Bear

댓글을 달아 주세요

ㅋㅋㅋㅋㅋ

아 이 강아지 진짜 ㅋㅋㅋ

용기있다 ㅋㅋ 용맹해 ㅋㅋㅋㅋ

호랑이도 조그마하면 의미 없구나 ㅋㅋㅋㅋ

조심해라 쫀지우! ㅋㅋㅋ

3년뒤에 내가 자라나면 너는 한주먹거리도 안대 ㅋㅋㅋㅋㅋ

아 간만에 빵터졌다 ㅋㅋㅋ


'1. Who's J.Bear ?' 카테고리의 다른 글

티스토리 초대장 배포 (1월분 14장)  (8) 2012.02.01
출판!  (2) 2012.01.26
강아지와 호랑이의 싸움  (0) 2012.01.11
세상에서 최고로 어려운 수학 문제  (0) 2012.01.07
세계 4대 뮤지컬  (0) 2011.12.17
한국인이 피곤한 이유  (0) 2011.12.14
Posted by J.Bear

댓글을 달아 주세요


도착!!

Cherry 적축을 사용한 기계식 키보드

LED 강도도 4단 조절된다.

구름타법을 가능하게하는 기계식 키보드

30% 만 눌려도 키가 인식되고 n키 롤오버도 지원한다 ㅋㅋㅋ



사진이 흔들렸군

방향키는 주황색으로 바껐다 ㅋㅋㅋ

근데 더 안이쁜거같다

여친님이 사준신 맘마가 도착하면 간지겠다 ㅋㅋㅋ

훗날 기계식 키보드의 종류와 특징에 대해서 기술해보겠닼ㅋㅋㅋ

'8. Computer Hardware' 카테고리의 다른 글

XENICS Tesoro M7 LED  (0) 2012.01.10
울트라북 분해기  (0) 2011.12.20
갤럭시 넥서스 분해기  (0) 2011.12.07
고 와트 컴퓨터 파워 서플라이의 정리  (0) 2011.04.08
RAM 을 구입하다 !!! ㅋㅋㅋ  (0) 2011.04.04
Posted by J.Bear

댓글을 달아 주세요


마지막 강의 입니다.

그리 길지않은 마무리가 될것 같네요~

일전에 한번 Task 에 대해 간단하게 설명 드린적이 있습니다.

이놈의 Task 들은 CPU 를 자기 자신이 독점하고 있다고 생각하는 아주 멍청한 놈들이지요 ㅋㅋ 착각의 대장들 ㅋㅋ

이 테스크들은 5가지 상태를 가지고 있답니다 ㅋ

몰라도 문제없지만, 그래도 Kernel Programmer 라면 이정도는 한번 들어봤어야 하지 않나 싶어서 포스팅합니다.

(1) 수면상태 (Dormant)
(2) 준비상태 (Ready)
(3) 실행상태 (Running)
(4) 대기상태 (Waiting)
(5) 인터럽트 서비스 루틴 상태 (ISR)

ㅋㅋㅋ 다들 한번 씩 들어본 이름들이죠??

이 다섯가지 상태중에 한가지 상태를 가지면서 무한루프를 수행하고 있습니다.

수면상태가 좀 낯설수도 있는데요

테스크 자체는 상성되에 메모리에 존재하지만 커널에 등록이 되어있지 않은 상태라 커널이 서비스를 못해주는 상태를 말합니다.

준비상태는 "나 준비됐어요" 하고 스케쥴러에게 쳐다봐달라 하고 유혹하고 있는 상태입니다 ㅋㅋ

하지만 그 상황에서 CPU 는 다른 우선순위가 높은 테스크에게 서비스를 해주고 있는 상태이지요 ㅋㅋ

실행상태는 말그대로 실행되고 있는 상태이구요

대기상태는 OS Tick 을 이용해서 딜레이를 걸어놓았거나, 혹은 세마포어를 기다리고 있거나 하는 상황을 대기상태라고 부릅니다.

마지막 ISR 은 다들 아시겠지요? ㅋㅋ

아래는 uC/OS 에서 제공하는 OS 함수들이 각 테스크의 상태에 따라 어떻게 적용되는 지를 보여주는 블럭도입니다.





자 이렇게 RTOS 에 대한 포스팅을 마무리 하도록 하겠습니다

꾸준히 읽어주신분이 있을지 모르겠지만 이 글을 읽어주시는 분이 있다면 정말 감사할 따름입니다.

부족한 부분도 많지만, 훗날에라도 따로 추가할 만한 내용이 있드면 보충하도록 하겠습니다.


작은 정보이지만 정보를 주기위해 노력하는 사람들은 정보를 얻어가련 사람에 비해 수백배 이상의 노력을 기울이고 있습니다.
이런 사실을 알아주시고, 부족하지만 격려의 댓글을 달아주시면 더욱 힘이 나서 열심히 하는것이 포스팅하는 사람들의 습성이지요 ~ ㅋㅋ


그렇다고 댓들 달아달라고 징징대는것은 절대 아녀요 ㅠㅠㅠ

긴 글 읽어주셔서
감사합니다~ (꾸벅)
Posted by J.Bear

댓글을 달아 주세요

  1. MISS!권 2012.01.25 22:36  댓글주소  수정/삭제  댓글쓰기

    징징 대서 댓글 달아 준다..
    괜찮은 내용이였어 아니 가이드라인 많이 잡혔어..
    생각해보니 괜히 테스크 돌리는 것을 피했어
    네 고수분?들 말처럼 -_- 만들기만 하면 될꺼 같은데 말야

    암튼 많은 좋은 글 쑴뿡쑴뿡 낳아 주길 바래!

    • J.Bear 2012.01.25 23:15 신고  댓글주소  수정/삭제

      이렇게 지식의 늪을 헤엄치며 고마움을 느끼지 못하는 이들을 위해 앞으로 비공개로 글을 써서 비밀번호를 부여받은 이들만 글을 읽을수 있도록 해야겠군 ㅋㅋㅋ

  2. cyanluna 2012.03.21 19:43  댓글주소  수정/삭제  댓글쓰기

    감사합니다. 고수님 ㅠ 유쾌하고 재미있게 정말 잘 풀어쓰시네요.
    열심히해야죠.

    -지나가던 나부랭이-

    • yjymb@hotmail.com 2012.03.21 20:51  댓글주소  수정/삭제

      앗 ㅋㅋ 고수란 말은 좀 부답스러운데요 ㅋㅋ
      저도 그냥 공부하는 학생이랍니다 ㅋㅋ

  3. mega16 2014.07.01 09:55  댓글주소  수정/삭제  댓글쓰기

    전자과였다가 급
    임베디드 쪽에 관심이 생겨서 공부하고 있는 학생입니다.

    작성해주신 RTOS포스트 덕분에 더욱 쉽게 이해할 수 있었습니다.

    특히
    우선순위 역전, 상속에서 나온
    각하, 국무총리, 주인장 님의 화장실 쟁탈전..ㅋㅋㅋㅋ
    잘봤슴돠!

  4. msmasd 2014.10.07 12:52  댓글주소  수정/삭제  댓글쓰기

    현재 RTOS를 공부하고있는 학생인데요!!
    정말 잘 읽었습니다!! 이해 못했던 부분을 말을 잘해주셔서 너무나 이해가 잘됬답니다!!
    감사합니다!!


이제 막바지입니다 ㅋㅋㅋ

지금 이야기할 주제는 리얼타임 커널이 자체적으로 가지고 있는 클럭틱 (Clock Tick) 에 관한 내용이에요 ㅋㅋ

클럭틱이란 정기적으로 일어나는 특별한 인터럽트 입니다. 이 정기적으로 일어나는 인터럽트가 리얼타일 OS 의 심장 박동이라고 할수 있지요 ㅋㅋ

이 인터럽트의 간격은 대부분의 커널이 프로그래머가 직접 조절 할 수 있도록 해놓습니다 ㅋ


보이시나요? ㅋㅋ

이것이 RTX_Kernel 이 제공하는 Config 창입니다 ㅋ

가운데 쪽에 보이시나요?? Timer tick Value[us] ㅋㅋㅋ

저는 10000 으로 현재 세팅을 했군요 ㅋㅋ

10ms 를 OS 한 틱으로 하겠다!!! 라고 설정한 것이랍니다 ㅋ

클럭틱 인터럽트는 커널로 하여금 클럭 틱 주기의 정수배 만큼 태스크를 지연시키고, 이벤트가 발생하기를 기다리는 태스크에게 타임아웃을 제공합니다 ㅋ

이 틱의 속도가 빠르면 빠를수록 CPU 에 더 많은 오버헤드가 걸리겠지요? ㅋㅋ

제가 사용하는 RTX Kernel 에서는 저 클럭틱을 이용한 딜레이 인터럽트를 제공하는 OS 제공 함수가

os_dly_wait(10) 이런식으로 쓴답니다 ~ ㅋㅋ

10틱 기다려라 라는 소리이지요 ~ ㅋㅋ

위와같이 세팅이 되어있다면, 태스크는 어플리케이션을 수행하다가 저 문장을 만나면 시피유의 점유권을 스케쥴러에게 양도하고 100ms 가 지난 후에 "I'm Ready" 이렇게 외치죠 ㅋㅋ

즉! 100ms 이후에 Ready List 에 들어가게 된다는 소리에요 ㅋㅋㅋ

하지만!!

여기가 중요합니다 ㅋㅋ 여기서 말하는 클럭틱의 시간이 진짜 타이머가 만들어내는 인터럽트처럼 완벽하게 정확하지가 않다는 것이지요~

예를 보시지요~


자 상위 우선순위 테스크와 ISR 이 1틱만큼 딜레이를 하려는 테스크보다 선행되어 실행되고 있습니다. 여기서 1틱을 20ms 로 설정했군요

이 태스크는 1틱만큼 딜레이를 시도하지만 우선순위 때문에 실제로는 불규칙적인 간격으로 실행되게 됩니다. 짧은 시간차이지만, 생각한대로 깔끔하게 제시간에 돌지는 못하는 군요???

이런 현상을 jitter 현상 라고 부른답니다.

그럼 우리는 이런 지터 현상을 어떻게 해결할수 있을까요? ㅋㅋㅋ

정답은 '돈' 입니다 ㅋㅋㅋ 비싸고 좋은 CPU 를 사용해서 작업을 더욱 빨르 끝내버려서 틱 인터럽트를 먹어버리는 현상을 줄여야하는 것이지요 ㅋㅋ

(1) MCU 의 클럭 속도를 높인다.
(2) 틱 인터럽트 사이의 시간을 늘린다.
(3) 태스크의 우선순위를 다시 지정한다.
(4) 플로팅 포인트 연산을 피하고 정수연산으로 변환한다.
(5) 코드 최적화를 수행한다.
(6) 시간이 중요한 코드는 어셈블리 언어로 프로그래밍한다.

정도의 해결방안을 줄수 있겠네요 ㅋㅋ

사실 OS 틱에 의존하여 매우 정확한 타이밍 마다 태스크를 돌게 하려는 발상은 발상 자체가 잘못된 것입니다.
다만 대부분 저정도의 수 밀리초 정도의 지터 현상이 전체 어플리케이션의 동작에 영향을 크게 미치지 않는 경우에 많이 사용하게 되지요 ㅋ

여러분이 사용하시는 윈도우즈 라는 OS 는 OS 틱이 1ms 입니다 ㅋㅋ

그래서 엄청 무거운 프로그램 돌리시거나, RAM Test 같은거 하거나 이렇때 윈도우 시계의 초침이 부자연스럽게 움직이는 경우를 경험해 보신적이 있으실거에요 ㅋㅋ

때에따라서 엄청 정확한 타이밍에 딱!!! 동작을 하게 만들어야하는 경우가 있습니다 ㅋㅋ

이때는 MCU 에 내장된 내장 타이머를 이용하여 Timer Overflow 를 이용해서 Interrupt 에서 처리를 하던지 혹은
이때 Interrupt 에서 해당 테스크로 이벤트를 날려주는 식으로 처리하시는 것이 올바른 방법이랍니다.

더욱 정확하게 확인을 하시기 위해서는 오실로스코프로 테스크 수행 틱을 정확하게 확인하면서 여러 방법을 시도하는 것이 좋지요 ㅋ

그럼 이번 강의는 여기서 줄이겠습니다.
Posted by J.Bear

댓글을 달아 주세요


아.. 제목부터가 굉장히 거부감 들게 생겼네 ㅋㅋ

이것은 뭐 엄청나게 외우고 확실하게 이해를 해야만 프로그래밍 할수 있는 것은 아닙니다 ㅋ

하지만 한번쯤은 들어보시고 생각을 해보시면 훗날 생길수 있는 문제들에 대해 접근할 때 유용하실 것이라 생각됩니다. ㅋㅋ 물론 이것때문에 문제가 된다면 오실로스코프로 조낸 찍어가면서 봐야하는 큰 문제이기 때문에 많이 접하실 일을 없을 것같아요 ㅋㅋㅋ

그리고 커널을 사용함에도 불구하고 저런 부분이 크리티컬한 문제로 다가오는 경우라면???

ㅋㅋ 엄청나게 대단한 일을 하시는 분이실 테니까 저보다 잘 아실테구요 ㅋㅋ

근데 왠만한 펌웨어에서는 크게 문제가 되질 않습니다 ㅋㅋ 또 내가 잘 몰라도 커널이 알아서 스케쥴링 잘 해줄것이라 믿어 의심치 않고 있어요 ㅋㅋ

사설은 여기까지 ㅋㅋ
이제 또 한번 설을 풀어 볼까요 ㅋㅋㅋ

( 아 요고 쓰고 2개만 더 쓰면 계획했던 RTOS 포스팅이 일단락 되는군요 ~ 긴 여정이였습니다)

(1) 인터럽트 지연시간 (Interrupt Latency)

간단합니다.

크리티컬 섹션을 처리하기 위해서 인터럽을 비활성화 해놓고 처리가 끝나면 다시 활성화 한다고 하였지요??

이렇게 인터럽트가 비활성화 되어있으면 돌아야하는 인터럽스 서비스 루틴이 실행이 안되고 지연이 되는 것이지요? ㅋㅋ

즉, 인터럽트가 비활성화 되어있음으로 인해 인터럽트가 지연되는 시간을 의미합니다.

인터럽트가 비활성화 된 최대 시간 + ISR 에서 최초 명령을 시작하려는 시간 = Interrup Latency

(2) 인터럽트 응답시간 (Interrupt Response)

초점은 같습니다. 하지만 한가지를 더 고려해 주는것이지요~

인터럽트 지연시간을 지나 인터럽트로 들어가는 시점까지가 아니라 실지로 ISR 에 사용자가 싸놓은 첫번째 코드를 실행할때가지 얼마의 시간이 걸렸는가??? 입니다.

뭔 차이가 있냐구요?/ ㅋㅋ

잘 생각해보세요~ ㅋㅋ 인터럽스 서비스 루틴의 코드를 실행하기 위해서는 원래 돌고있던 테스크에 해당되는 CPU 문맥을 저장해 놓아야 하잖아요 ㅋㅋ 그 시간까지 고려를 해서 생각한 시간이 인터럽트 응답시간입니다 ㅋ

즉!!!

인터럽트 응답시간 > 인터럽트 지연시간

의 공식은 항상 성립하는 참인 명제가 되는 것이지요~


인터럽트 지연시간 + CPU 문맥을 저장하는 시간 = Interrupt Response

가 되는 것입니다~

전경/배경 시스템과 비선점형 커널에서는 위와 같지만, 선점형 커널에서는 한가지가 더 추가됩니다.
위의 두개의 상황은 따로 커널이 제공하는 특별한 함수를 호출하지 않아도 큰 무리가 없지만, 선점형 커널에서는 ISR 이 진행중인것을 알려주어 커널로 하여금 인터럽트가 중첩되는 것을 알 수 있도록 해주는 함수를 실행해야 하거든요

그래서 아래와같이 공식이 살짝 바뀌어용~

인터럽트 지연시간 + CPU 가 문맥을 저장하는 시간 + 커널의 ISR 진입함수 실행시간
                                                                                           = Interrupt Response


(3) 인터럽트 복귀시간 (Interrupt Recovery)

이제 초점이 살짝 바뀝니다
지금까지는 인터럽트 진입 시점에 관해 논했다고 하면 이제 인터럽스 서비스 루틴이 끝나고 원래 실행 테스크나 배경 시스템으로 돌아오려는 시점에 대해서 논하게 됩니다.

ISR 이 끝난 시점에서 얼마나 빠르게 원래 돌던 코드로 돌아올수 있는지를 말하는 것이지요

반대로 생각하면 되겠지요??

CPU 가 문맥을 복구하는 시간 + 인터럽트로부터 복귀 명령을 수행하는 시간 = Interrupt Recovery

이것도 전경/배경 시스템 , 비선점형 커널에 해당되는 것이구요 선점형 커널에서는 하나의 시간이 더 필요하지요~
선점형 커널과 나머지 커널간의 차이점을 앞선 강의에서 이해하셨다면 답을 유추 하시는 분도 있으실 것이라 생각됩니다.

바로 !!!! 최상위 우선순위 태스크를 결정하는 시간 이지요~

최상위 우선순위 태스크를 결정하는 시간 + 최상위 우선순위의 Context Swtching 시간 + 인터럽트로부터 복귀 명령을 수행하는 시간 = Interrupt Recovery

이해가 되셨습니까???

한번만 딱 읽고 이해하시기는 약간 어려울 수도 있습니다.
하지만 앞선 내용을 찬찬히 이해하시고 한번더 읽어보시면 무리없이 이해하실 수가 있어요 ㅋㅋ

그래서 해당되는 내용의 그림을 요 아래쪽에 배치한것입니다~

그림보고 글을 읽다보니까 다 아는 것같긴 한데 확실히 머리에 안박히더라구용

그래서 위의 글을 먼저 읽으시고 그림을 보시고 "아 저쉐끼 그림을 왜 아래다 놔뒀어 그림보니 알아먹기 좋구만" 하시면서 위에서 다시한번 스윽 훑어보시고 살펴보시면 여러분의 지식이 되실것이라 믿어 의심치 않습니다 ㅋㅋㅋ

(아... 이러다 세상 모든 사람들이 나와 같은 수준의 지식을 갖겠군 ㅋㅋㅋ 그사이에 저는 더욱 발전해서 더 많은 내용을 포스팅 하겠습니다 ㅋㅋㅋ 스스로 자극을 받는 요론 자세 ㅋㅋㅋㅋ)



그럼 빠빠빠빠빠빠빠빠잉
Posted by J.Bear

댓글을 달아 주세요