반응형

[다시 쓰는 8051 따라하기] 인터럽트
+------------------------------------------------------+
게시장소 : 다음 tinyrobo
작성자 : Timy(me^^;)
작성일 : 2004.10.29
문의 : 다음카페 tinyrobo 혹은 블로그 http://electoy.cafe24.com/blog
+------------------------------------------------------+
[시작]

## 8051 기초 - 인터럽트

인터럽트의 개념은 다음과 같다.

프로그램이 주욱 수행되다가 갑자기 어떤 사건이 발생했을때 그 사건을 먼저 처리해 주는 것이다. 이를테면 방에서 TV 를 보다가 초인종이 울리면 TV 시청을 잠시 중단하고, 현관으로 나가 문을 열어주는 것인 인터럽트라고 할수 있다.

보통 인터럽트는 하드웨어적으로 정해져 있게 된다. 8051에서의 인터럽트 역시 정해져있다. 클래식한 8051 에서 인터럽트는 5개로 정해져있다. 이것은 모두

==================================================
[외부 INT 핀 0, IE0, 자동, 0x0003, Priority 1]
[타이머 0, TF0, 자동, 0x000B, Priority 2]
[외부 INT 핀 1, IE1, 자동, 0x0013, Priority 3]
[타이머 0,TF1, 자동, 0x001B, Priority 4]
[시리얼, TI + RI, 수동, 0x0023, Priority 5]
==================================================

이렇게 다섯개다. 그리고 인터럽트 소스가 6개라고 이야기를 한다. 그것은 마지막 5번째 시리얼에서 TI 와 RI 모두가 시리얼 인터럽트를 발생시키기 때문이다. 그리고 인터럽트는 서로간의 우선순위가 있다. 무슨말이냐하면, TV 를 보는데 초인종이 울리면 괜찮은데, 그때 마침 전화벨이 울렸다. 그러면 어떻게 할 것인간? 문을 열어주는 것과 전화를 받는 것 사이에 우선순위가 결정되어 있어야 한다. 마찬가지로 8051에 인터럽트가 발생했을때, 하나만 발생하란 법이 없다. 두개가 동시에 발생할수도 있고, 심하면 5개가 한꺼번에 발생할 수도 있다. 그러면 여기서는 위쪽에 있는 IE0 에 관련된 것을 먼저 수행한다. 그 다음에 TF0 를 수행하고 그 다음 다음으로 넘어간다. 이렇게 인터럽트도 서로간의 우선순위가 있다. 당연히 인터럽트는 일반 프로그램에 우선해서 수행되지만 인터럽트간의 우선순위때문에 인터럽트가 발생해도 잠시 지연되는 경우가 발생하는 것이다.

인터럽트 검사는 10번째 clock 입력에서 체크를 한다. 그러니까 8051 은 하나의 명령이 수행되기까지 12번의 오실레이터가 깜박여줘야 한다고 말했었다. 이 12번의 깜박이는 중간, 10번째에서 인터럽트를 체크하는 것이다. 이것은 무조건 그렇게 하도록 되어 있는 것이니까, 바꾸고 싶어도 어쩔수 없는 것이다. 나는 인터럽트 안쓰니까 이 10번째 깜박이는 것을 없애고, 시간을 절약하겠다는 사람은 ... 마음이야 가상하지만 어쩔수 없다. 8051은 그렇게 할수 없다. 다만, 인터럽트가 들어와도 무시하고 지나가게 하는 방법밖에는...

그리고 참고로 클래식한 8051 에는 없지만, AT89S52 에서 추가된 기능으로는

. Three 16-bit Timer/Counters
. Eight Interrupt Sources

가 있다. 그러니까 원래 타이머/카운터가 2개 였는데, 이것만으로는 조금 부족하다고 고객들의 불평이 있었나보다. ATMEL 에서 타이머/카운터를 하나 더 늘렸다. 그러니까 인터럽트가 원래 클래식 8051보다 하나 늘어서 6개가 되었다. 그리고 이 세번째 TIMER/OUNTER 인터럽트가 예전것과는 조금 달라졌다. 데이타시트를 보면 TF2 와 EXF2 라는 두개의 인터럽트 소스가 늘었다. 이 두개가 세번째 타이머 2의 인터럽트 소스가 되는 것이다. 자세한 내용은 스스로 공부하기를... 여기서 세번째 타이머를 써서 뭘 할것 같지는 않다.. ^^ 쉽게 말해서 몰라도 상관없다는 것이다... 물론 알면 더 좋겠지만.. ^^

그 다음...

인터럽트가 발생하면 급하게 하던 작업을 중단한다. 이때 스택이라는게 사용된다. 앞에서 스택이라는 것이 무엇인지 배웠다. 그리고 스택이 사용되면 램에 하던 일을 정보를 저장하고 새롭게 들어온 일을 시작한다. 인터럽트 루틴이라고 불리는 것이 호출되어 실행된다. 이게 다 끝나면 다시 스택에 저장했던 정보를 꺼내서 예전에 하던 일을 멈추었던 부분부터 다시 시작하면 된다.

그러면, 인터럽트가 발생하면 스택에 하던 일을 저장하는 것 까지는 알겠다. 인터럽트가 발생하면 인터럽트 루틴을 실행한다고 했는데 이게 어디 있는것인가? 이것은 하드웨어적으로 고정된 장소에 있게 된다. 8051 에서는 인터럽트가 발생하면 그 인터럽트가 무엇인지를 보고 (INT0 ? TIMER0 ? INT2 ? TIMER2 ? SERIAL? ) 각각이 약속된 장소로 번지를 점프하게 된다.

약속된 장소는 각각 0x0003, 0x000B, 0x00013, 0x0001B, 0x0023 이다. 만약 8052계열을 사용해서 여기에 TIMER2 인터럽트가 추가되면 0x002B 도 들어갈것이다.

그러니까 INT0 인터럽트가 발생하면 프로그램은 하던 일을 멈추고 일정한 정보를 스택에 저장하고, 바로 번지수 0x0003 으로 점프한다.!!!

이걸 벡터 테이블이라고 하는데, 인터럽트가 걸리면 일정한 장소로 번지 점프를 하고 거기서 인터럽트 루틴을 실행시킨다음 원래 프로그램으로 돌아가는 것이다. 여기 벡터테이블을 기록한다.

==================================================
[0x00 : 프로그램 시작번지] ...
==================================================
[0x0003:INT0] ...
[0x000B:TIMER0] ...
[0x0013:INT1] ...
[0x001B:TIMER1] ...
[0x0023:SERIAL] ...
[0x002B:TIMER2] ...
==================================================
[0x0033:USER PROGRAM START] ...
==================================================

여길 보면 각 벡터테이블간 간격이 8바이트 인것을 알수 있을 것이다. 프로그램은 0x0000 번지, 즉 롬의 맨 앞에서 시작된다. 그런데 0x0003 에 int0 인터럽트루틴이 있다. 어떻게 해야 할까? 방법은 0x0000 번지에 0x0033 이하로 점프하는 명령을 두면 된다. 0번지에 0x35 번지로 점프하는 명령을 두면 0x35번지로 가서 프로그램을 수행한다. 프로그램을 실행하다가 인터럽트를 만나면 벡터테이블을 찾아서 0x0003 에서 0x002B 사이로 오게 된다. 거기에 인터럽트서비스 루틴을 두면 된다. 그런데 보면 8바이트밖에 안되는 짧은 공간이다. 아무래도 인터럽트 서비스 루틴을 두기에는 조금 부족한 느낌이 든다. 그때는 여기에 일정한 번지로 점프하는 명령을 두면 된다. 그러면 인터럽트가 발생하면 ISR(Interrupt Service Routine)을 시작하기 위해 벡터 테이블을 찾아오고, 여기에 기록된 다른 번지로 점프해서 그곳의 프로그램을 실행하고, 마치고나면 다시 원래의 장소로 복귀한다. 이 상황에서 적어도 두번의 서브루틴을 CALL 하는 과정을 연상할 수 있을 것이다. 즉, 두번의 프로그램을 CALL 하는 것은 그만큼 스택을 사용해야 한다는 것이다. 만약 이렇게 서브루틴을 CALL 해서 실행하고 있는 도중에 또 다른 인터럽트가 들어오면? ... 또 다시 스택이 쌓인다. 이렇게 쌓이는 스택에, 사용자가 저장한 스택까지 해서 총 용량을 신경써서 제한치를 넘기지 않도록 조심해야 한다. ^^

각각 인터럽트의 프로그램은 나중에 직접 해보도록 한다. 인터럽트가 체크되는 시간이 10번째 오실레이터 클릭순간이라고 했는데, 이걸 메뉴얼에서는 S5P2 라고 쓴다. 무슨 의미인지는 아직 잘 모르겠다. 혹시 아는 사람 있으면 좀 알려주시기를... ^^ AT89S52 데이터시트에서는 Timer 2 flag인 TF2는 S2P2 에서 세트된다고 기록한다. 다른 인터럽트와는 조금 다른 타이밍으로 읽혀지고 있는 것이다.

조금 너무 간단하게 설명한 것 같긴 한데, 이정도로 해두고 나중에 필요한 만큼 또 다루도록 하자...


관련자료 : http://blog.paran.com/timy/739272

인터럽트에 관해서 인터넷상에서 파일을 받아 조금만 다시 정리해 두었다. 내가 만든 자료가 아니라 공개하기가 조금 그렇다. 나중에 정리해서 다시 만들도록 하겠다. 우선은 내가 볼 부분만 정리해둔 것인데 필요하면 보도록.. ^^

[끝]
+------------------------------------------------------+
반응형

+ Recent posts