임베디드랜드

----------------------------------------------------------------------
                     ARM7 강좌 [6] : Exception(2)
----------------------------------------------------------------------

* Exception Overview

  Exception을 처음부터 완전히 이해 할 필요가 있다고는 생각하지  않습니
  다. 대부분의 것들이 그러하듯 우선은 이런게 뭐다 라고 파악만 하고  있
  다면, 정작 필요할 경우에 다시 자세히 살펴보아도 좋을 것입니다.

  그런 취지에서 Exception을 바라본다면, ARM 7 에는 여섯가지의 CPU 동작
  모드를 지원한다는 사실과, 차후 MMU 같은것에도 그 동작모드가 관여한다
  는 것. 그리고 각 모드마다 스택을 따로 설정해 준다는 것... 등.

  꼭 알아야 할 것이 있다면 IRQ나 FIQ 정도가 되겠지요. 흔히 말하는 인터
  럽트 관련 부분이 바로 이 부분입니다. 실제 코딩을 할 경우에는 CPU에서
  정해져 있는 IRQ, FIQ관련 레지스터를 설정하고, 해당 벡터 번지를  바꾸
  는 정도... 그리고 초기화 시에 해당하는 스택 공간을 따로 잡아주는  정
  도만 신경을 쓰면됩니다.

  원래는 각 Exception 모드마다 종료방법이 각기 다름을 설명드리려고  했
  는데, (구체적으로는 FIQ는 서비스 종료시에 SUBS pc,r14_fiq,#4)라는 명
  령을 사용해야 합니다, 혹은 소프트웨어 인터럽트의 경우엔
  MOVS pc,r14_svc 를 사용합니다.) 굳이 그런 내용까지 다룰 필요는  없을
  듯 하다는 생각입니다. 필요한 경우 도큐먼트를 참조하면 자세히 나와 있
  거든요... 참고로 그렇게 각각 경우에 따라 복귀 방법이 다른 이유는  추
  측컨데 파이프라인 기능과 관련이 있는것 같습니다.

  그러면, 다시 앞으로 돌아가서, Exception과 CPU동작모드의 연관성에  대
  해 마저 얘기해 보려 합니다. CPU동작 모드는 일반적으로는 Exception 에
  의하여 바뀌게 되고, User모드가 아니라면 프로그램에 의해 강제로  바꿀
  수도 있습니다.

  전에 살펴보았던 CPSR(스테이터스 레지스터)과 관련되어, CPSR의  모드비
  트 부분에 현재 CPU의 동작모드를 나타내는 비트들이 있는데, 해당  비트
  를 변경시킴으로서 프로그램에서 동작모드를 전환할 수 있습니다.

  OS를 포팅할 경우 동작모드와 관련하여 메모리 보호기능 등도 구현될  수
  있습니다.

  마지막으로 몇가지 사항만 말씀드리고 오늘 강좌를 마치려 합니다.

  우선, Exception간의 우선순위 문제인데, 기본적으로 ARM7은 IRQ, FIQ 를
  지원하지 않습니다. 해당 인터럽트가 발생하면 CPU는 CPSR의 인터럽트 금
  지 플래그를 설정합니다. 만약 도중에 인터럽트를 받고 싶다면  사용자가
  해당 플래그를 클리어 해주어야 합니다. 또, 동시에 여러개의  Exception
  이 발생한 경우라면 그 우선순위는 다음과 같습니다.

        1) Reset (가장 높은 우선순위)
        2) Data abort
        3) FIQ
        4) IRQ
        5) Prefetch abort
        6) Undefined Instruction, Software Interrupt

  Exception 부분을 설명하다 보니 강좌가 자칫 너무 딱딱해지는 감이 있어
  서 그냥 이쯤에서 마무리를 지으려 합니다.

  다음 강좌부터는 좀더 구체적인 ARM7의 인스트럭션에 대해 다루겠습니다.
  명령어가 몇개 되지 않기 때문에 3회 정도로 다룰 생각이구요.

  그럼 다음 강좌에 뵙겠습니다.
Posted by suvisor