2011년8월31일_ARM_AT91SAM7S256 MCU의 인터럽트벡터테이블(예외처리테이블)과 내부 인터럽트 발생원의 입력단 블록다이어그램



● 인터럽트란?

image

※ 인터럽트1과 인터럽트2는 서로 다른 인터럽트라는 것이고 타이머/카운터, ADC등 어떤 인터럽트라도 해당된다.

인터럽트가 발생하면 IRQ예외가 발생하여 본 프로그램을 잠시 중지하고 벡터테이블에 있는 주소로 이동한다.
인터럽트 소스를 찾아 해당하는 함수의 시작주소로 이동하여 기능을 수행하고 다시 본 프로그램으로 돌아간다.

외부에서 들어오는 입력은 언제 들어 올지 예측할 수 없기에 이런 인터럽트라는 기능을 사용해 처리를 한다.
ATmega128 수업 때 배운 타이머/카운터로 주기적으로 특정 기능을 하거나,
UART(시리얼통신)에서 언제 수신될지 모르는 데이터(?) 패킷(?)을 받기 위해 무한히 대기하는 것 보단..
수신버퍼가 찼을 때 처리하면 좋겠다.
이렇게 인터럽트는 매우 유용한 기능이고 중요하니 꼭 알아가자.



● cstartup.S 예외처리부분

   1: /* Exception vectors (should be a branch to be detected as a valid code by the rom */
   2: _exception_vectors:
   3: reset_vector:
   4:         ldr        pc, =reset_handler
   5: undef_vector:
   6:         b        undef_vector    /* Undefined Instruction */
   7: swi_vector:
   8:         b        swi_vector      /* Software Interrupt */
   9: pabt_vector:
  10:         b        pabt_vector     /* Prefetch Abort */
  11: dabt_vector:
  12:         b        dabt_vector     /* Data Abort */
  13: rsvd_vector:
  14:         b        rsvd_vector     /* reserved */
  15: irq_vector:
  16:         b        irq_handler     /* IRQ : read the AIC */
  17: fiq_vector:
  18: /*------------------------------------------------------------------------------
  19:  *- Function             : fiq_handler
  20:  *- Treatments           : FIQ Interrupt Handler.
  21:  *- Called Functions     : 
  22:  *------------------------------------------------------------------------------*/
  23: fiq_handler:
  24:         b        fiq_handler


62행부터 시작되는 Exception vectors만 잘라냈다.
각각 레이블들이 어떤 의미를 갖는지 알아보자.
잘 보면 reset_vector와 irq_vector를 제외한 나머지 예외가 발생하였을 경우 아무런 처리도 하지 않고 제자리에서 점프하여 정지한다.


image


● reset_handler

AT91SAM7S256 MCU에 전원을 인가하여 ARM이 기동하거나 reset입력(NRST에 Low레벨신호 –> High레벨신호)이 들어 왔을 경우,
CU는 IP에 들어 있는 0번지부터 명령을 읽어와 해독하여 해당 기능을 실행한다.

   4:         ldr        pc, =reset_handler

Load register명령으로 reset_handler가 시작되는 주소를 program counter(instruction pointer)에 넣는다.
프로그램카운터에 주소가 들어가면 다음 수행할 명령이 그곳에 있으니 그곳으로 프로그램 흐름이 바뀐다.

우선순위를 보면 리셋이 최상위이다. 그러니 다른 예외와 동시에 발생하면 무시하고 리셋부터 처리한다.
리셋 예외에서는 리턴하여 되돌아가는 않으니 main.c파일을 작성할 때 while(1); 문을 마지막에 추가하는 것 같다.



● undef_vector

ARM 마이크로프로세서가 보조 프로세서 명령을 실행할 때는 보조 프로세서로부터 이 명령을 실행할 수 있다는 확인 신호를 기다리게 되는데, 만약 보조 프로세서에서 이런 응답이 오지 않으면 ARM은 정의 되지 않은 명령 예외를 발생한다. 이것은 하드웨어적으로 존재하지 않는 보조 프로세서를 소프트웨어적으로 예뮬레이션할 때 사용될 수 있다.

너무 어려운데…이해가 안 되 그대로 적음.
멀티 프로세스인가? 아니면 실수처리용 Co프로세서를 이야기하는 것인가?


● swi_vector

윈도우API에서 메시지와 비슷한 것.



● pabt_vector

이것은 ARM 마이크로프로세서의 메모리 시스템으로부터 신호를 받아 발생되는 예외로서, 패치된 명령이 유효하지 않거나 유효하지 않은 명령을 패치하려고 시도하면 Prefetch Abort 예외를 발생.

즉, 엉뚱한 명령을 읽어 번역할 수 없는 상태인데...좋은 기능이라 생각한다.
이런 기능이 없는 MCU에서 IP가 Code영역이 아닌 stack영역을 가리킨다고 생각하면 끔찍한 결과를 초래하겠지..


● dabt_vector

메모리 시스템으로부터 신호를 받아 발생되는 예외로서,
로드나 스토어 명령으로 엑세스된 데이터가 유효하지 않으면 Data Abort예외발생.



● rsvd_vector

AT91SAM7S256에는 없는 예외로 업그레이드판에는 회로가 추가될 수 있겠다.



● irq_vector

ARM 마이크로프로세서에 외부로부터 IRQ 신호가 입력되면 발생하는 예외로서,
CPSR레지스터에서 I = 0으로 설정된 경우에만 발생.
만약 FIQ예외가 처리 중 일 때는 IRQ 예외가 무시된다.

ARM외부이니 AT91SAM7S256 MCU 내부에 들어있는 주변회로(H/W)에서 발생하는 인터럽트 요청을 처리하는 예외이다.
(예: 타이머/카운터, PWM제어기, USART, SSC, SPI, TWI, UDP, ADC등등)
각 소스(발생원 = 주변회로)에 맞는 인터럽트벡터로 점프하고 전후처리도 함께 한다. 



● fiq_vector

ARM마이크로프로세서에 외부로부터 FIQ신호가 입력되면 발생하는 예외로서, CPSR레지스터에서 F = 0으로 설정된 경우에만 발생.
CPSR레지스터가 인터럽트를 빠르게 처리할지를 결정하는 구나..

다른 예외와 다르게 분기명령을 쓰지 않는다.

  23: fiq_handler:
  24:         b        fiq_handler

24행의 분기명령은 제자리 점프로 아무 일도 하지 않는 것처럼 보인다.
우리가 받은 스타트업 코드는 초보자에게 부담이 되지 않게 수정된 코드로 모든 기능을 사용할 수는 없다.

아무튼 멀리 분기할 필요 없이 바로 다음에 코드가 있으므로 수행시간을 절약하여 빠른 처리를 할 수 있다.
보다 빠른 처리를 위해 전용레지스터(R8_fiq ~ R12_fiq)를 사용.




● 인터럽트 소스 입력단의 구조

image

인터럽트 제어기는 각 인터럽트 소스의 동작을 개별적으로 제어할 수 있다. 내부 인터럽트의 경우는 상기의 그림과 같이 AIC_SMRx레지스터를 사용하여 레벨 감지 방식과 에지트리거 방식 중에서 하나를 설정할 수 있다.
(그림이 이상하고 윤교수님 책도 조금 이상하다 후에 정오표를 보고 수정해야겠다.)