ARM Architecture


 
* Update history

- 2012.8.14 : 초기 Release



 
5. ARM Processor
   5.1 ARM 프로세서의 종류
   5.2 ARM Processor 선택
6. ARM Architecture
   6.1 ARM based system
   6.2 ARM Operating Modes
   6.3 ARM Registers
   6.4 ARM Exceptions
   6.5 Exception 과 Interrupt의 차이
   6.6 ARM에서의 Interrupt system


 



5. ARM Processor

4장까지는 학교다닐때 한번씩은 들어 밨음직한 내용으로 다소 지루한 내용이었던 같습니다. 이제 5장부터 본격적으로 ARM 에 대해서 공부해 보도록 하겠습니다.

ARM(영국회사) 사는 architecture core 및 system core 를 License 해주는 IP 회사 입니다. 직접 반도체를 제조하여 판매하는 것이 아니라 설계한 프로세서를 반도체 회사에 Hard Macrocell(수정불가) 또는 Synthesizable core(일부 수정 가능) 로 제공 합니다. 반도체 제조회사에서는 ARM사로 부터 제공받은 ARM core와 주변 장치를 추가하여 SOC를 만들어 사용자에게 판매하거나 자체 제품에 사용 합니다.

참고로 아래 내용들은 최근 ARM사의 연혁 입니다. Cortex-M3(2004년), M0(2009년), M4(2010년), 등을 발표한 년도 등을 알수가 있네요.

2012

2011

2010

  • Giesecke & Devrient secure mobile payments announcement via ARM TrustZone and G&D's Mobicore technologies
  • ARM launches Cortex-M4 processor for high performance digital signal control
  • ARM together with key Partners form Linaro to speed rollout of Linux based devices
  • Microsoft becomes ARM Architecture Licensee
  • ARM & TSMC sign long-term agreement to achieve optimized Systems-on-Chip based on ARM processors, extending down to 20nm
  • ARM extends performance range of processor offering with the Cortex-A15 MPCore processor
  • ARM Mali becomes the most widely licensed embedded GPU architecture
  • ARM Mali-T604 Graphics Processing Unit introduced providing industry-leading graphics performance with an energy-efficient profile
  • ARM announces Corelink 400 series of AMBA 4 protocol-compliant system IP

2009

  • ARM announces 2GHz capable Cortex-A9 dual core processor implementation
  • ARM invests in Japanese software vendor eSOL to develop enhanced platforms for next-generation automotive electronics
  • ARM launches its smallest, lowest power, most energy efficient processor, Cortex-M0
  • ARM Ltd. receives Best Companies accreditation
  • ARM extends its leadership in media processing by acquiring Logipard AB

2008

  • ARM announces 10 billionth processor shipment
  • ARM wins Britain's Top Employer Award 2008 from crf.com
  • ARM announces Industry First silicon-on-Insulator Physical IP for IBM's 45nm SOI Foundry
  • ARM Mali-200 GPU Worlds First to achieve Khronos Open GL ES 2.0 conformance at 1080p HDTV resolution

2007

  • Five billionth ARM Powered processor shipped to the mobile device market
  • ARM Cortex-M1 processor launched – the first ARM processor designed specifically for implementation on FPGAs
  • AMBA Adaptive Verification IP launched
  • RealView Profiler for Embedded Software Analysis introduced
  • ARM unveils Cortex-A9 processors for scalable performance and low-power designs
  • ARM Introduces SecurCore SC300 Processor For Smart Card Applications
  • Warren East, CEO, wins Orange Business Leader of the Year Award

2006

  • IEEE honors ARM with its 2006 Corporate Innovation Recognition award.
  • ARM Cortex-A8 processor recognized as "Best In 2005" by four leading electronics industry publications

2005

  • ARM listed by Electronic Business as one of the ten most significant companies in electronics over the past 30 years
  • ARM acquired Keil Software
  • ARM Cortex-A8 processor announced
  • ARM launched DesignStart Program

2004

  • ARM acquired Artisan Components Inc.
  • The ARM Cortex family of processors, based on the ARMv7 architecture, is announced. The ARM Cortex-M3 is announced in conjunction, as the first of the new family of processors
  • ARM Cortex-M3 processor announced, the first of a new Cortex family of processor cores
  • NEON media acceleration technology announced
  • ARM technology licensed to Aplix, Atheros, Broadcom, CSR, Kawasaki, NEC, Socle, Sony Ericsson, Thomson, Toshiba, Samsung and ZRRT
  • ARM acquired Axys Design Automation
  • MPCore multiprocessor launched, the first integrated multiprocessor
  • OptimoDE technology launched, the groundbreaking embedded signal processing core



5.1 ARM 프로세서의 종류

ARM Processor에 대해서 나름대로 정리를 해본 것입니다. 이 표와 다르게 분류를 하는 사람들도 있습니다. 이것은 제 개인적인 판단에 의한 분류 입니다.
Cortex 프로세서 이전의 ARM Processors들을 전통적인 ARM으로 분류 하였고 Cortex-M, R 시리즈 까지는 기존의 uCOM시장의 프로세서들을 겨냥한 저가이면서 Realtime 프로세서 시장을 겨냥한 프로세서 이고, A 프로파일 부터는 고성능의 Application을 구현하는 프로세서로 분류 하였습니다.


소프트웨어 구성

5.1.1 ARM7 Processor

(1) ARM7TDMI Core
- RISC Architecture (ARM v4T)
- 3 stage pipelining
- Hard macrocell
- 32-bit ARM/16-bit Thumb Instructions
- Unified bus architecture( 폰노이만 버스 구조)
- ARM720T = ARM7TDMI + MMU + Cache(8KB Unified) + WB + AMBA
- S3C44B0 등

(2) ARM7TDMI Block Diagram
소프트웨어 구성

5.1.2 ARM9 Processor
(1) ARM9TDMI Core
- RISC Architecture (ARM v4T)
- 5 stage pipelining -> Improved clock frequency
- Harvard Bus Architecture
- Simultaneous access to instruction and data memory
- Hard macrocell
- 32-bit ARM/16-bit Thumb Instructions
- ARM920T = ARM9TDMI + Dual Caches + MMUs + WB + AMBA + PA TAG RAM
- S3C2440, S3C2443 등

소프트웨어 구성

앞의 ARM7과 달리 명령어 버스와 데이터 버스가 구분이 되어 있는것을 알수 있습니다. 여기서 약간 생소한 용어가 보이는데요, Write back PA TAG RAM 이 뭘까요 ? 이 용어를 설명하기 위해서는 먼저 캐시 메모리의 2가지 동작 방식을 알아야 합니다. Cache메모리의 내용을 주메모리에 Write할때, Write-through 방식과 Write-back 방식이 있습니다. Write-through방식은 캐시 메모리의 내용이 업데이트 될때 주 메모리에도 동시에 업데이트가 되는 방식이고 Write-back 방식은 캐시메모리의 내용이 업데이트 되어도 바로 주 메모리에 반영이 되는 것이 아니라 Write back PA TAG RAM 에서 잠시 저장해 두었다가 블록 단위로 CPU가 쉬고 있는 동안에 주 메모리에 업데이트 하는 방식 입니다. Write Buffer는 Write-throuh 방식일 경우에 Data Cache의 내용을 주 메모리에 Write 하기 전에 Buffer 역할을 해주고, Write back PA TAG RAM은 Write-back 방식을 경우에 Data Cache의 내용을 잠시 보관하고 있다가 주 메모리에 Write를 해주는 역할을 합니다.

5.1.3 ARM11 Processor

(1) ARM1176JZ(F)-S Core
- ARM v6 Architecture
- Improved Multimedia Performance
  2x faster MPEG4 encode/decode
  SIMD(Single Instruction, Multiple Data) Instructions : 단일 명령으로 다중 데이터를 처리하는 것을 말합니다.
- Improved Real-Time Performance
  Fast Exception/Interrupt Handling
  Vector Interrupt Controller -> Reduced Interrupt Latency
  New Stack and Processor Mode Change Instructions
소프트웨어 구성
- Improved Memory Interface
  Un-aligned Data Access
  Mixed-Endian
  8 stages pipeline
  Higher clock frequency
  9 stages pipeline for ARM1152T2(F)-S
  Separate load-store and arithmetic pipelines
  Branch prediction (static & dynamic)
  Return Stack

- Other features
  High Performance Integer Processor
  Physically-tagged caches
  Jazelle technology
  VFP (Vector Floating Point)
  Non Blocking
  HUM (Hit Under Miss)
  ARM TrustZone Technology
  Thumb-2 Instruction
  Intelligent Energy Manger (IEM) Technology

- S3C6400, S3C6410 ..

5.1.4 ARM Cortex Families
(1) A profile (ARMv7-A) : Application Profile
- For sophisticated, high-end applications running open and complex operating systems
- ARM, Thumb, Thumb-2 instruction sets
- S5PC100, S5PV210, OMAP3530 ..

(2) R profile (ARMv7-R) : Real-time Profile
- For real-time system
- ARM, Thumb, Thumb-2 instruction sets

(3) M profile (ARMv7-M) : Microcontroller Profile
- For cost-sensitive and microcontroller applications
- Thumb-2 instruction set only
- STM32F 시리즈

공교롭게도 새로 발표된 Cortex 패밀리의 Profile의 첫번째 이름이 A.R.M 으로 회사 이름과 동일 하네요. 우연의 일치 인가요? ^^

5.2 ARM Processor 선택
- Embedded real-time Processor
Embedded real-time systems for storage, automotive body and powertrain, industrial and networking applications

- Application Processor
Devices running open operating systems including Linux, Palm OS, Symbian OS and Windows CE in wireless, consumer entertainment and
digital imaging applications

- Secure Processor
Smart cards, SIM cards and payment terminals

위와 같이 전문적으로 분류 할 수도 있게지만 결국 현업에서의 프로세서 선택의 가장 큰 기준은 가격대비 성능일 것입니다. 실제 구현하려고 하는 프로젝트를 구현 할 수 있는 가장 낮은 Cost의 프로세서를 선택 할 것이기 때문 입니다. 현장 에서는 Money, Money 해도 싼게 최고죠. 여기서 또 한가지 S/W 개발자의 입장에서 생각해 보면 개발의 난이도일 것입니다. 전통적인 ARM에 해당하는 ARM7, ARM9, ARM11 프로세서들은 RAM, ROM을 CPU외부에 위치 시킵니다. 이러한 이유(CPU, 제품마다 주소와 초기화 코드등이 틀려짐)때문에 코드의 호환성( 사용하는 메모리 뱅크와 메모리의 용량, 종류에 따라서 소스 레벨의 코드가 달라짐)이 매우 떨어지고 부트로더 등을 직접 작성 해야 합니다. 이에 반해서 Cortex-M, R 프로파일의 코어들은 CPU내부에 RAM, ROM을 가지고 있고 Address 또한 같은 코어를 사용하는 CPU들은 모두 동일 하게 사용됩니다. 그래서 컴파일러(개발 IDE) 수준에서 부트로더를 제공 할 수도 있습니다. 실제로 대부분의 상용 컴파일러 들은 개발자가 부트로더 코드를 작성하지 않아도 기본으로 제공하고 있습니다.

6. ARM Architecture
6.1 ARM based system

소프트웨어 구성

위의 블럭도는 ARM Core에 대한 블럭도는 아니고 붉은색 부분의 ARM Core를 이용해서 구현한 CPU의 한 예 입니다.

6.2 ARM Operating Modes

(1) 7개의 Processor Mode가 존재
User, FIQ, IRQ, Supervisor, Abort Mode, Undefined, System Mode

(2) Operating Mode 변경은 Hardware 및 Software로 가능 합니다.

ARM 프로세서에 전원이 인가 되면 SVC 모드에서 시작이 되고 인터럽트, 익셉션 등이 발생하면 상황에 맞추어서 H/W 적으로 Operating Mode 가 변경이 되거나 S/W 적으로는 SWI 명령어에 의해서 SVC 모드로 진입 할 수도 있습니다. ARM Core에는 왜 이렇게 여러가지 동작 모드가 존재하는 것일까요? 아마도 아키텍쳐 차원에서 소프트웨어의 보안및 동작을 지원 하기 위해서일 것입니다. 가령 OS 설계시 커널 S/W 는 모든 권한을 가지고 수행 하도록 하고, User 어플리케이션은 제한된 권한을 가지고 수행을 하도록 설계 한다면 어플리케이션 프로세서는 모든 권한이 없는 User Mode 에서 동작 시키고 나머지 커널및 디바이스 드라이버들은 권한이 있는 나머지 모드(Supervisor, System Mode)에서 실행 시키도록 할 수 있습니다. 물론 이러한 기능은 S/W 적으로도 구현이 불가능한 것은 아니지만 구현을 위해서는 더 많은 노력이 필요할 것입니다.

Mode Description
Supervisor(SVC) Entered on reset and when a Software Interrupt instruction (SWI) is executed Privileged modes
FIQ when a fast(urgent) interrupt occurred
IRQ when a normal interrupt occurred
Abort(ABT) when a data fetch or instruction prefetch aborts
Undef(UND) when an undefined instructions is executed
System(SYS) Privileged mode using the same registers as User mode
User(USER) Mode under which most Applications / OS tasks run Unprivileged mode

- CPSR Register를 Privilege Mode 에서 S/W 로 변경 가능, User Mode에서 변경하면 Undefined Instruction Exception 이 발생 합니다.
- ARM Core에 전원이 인가되면 최초에는 Supervisor 모드로 동작을 합니다. 처음에 권한이 없는 모드로 시작을 하면 Privilege Mode로 전환 할 방법이 없겠죠.
- 각 모드는 별개의 Stack영역과 Banked Register 영역을 가지고 있습니다.

위에서 여러가지 모드가 많이 있지만 언제 어떤 모드를 반드시 써야만 하는 규칙이 있는 것은 아니고, 일반 적인 권고 사항일 뿐입니다. 대부분 OS를 운영하지 않는 단순한 펌웨어 레벨의 코드들은 초기 부팅시 설정된 Supervisor 만 사용하는 경우도 많이 있습니다. 위의 표를 보면 mode는 크게 Privileged modes와 Unprivileged mode 로 나눌 수 있습니다. 2가지 mode 구분의 차이는

(1) Privileged Mode (특권 모드)는 IRQ나 FIQ등의 Interrupt의 사용 가능 유무를 직접 설정 할 수 있습니다.
(2) Privileged Mode는 자기들끼리 서로 Mode 변경이 자유자재로 가능 합니다만, Normal Mode는 자기 스스로 Privileged Mode로 Mode의 변경이 불가능 합니다.

그것은 예를 들어, SYS ↔ FIQ, IRQ ↔ SVC과 같이 Privileged Mode → Normal Mode (USR)은 가능하지만, USR → Privileged Mode로의 변경은 불가능 합니다. 아주 중요한 사실입니다. 기억해 주세요. 결국 Privileged Mode는 자기들 멋대로 Mode에 관한 한 자유롭게 왔다 갔다 할 수 있지만, USER Mode는 가능하지 않습니다.


FIQ, IRQ, Abort, Undef 모드는 이후의 장에서 좀더 자세히 설명 하도록 하고 System mode, User mode, Supervisor (SVC) mode 에 대해서 먼저 설명 하도록 하겠습니다. User Mode는 Application Program을 Execution 하는 Mode이고, System Mode는 Privileged Operating system task가 실행되는 mode이고, Supervisor mode는 보호된 Operating system(커널등) 에서 주로 사용되는 mode 입니다.

6.3 ARM Registers
6.3.1 Normal Registers

소프트웨어 구성

앞 시간에 레지스터는 임시로 데이터를 보관하고, 연산에 사용되고, 프로그램 제어에 사용되는 접근속도가 가장빠른 임시 기억장치 라고 설명을 하였습니다.

ARM Core를 잘 이해하기 위해서는 ARM Core에 내장되어 있는 기본 Register들이 어떻게 구성되어 있고, 사용되는지를 잘 알아야 합니다. Register들은 Core가 사용할 수 있는 저장 매체 중에서 가장 빠른 속도를 자랑하며, ARM의 동작은 모두 Register들을 어떻게 사용하는냐에 따라서 동작을 제어 할 수 있습니다. 결국 ARM 프로세서를 사용 한다는 것은 아래 Register들을 가지고 연산을 하며 주 메모리와 메모리 매핑된 주변 장치들을 제어하기 위해서 Load, Store 하는 것입니다.

위의 레지스터 그림을 보면 ARM 동작모드별로 구분이 되어 있고, 동작 모드에 따라서 파란색 박스로 한번 더 구분이 되어 있는것을 볼 수 있습니다. 파란색 박스로 되어 있는 레지스터들을 뱅크드 레지스터라고 합니다. 그러니까 힌색박스의 레지스터는 동작 모드에 상관 없이 공통으로 사용되어지고 파란색 박스의 뱅크드된 레지스터는 동작 모드별로 독립적으로 사용 가능하다는 것입니다. 말로만 해서는 잘 이해가 되지 않지요.



소프트웨어 구성

한가지 예를 들어서 설명을 하도록 하겠습니다. CPU에 최초 전원이 인가되어 SVC 모드로 동작을 하다가 FIQ인터럽트가 발생 하였을 경우 레지스터 상태는 아래와 같습니다. FIQ로 전환이 되면 R8 ~ R14까지는 FIQ전용 레지스터가 사용이 됩니다. 이말은 FIQ모드에서 R8 ~ R14는 SVC모드에서의 R8 ~ R14와는 다른 레지스터 입니다. 즉 SVC모드에서 FIQ가 발생이 되었을때 문맥(Context) 보존을 위해서 R8 ~ R14는 저장을 하지 않아도 FIQ모드에서 R8 ~ R14는 마음대로 사용해도 됩니다. CPSR레지스터도 FIQ, SVC 모드에서 각각 존재 합니다.

소프트웨어 구성

여기서 문맥(Context)이라는 용어가 나오는데, 문맥이라는 의미가 무엇일까요?

S/W 입장에서 생각해 보면 프로그램이 순서대로 실행이 되다가 어떤 순간에 ISR이 발생을 하면 원래의 프로그램 실행을 잠시 중단하고 ISR 서비스 루틴으로 이동하게 됩니다. 이때 ISR서비스 루틴으로 이동을 하는것을 문맥의 전환이라고 하는데요 ISR 서비스 루틴으로 이동하고 나서 ISR서비스를 마치고 원래의 프로그램이 계속해서 실행이 되어야 하는데 만약 ISR서비스 루틴에서 특정 레지스터들(R0 ~ R12)을 사용하였다면 그 값들이 변동이 된상태에서 원래의 프로그램이 실행되던 위치로 돌아와서 계속 실행을 하게 되면 원하지 않던 결과가 나올 수 있습니다. 이런한 이유 때문에 문맥의 보존을 위해서 ISR 서비스 루틴으로 이동을 하기 전에 ISR에서 사용될 레지스터들을 스택에 임시로 저장을 하고 ISR루틴을 빠져나오기 전에 스택에 저장되어 있던 레지스터들을 다시 복원시켜 줍니다.

ISR 서비스 루틴으로 이동하는 것을 문맥의 전환이라 하고
ISR 루틴에서 사용 할 레지스터들을 임시로 스택에 저장하였다가 ISR루틴의 수행을 마치고 복귀하기전에 저장해 두었던 레지스터들을 원래의 값으로 복원하는 것을 문맥 보존 이라고 합니다.

아 ~~ 설명이 길어 지고야 말았네요. 이것도 간단하게 예를 들어서 다시 설명을 하도록 하지요.

소프트웨어 구성

위의 그림에서 "MOV R1, #2" 명령 이후에 Interrupt가 발생하지 않았다면 R2에서 #3이 들어가 있어야 하나  ISR 서비스 루틴에서  R0, R1을 #0으로 변경하여 ISR 루틴 복귀 후  R2에는 #0이 들어가 있습니다. 이것은 원래의 원하던 프로세스 흐름이 아닙니다.


소프트웨어 구성

위의 그림에서는 스택을 이용해서 ISR 서비스 루틴에서 문맥 저장(PUSH)과 복원(POP)을 하고 있어 Interrupt가 발생하여 문맥전환(Context Switch - ISR 서비스 루틴으로 이동)이 일어난 후에도 복귀 하였을때 R2에는 정상적으로 #3이 들어가 있습니다.

소프트웨어 구성

위의 예제는 FIQ 인터럽트가 발생 했을 경우이 예제 입니다. R10에 저장되는 값은 몇일까요 ?
정답은 #3이 들어가 있겠죠. 왜냐하면 FIQ 모드에서 사용되는 F8 ~ R14는 뱅크드 되어 있어서 Normal루틴에서 사용되는 R8 ~ R12와는 별개의 레지스터 이기 때문에 FIQ 모드에서 R8 ~ R12 는 문맥저장과 복원을 하지 않아도 되는것 입니다. 하지만 FIQ 모드에서도 R0 ~ R7 를 사용한다면 문맥 저장과 복원을 해야 겠지요.
이해가 가시나요. ARM 위의 3가지 경우에 대해서 직접 코드를 입력해서 테스트 해보도록 하세요. 어셈블리어로 코드를 작성 할때 아주 중요한 내용 입니다.

6.3.2 Special Registers
ARM 레지스터들중에서 R0 ~ R12 까지는 일반 연산, 임시 저장 장소등으로 사용이 되고 R13 ~ R15까지는 조금 특별한 의미를 가지고 있습니다.
그리고 CPSR(Current Program Status Register) 이라는 상태 레지스터도 있습니다.

(1) R13
- Stack Pointer(SP)
- ARM 동작 모드별로 스택 포인터를 가르키고 있습니다.

- R13(SP)는 ARM 동작 모드별로 뱅크드 되어 있는 레지스터 입니다.

(2) R14
- Link Register(LR)
- 함수 호출시 리턴될 주소를 가지고 있음
- R14(LR)는 ARM 동작 모드별로 뱅크드 되어 있는 레지스터 입니다.

함수 호출시 복귀할 주소를 저장하기 위해서 레지스터 까지 1개를 할당했는데 어떤 장점이 있을까요 ?
여러번 분기(BL)하는 경우가 아닌 한번만 분기(BL) 하는 경우라면, 함수 에서 원래의 주소로 복귀할때 스택을 사용하지 않고 R14 레지스터를 사용함으로써, 그 속도에서 이익을 얻게 되는 것입니다.

* 스택 접근 = 메인 메모리 접근 = 느림

레지스터는 CPU가 접근 할 수 있는 가장 빠른 고속의 메모리 저장 공간 이라고 생각하면 되겠습니다.

(3) R15
- Program Counter(PC)
- PC를 사용하여 메모리에서 명령어를 Fetch
- R15(PC)는 프로세서 모드에 상관없이 하나의 R15를 가지고 있음( ARM 동작모드별로 뱅크드 되어 있지 않습니다.)

(4) CPSR
- Program Status Register (CPSR)
- CPSR은 ARM 동작 모드별로 뱅크드 되어 있는 레지스터 입니다.
- 프로세서 모드가 변경이 되면 하드웨어적으로 변경되기 이전의 CPSR 복사본이 SPSR( Saved Program Status Register - CPSR의 뱅크드 레지스터) 에 저장이 됩니다.
- User, System 모드를 제외하고 각 동작 모드마다 하나씩 존재 합니다.

아래 그림이 좀 복잡해 보이기는 하지만 CPSR도 32bit 레지스터일 뿐입니다. 지금부터 하나씩 파혜쳐 보도록 하지요.

소프트웨어 구성

앞에 NZCVQ는 Flag field라고 해서, 뭔가 연산한 후에 set되는 register입니다. 이 field는 방금 처리된 ALU의 연산 결과의 상태를 나타냅니다.

1) N : Negative - 연산결과가 마이너스인 경우에 set 됩니다.

2) Z : Zero - 연산결과가 0인 경우에 set 되요.

3) C : Carry - 연산결과에 자리 올림이 발생한 경우에 set 됩니다.

4) V : oVerflow : 연산의 결과가 overflow 났을 경우에 set되는데, Over flow라는건 넘치는 경우니까 원래 가져야 하는 Range보다 결과 값이 큰 경우가 그 경우에 해당됩니다.

이것의 필요성은 ARM의 철학이기도 한데, ARM core는 Opcode를 Memory에서 가져오자 마자 (Fetch) 이를 무조건 실행하는 것이 아니라 Condition flag인 NZCV를 보고 바로 앞 opcode의 실행결과를 보고 실행할지 말지를 결정할 수 있습니다. Default는 AL "Always" , condition과 관계없이 항상 실행 하는 것입니다. Control Field에 대해서는 우선 여기까지 설명을 하고, ARM Instruction에서 좀더 자세히 예를 들어서 설명을 하도록 하겠습니다.

Control Field의 7번 비트인 "I" 을 1로 마스킹을 하면 인터럽트가 발생 하지 않습니다. 인터럽트를 받아 들이기 위해서는 0으로 Clear 해야 합니다.
마찬가지로 Control Field의 6번 비트인 "F" 을 1로 마스킹을 하면 Fast 인터럽트가 발행 하지 않습니다. Fast 인터럽트를 받아 들이기 위해서는 0으로 Clear 해야 합니다. 마지막으로 5번 비트인 "T" 모드가 있습니다. ARM Core는 초기 부팅시에는 무조건 ARM 모드(5번 비트의 "T" 가 0으로 설정 됨)에서 시작이 되고 경우에 따라서 Thumb mode로 전환을 할 수가 있습니다. Thumb mode에 대해서는 이후의 장에서 다시 설명을 하도록 하겠습니다. 앞절에서 ARM에는 7가지의 동작 모드가 있다고 하였는데, 이 동작 모드들에 따라서 위의 표와 이 CPSR의 하위 5bit(Mode bits)의 값들이 설정이 됩니다.

6.4 ARM Exceptions

Exception 이란 무엇일 까요? 사전적인 의미로는 "예외" 라고 되어 있습니다. 하지만 우리는 지금 ARM을 공부하고 있기 때문에 좀더 ARM 적인 표현을 한다면,
외부 요청이나 프로그램 오류로 인해 코드의 정상적인 흐름을 벗어나는 동작 이라고 설명을 하겠습니다. 코드의 정상적인 흐름을 벗어난다는 이갸기는 PC(R15)의 주소가 바뀌게 되는 것입니다. 아래 그림은 Exception 중에서 IRQ 예외 상황이 발생했을 경우에 Exception 처리 흐름의 기본적인 예제 입니다.

소프트웨어 구성

PC의 0x1004를 실행하고 나서 IRQ 예외 상황이 발행을 하게 되면 코드의 정상적인 흐름을 잠시 중단하고 IRQ 예외상항을 처리해 주어야 합니다.
여기서 IRQ예외 상황을 처리해 주는 루틴을 Exception Handler하고 합니다. Exception Handler 에서는 7가지 예외 상황(여기 예에서는 IRQ 예외)에 맞는 적절한 처리를 하고 Exception이 발생하기 이전으로 복귀하면 됩니다. Exception Handler에서 한가지 주의 할 사항은 Exception이 발생하기 이전으로 복귀하기 전에 반드시 문맥을 복원하고 복귀 해야 합니다.

그리고 위의 그림에서는 편의상 IRQ 예외 처리를 위해서 0x3000번지로 코드의 흐름이 변경되었지만 실제로 ARM에서는 IRQ 가 발생하면 코드의 흐름이(PC) 0x00000018 로 H/W 적으로 변경이 되고 0x00000018 에서는 다시 실제로 예외 사항을 처리하는 Exception Handler 함수로 분기하는 방식으로 처리가 됩니다. 0x00000018 번지를 Exception Vector라고 하고 ARM에서는 7가지의 Excepton이 존재하는데 이러한 예외 상황이 발행을 하면 각 예외 상황에 따라서 미리 할당된 주소에 있는 ARM 명령어가 수행이 됩니다.

아래 표는 ARM에서의 7가지의 Excepton 에 대하여 주소와 각 Exception에 할당된 정해진 Vector 주소 입니다.

Exception Type Priority Mode Vector High Vector
Reset 1 Supervisor 0x00000000 0xFFFF0000
Undefined Instruction 6 Undefined 0x00000004 0xFFFF0004
SWI 6 Supervisor 0x00000008 0xFFFF0008
Prefetch Abort 5 Abort 0x0000000C 0xFFFF000C
Data Abort 2 Abort 0x00000010 0xFFFF0010
Reserved     0x00000014 0xFFFF0014
IRQ 4 IRQ 0x00000018 0xFFFF0018
FIQ 3 FIQ 0x0000001C 0xFFFF001C


Exception의 종류와 앞에서 배웠던 ARM 동작 모드와의 관계를 혼동해서는 안됩니다. 예외 상황이 발생하면 그에 따라서 H/W 적으로 ARM 동작 모드가 변경이 되는 것입니다. Priority는 같은 시간에 다수의 예외 상황이 발행하게 되면 우선순위가 높은 놈이 먼저 발생을 하겠지요.
보통 Vector주소는 0x00 번지에서 32bit(4Byte)단위로 증가 하는데, High Vecotr로 설정이 되면 시작 주소가 0xFFFF0000가 됩니다. Windows CE에서는 High Vector를 사용한다고 합니다.

(1) Reset
ARM Core에 전원을 인가하는 등에서 발생

Reset 발생시 CPSR, Register 상태
R14_svc UNP
SPSR_svc UNP
CPSR[4:0] - ARM 동작 모드 Supervisor Mode
CPSR[7:5] - 인터럽트 상태 I=1, F=1, T=0
PC - Vector Address 0x00000000


(2) Undefined Instruction
ARM Processor 에서 정의되지 않은 명령어 등을 실행 하는 경우에 발생

Undefined Instruction 발생시 CPSR, Register 상태
R14_und Address of the undefined instruction + 4
SPSR_und CPSR
CPSR[4:0] - ARM 동작 모드 Undefined Mode
CPSR[7:5] - 인터럽트 상태 I=1, F=unchanged, T=0
PC - Vector Address 0x00000004
Return MOVS PC, LR

Return 이라고 되어 있는 항목은 Exception Handler 수행을 마치고 원래의 프로그램 흐름으로 복귀할때, R14에 H/W적으로 들어가는 복귀 주소에 따라서 달라지게 됩니다. 각 Exception 종류에 따라서 R14에 들어가는 복귀 주소가 달라 지므로 주의 해야 합니다.

(3) Software Interrupt
비 특권모드에서 특권 모드로 진입하기 위해서 Software Interrupt 명령어를 실행한 경우 발생

Software Interrupt 발생시 CPSR, Register 상태
R14_svc Address of the SWI instruction + 4
SPSR_svc CPSR
CPSR[4:0] - ARM 동작 모드 Supervisor Mode
CPSR[7:5] - 인터럽트 상태 I=1, F=unchanged, T=0
PC - Vector Address 0x00000008
Return MOVS PC, LR


(4) Prefetch Abort
Illegal 주소에서 명령어를 가져와서 실행 하려는 경우에 발생

Prefetch Abort 발생시 CPSR, Register 상태
R14_abt Address of the aborted instruction + 4
SPSR_abt CPSR
CPSR[4:0] - ARM 동작 모드 Abort Mode
CPSR[7:5] - 인터럽트 상태 I=1, F=unchanged, T=0
PC - Vector Address 0x0000000C
Return SUBS PC, LR, #4


(5) Data Abort
Illegal 주소에 Data를 쓰거나 읽기 동작을 시도하는 경우에 발생

Data Abort 발생시 CPSR, Register 상태
R14_abt Address of the aborted instruction + 8
SPSR_abt CPSR
CPSR[4:0] - ARM 동작 모드 Abort Mode
CPSR[7:5] - 인터럽트 상태 I=1, F=unchanged, T=0
PC - Vector Address 0x00000010
Return SUBS PC, LR, #8 (re-executed)
SUBS PC, LR, #4 (not re-executed)


(6) IRQ
ARM Processor 외부에서 인터럽트를 요청한 경우에 발생

IRQ 발생시 CPSR, Register 상태
R14_irq Address of the next instruction to be executed + 4
SPSR_irq CPSR
CPSR[4:0] - ARM 동작 모드 IRQ Mode
CPSR[7:5] - 인터럽트 상태 I=1, F=unchanged, T=0
PC - Vector Address 0x00000018
Return SUBS PC, LR, #4


(7) FIQ
ARM Processor 왼부에서 Fast 인터럽트를 요청한 경우에 발생

FIQ 발생시 CPSR, Register 상태
R14_fiq Address of the next instruction to be executed + 4
SPSR_fiq CPSR
CPSR[4:0] - ARM 동작 모드 FIQ Mode
CPSR[7:5] - 인터럽트 상태 I=1, F=1, T=0
PC - Vector Address 0x0000001C
Return SUBS PC, LR, #4


Exception Handler를 종료하고 원래의 프로세스 흐름으로 복귀하는 Return 명령어의 공통점은 SUBS, MOVS 등으로 끝에 "S" 접미사가 따라 붙습니다.
"S" 접미사의 의미는 Destination 레지스터가 만약 PC(R15) 라면 SPSR을 CPSR로 복원 하라는 의미의 접미사 입니다. 물론 이러한 과정은 H/W 적으로 이루어 집니다.


아래 그림은 IRQ 발생시 처리하는 절차 입니다. 위에서 언급했던 내용들과 비교해 보시기 바랍니다.
프로그램의 정상적인 흐름에서 0x1004번지 명령어 처리중에 IRQ 예외가 발생하면 0x1004 번지의 명령어 수행이 완료가 된 이후에 IRQ 예외의 Exception Vector인 0x0018번지로 PC가 이동을 하고 0x0018번지에서 실제로 IRQ 예외처리 핸들러 함수가 있는 번지로 다시 이동을 한다음
예외처리를 완료하고 다시 IRQ 예외가 발생한 다음 번지의 명령어가 있는 곳으로 "SUBS PC, LR, #4" 에 의해서 복귀해서 IRQ 예외가 발생하지 않은것처럼 계속해서 Normal 루틴이 실행이 됩니다.

소프트웨어 구성

위에서 한가지 설명을 빠뜨린 것이 있는데, IRQ 예외가 일어나면 H/W 적으로는 다음과 같은 일이 발생을 합니다.
(1) CPSR 백업 : SPSR_irq = CPSR_svc
(2) ARM 모드로 전환( 예외상황에서는 항상 ARM 모드로 수행이 됨) : CPSR.T = 0
(3) CPSR MODE 를 IRQ 모드로 변경 : CPSR[4:0] = 0b10010
(4) IRQ 모드 마스킹(인터럽트가 Disable 됨) : CPSR.I = 1
(5) R14_irq = PC + #8
(6) PC = 0x18( IRQ Vector address)


(5)번 항목에서 LR(R14)에 PC + #8이 들어가는 이유는 특정 번지의 명령어가 수행될때 IRQ가 발생을 하면
Execution - Fetch - Decode 의 Pipe line 에서 보면 Execution 단계에서 실제 PC는 현재 실행중인 명령어의 Fetch(+4), Decode(+8) 단계가 실행이 되고 있기때문에 LR에는 PC + #8 번지의 값이 들어 가게 됩니다. 하지만 IAR, KEIL, ADS 등의 컴파일러 등에서는 IRQ발생시 LR레지스터 값을 조사해보면 LR의 값이 PC + #8 가 아니고 LR = PC 의 값과 동일하다고 표시 됩니다. 이것은 컴파일러 사용자의 혼동을 피하기 위해서 이렇게 표시를 하고 있는것 같습니다.

6.5 Exception 과 Interrupt의 차이

Exception과 Interrupt는 무엇이 다를까요. 경우에 따라서는 비슷한 의미 일수도 있습니다. 하지만 몇가지 다른점이 있습니다.

(1) Exception
- 특정 명령어 실행에 의한 오류시 발생
- 클록에 동기 적으로 발생됨 : Exception은 주로 Core내부에서 발생하기 때문에 Core의 클럭에 동기적으로 발생을 합니다.
- 메모리 접근 오류, 디버깅 중단점, divide by zero... 등
- 넓게 생각하면 Exception은 IRQ를 포함한다고 생각해도 됩니다.

(2) Interrupt
- Processor 의 명령어 실행과 관계없이 Processor 외부에서 주로 발생 --> 클록에 비동기 적으로 발생 할수도 있음

6.6 ARM에서의 Interrupt system

ARM Cortex시리즈 이전의 전통적인 ARM Core에는 인터럽트로 받아 드릴 수 있는 방식은 IRQ, FIQ 2가지 밖에 없습니다.

소프트웨어 구성

위의 그림은 ARM9 Core의 인터럽트 블럭도 입니다. Interrupt Controller 와 Physical Interrupts(UART, I2C 등) 소스는 ARM Core 내부의 블럭이 아닙니다. Interrupt Controller 와 Physical Interrupts 부분은 ARM Core를 이용해서 설계한 S3C2440등의 CPU 블럭 입니다. 다시한번 말씀드리지만 ARM Core에는 IRQ나 FIQ냐만을 받아 들일 수 있습니다. Interrupt Controller는 CPU Vendor에 의해서 다르게 디자인 될수도 있습니다.