메뉴 건너뛰기

개발도구


이번 편에서는 DSP 칩을 제대로 익히기 위한 세 번째 편으로 인터럽트를 말해보고자 한다.

인터럽트와 DSP는 어떤 관계에 있을까? 사실 인터럽트는 마이크로 프로세서 시스템에서 흔히 볼 수 있다. DSP라고 유별난 관계를 갖고 있지는 않다. 단, 스피드가 생명이기에 인터럽트도 무조건 빨라야 한다는 것이 그나마 좀 다르다고는 할 텐데, 일반 마이크로 프로세서라고 느린 것은 아니다. 'DSP 칩을 제대로 익히기 위해서'라는 소제목을 가지고 세 번째편이 준비되었다. 그렇다고 이를 마이크로 프로세서를 제대로 익히기 위해서로 바꾼다해서 이상한 것은 아니다. 결국 DSP는 마이크로 프로세서이기 때문이다.

먼저, 인터럽트에 대해서 살펴보자.

인터럽트란 무엇인가?

이 글을 읽는 순간에 전화가 왔다. 인터럽트다. 전화를 받는다. 요청된 인터럽트에 대해서 적절한 서비스를 하는 것이다. 이와 같은 일이 마이크로 프로세서에서도 일어난다. C2000 계열과 같은 DSP Controller나 Micro Controller의 경우, ADC 인터럽트를 참 많이 쓰게된다. ADC 인터럽트란, 칩 내부에 탑재된 Analog-to- Digital 변환기에서 아날로그 신호의 디지털 변환 완료를 알려주어서 그 결과치에 대한 처리를 요구하는 것인데, 여러모로 많이 쓰인다.

2407A를 예로 들어 보자.

2407A를 40MHz로 구동할 경우, ADC의 최대 변환 속도는 500nsec이다. 이를 2MSPS(Mega Sampling Per Second)라고도 표현한다. 최고속으로 구동할 경우, 샘플링당 수행가능한 명령어 갯수는 최대 20개이다. 20개의 명령어로 무엇을 할 수 있을 것인가가 상당한 고민이 된다. 가장 심각한 고민 중에 하나다.

만약, 변환된 결과를 인터럽트를 통해서 읽는다고 해보자. 다시, 이 글을 읽는 순간 전화가 왔다는 것을 가정해보자. 전화통화가 끝난 후면 다시 이 글을 이어서 읽어 나갈 것인데, 어디까지 읽었는지 기억을 해둬야 한다. 경우에 따라서는 조용한 장소로 옮겨서 전화를 받을 수도 있을 것이고... 벨이 울리고 나서 통화하는 그 순간까지를 '지연'이라고 부른다. 영어로는 Latency라고 부르는데, 마이크로 프로세서에서도 이와 같은 일이 벌어진다.

24계열의 경우, Latency가 최소 20 사이클 정도 소비된다. ADC을 읽는 작업과 비교해볼 때, 무엇인가 안 맞다는 것을 느낄 수 있을 것이다. 그렇다. 인터럽트 신호를 처리하기 위해서 20사이클을 까먹고 난 후, 결과를 읽으려 하면 이미 시간은 지난 셈이다. 실시간 신호 처리 시스템에서 신호를 계속해서 샘플링 하기에 이와 같은 일은 허용이 안된다. 이 경우는 인터럽트 방식으로 접근해서는 아니되고, 폴링 혹은 모니터링이라는 방식으로 접근해야 한다. 다시 말해, 언제 전화가 오는 지를 알고 있다는 얘기다. 그 시간에 알아서 전화를 받고, 또 끊고, 또 시간되어서 받고...

28X의 경우, 150MHz로 구동되지만, ADC는 현재 12.5MSPS까지 지원한다고 발표되어 있기에 최고속 구동시 24계열보다 더 빡빡하다. 인터럽트 방식으로는 결과를 읽기 어렵다는 짐작이 된다. 글을 쓰고 보니, 너무 예에 치중된 것 같다. 본론으로 돌아와서...

마이크로 프로세서 시스템에 왜 인터럽트라는 기능을 부여했을까?

임베디드 시스템이 적용되는 분야를 고려해보면 그 필요성을 쉽게 이해할 수 있다. 엘리베이터를 보자. 엘리베이터에 사람이 내리고 타고, 과부하가 걸리거나 혹은 비상벨요청이 있거나, 대부분의 사건이 컨트롤러 내부와 비동기적으로 생긴다. 동기적으로 생기는 일은 극히 드물다. 비동기적으로 발생하는 사건들 중에, 급한 처리를 요구하는 사건이 있다면 모든 일을 멈추고 급한 일을 처리해야 한다. 이걸 가능하게 한 것이 바로 인터럽트다. 임베디드 프로세서를 다른말로 인터럽트 기반 프로세서라고도 한다.

그러나, 칩 자체에서 제공하는 인터럽트는 많지 않다. 많지 않은 이유는 하드웨어 복잡해지기 때문이다. 28X를 예로 들자면, 28X의 Core 제공하는 인터럽트는 총 16개다. 이중, 개발자가 임의로 사용할 수 있는 인터럽트는 14개에 불과하다. 하지만, 28계열이 제공하는 인터럽트는 최고 96개까지다. 어떻게 이런 일이 가능해질까? 240XA 계열은 6개의 CPU 인터럽트에 대략 40여개의 개별 인터럽트를 제공한다. 그 사이에는 일종의 MUX와 같은 회로가 있어서, 수많은 개별 인터럽트를 소수의 CPU 인터럽트로 연결하는 역할을 한다.

이 하드웨어의 정교함에 의해서 빠른 칩이 있고 느린 칩도 있는데, 그차이가 28과 24에서도 드러난다. 24의 경우 CPU에서 개별 인터럽트를 인식하는데 S/W의 도움이 필요하지만, 28X는 그렇지 않다. 24의 인터럽트 지연이 28보다 많은 이유중 대표적인 것이다. 인터럽트 수행후 다시 본업으로 돌아오기 위해서는 몇몇 중요한 내용의 저장( Context 저장 이라고 함)

이 필요한데, 28은 하드웨어가 알아서 자동으로 하지만, 24는 개발자의 손길을 요구하고 이것 역시 지연의 원인으로 작용한다.

여기서 24와 28의 인터럽트 구조도를 잠시 보자.

[그림 1] 28X 의 인터럽트 구조도

IN1부터 INT12 까지는 개당 총 8개의 개별 인터럽트가 할당될 수 있는 구조를 갖추고 있다.



[그림 2] 240X의 인터럽트 구조도

타이머 모듈인 Event Manager와 관련 여부로 개별인터럽트를 구분해놓았을 뿐 사실상 28X와 개념은 동일하다. 재미난 것은 ADC 인터럽트같은 몇몇 인터럽트는 하나 이상의 코어 인터럽트에 맵핑이 되어 있는 것인데, 인터럽트 지연을 개선하기 위해서 마련한 것이다. 자세한 내용은 CPU 핸드북 게시판에서 인터럽트관련 게시물을 참고 바란다.

인터럽트가 무엇인가 대해서는 대략적으로 살펴봐진 것 같다.

남은 부분은 인터럽트 벡터에 대한 것인데,

하드웨어적으로 인터럽트가 서비스 된다는 것이 어떤 의미인지 곰곰히 생각해보면 답이 나온다. 예를 들어, 현관문을 누가 똑똑 거리는데, 전화기를 들고 여보세요? 한다면... 이처럼 인터럽트마다 구분이 되어 있어서, 현관문은 1번, 전화기는 2번, 인터폰은 3번 이와 같은 식으로 미리 번호를 정해두는 것이 하드웨어 적으로 인터럽트 회로를 구현한 것이다. 마이크로 프로세서에서는 프로그램 메모리의 특정번지를 인터럽트에 할당을 해두는 데, 240XA 계열에서는 프로그램 메모리 0x0000 ~ 0x003F 까지를 인터럽트 영역으로 쓰고 있다. 몇줄 안되는 영역에서 어떻게 인터럽트 프로그램을 수행하는지 의문이 있을 수도 있을 것이다. 실제로 이 영역에는 인터럽트 서비스 코드가 들어가는 것이 아니라, 인터럽트 서비스 코드가 있는 곳으로 분기할 수 있는 코드가 들어간다. 이 코드를 벡터라고 한다. 위치 정보가 필요한 코드이기에 벡터라고 부르는 것이다. 칩마다 벡터 영역이 다 다르다. 24와 28이 다르고 C5000과 C6000이 다르다.

인터럽트를 다루는 것은 그다지 어렵지 않으나, 인터럽트를 어떻게 활용할 것인가 하는 것은 상당히 어려운 주제다. 명확한 답을 얻기 위해서는 인터럽트에 대한 정확한 이해와 인식을 해야 하는 데, 이 글이 조금이나마 도움이 되었기를 바란다.

다음은 세종대 양홍준 윤재선 학생이 조사한 인터럽트와 폴링에 대한 내용이다. 참고가 되었으면 한다.

폴링과 인터럽트 -

일반적으로 CPU에서 입력을 받아들이는 방법에는 두 가지가 있다. 하나는 프로그래머가 명령어를 사용하여 입력 핀 또는 값을 계속 읽어서 변화를 알아내는 것이고 다른 하나는 CPU 자체가 하드웨어적으로 그 변화를 체크하여 변화시 일정한 대처를 하는 것이다. 전자를 폴링(polling) 기법이라고 하고 후자를 인터럽트(interrupt) 기법이라고 한다.

폴링은 일반적으로 사용하는 방법으로 이해하기가 쉽지만, 인터럽트는 처음에는 잘 이해하기가 어렵다. 인터럽트를 만났을 때 CPU는 다음과 같이 동작한다. CPU는 지금까지 수행하던 프로그램은 일단 중단하고 미리 정해놓은 인터럽트 루틴을 수행하게 된다. 그 루틴의 수행이 끝나면 다시 원래 실행하던 프로그램으로 돌아가서 하던 일을 계속한다.

폴링과 인터럽트는 각기 장단점이 있으므로 사용자가 어느 것을 사용할 것인가를 결정해야 한다. 폴링은 모든 경우의 입력 또는 값의 변화에 대응하여 처리가 가능하지만 인터럽트는 하드웨어적으로 지원되는 몇 개의 입력 또는 값의 변화에만 대응 처리가 가능하다. 즉, CPU를 만들어 낼 때부터 결정이 되어 있는 것이다. 처리 속도는 일반적인 경우에 인터럽트가 더 빠르다고 할 수 있다.


일반적으로 CPU 내부 또는 주변에서는 많은 값 또는 신호의 변화가 일어나게 된다. 예를 들면 외부 입력 핀의 레벨이 변화하거나, 내부의 카운터가 증가하여 오버플로우(overflow)가 일어나거나, 시리얼 포트로 입력 신호가 들어오거나 하는 등등의 많은 변화가 동시 또는 약간의 시간차를 두고 무작위로 발생한다. 만약에 인터럽트라는 것이 없어서 이 모든 것을 프로그래머가 직접 관리해야 한다면 너무나도 복잡하여 프로그래밍이 거의 불가능할 지도 모른다.

보통 특정값 또는 입력 핀의 레벨이 변하면 프로그래머는 CPU에게 그에 상응하는 처리를 하도록 만들어 준다. 만약에 폴링 기법을 사용했다면 프로그래머는 자신의 마음대로 그 자리에서 처리를 하거나 CALL, JMP 등을 사용할 수 있다. 그러나 인터럽트 기법을 사용했다면 프로그래머는 그 CPU를 만들 때 이미 정해진 일정한 규칙에 따라야 한다. 8051에서는 5개의 인터럽트를 지원하며, 특정 인터럽트가 발생하면 그 인터럽트에 할당해 준 특정 번지로 제어를 옮긴다. 분기의 방법은 LCALL과 유사하다. 즉, 스택에 돌아올 번지를 저장한 후에 분기하게 된다. 이렇게 분기된 제어는 인터럽트 전용 복귀 명령인 RETI로 원래의 흐름으로 되돌아온다. RETI는 CALL에서의 복귀명령인 RET와는 다른 명령이다.

<자료출처 - (주)싱크웍스(http://www.syncworks.co.kr)>

※ 글을 옮겨갈 때에는 꼭 출처를 밝혀주시기 바랍니다.





번호 제목 날짜 조회 수
공지 [TIP] Jedis로 원격지 Redis접속에 실패할때 2017.09.27 7038
공지 [TIP] 앱 실행시 관리자 권한을 얻도록 Visual Studio에서 설정하기 2017.01.22 6556
공지 [TIP] 파이선에서 C 코드 호출하기 (How to call C function from Python) [1] 2018.08.14 6421
33 [LINK]PID 제어와 연관해서 만든 로봇 정보 2005.03.25 575
32 [LINK]프린터 포트이용 ARM9 디버깅 2005.03.03 547
31 [LINK] 소스코드 깔끔히 하이라이트 시켜주는 툴 2004.10.25 596
30 [LINK] The Art of assembly language 2004.10.23 499
29 [LINK] USB정보 분석 툴- USB Monitor, USB머하니 2004.10.13 2881
28 [TIP] WinCVS의 간략한 사용방법 [1] 2004.10.11 455
27 [TIP] Linux상에서 메모리 릭 잡는 도구 2004.08.24 619
26 [TIP] CYGWIN 설정/변경하기 2004.06.21 664
25 [TIP]OUTLOOK에서 첨부파일 형식 허용 및 차단하는 방법 2004.05.19 824
24 [DSP]제9편 - Fixed Point Processor - (1) 2004.05.07 690
23 [DSP]제8편 - Floating Point Processor의 한계 2004.05.07 621
22 [DSP]제7편 - Floating Point Processors 2004.05.07 719
» [DSP]제6편 - DSP 칩을 제대로 익히기 위해서(3) - DSP와 인터럽트 2004.05.07 1398
20 [DSP]제5편 - DSP 칩을 제대로 익히기 위해서(2) - 메모리 맵의 이해하기와 DSP 칩이 갖춰야 할 덕목 2004.05.07 1151
19 [DSP]제4편 - DSP 칩을 제대로 배우기 위해서 - Core 이해하기 2004.05.07 741
18 [DSP]제3편 - DSP는 RISC 인가? CISC인가? 아니면 뭔가? 2004.05.07 950
17 [DSP]제2편 - DSP 칩, 왜 필요한가? 2004.05.07 858
16 [DSP]제1편 - DSP 칩, 그것이 알고 싶다. 2004.05.07 1187
15 [TIP] Windows Update 가 안될때 ... 2004.04.30 892
14 [LINK] 8051 CPU Application Notes 2004.04.27 550
위로