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회 정도로 다룰 생각입니다..


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


+ Recent posts