로그인 | 회원가입
   이용안내    장바구니    주문조회    마이쇼핑    게시판
상품검색 검색 
아이디  
비밀번호
보안접속 보안접속
회원가입
  아이디찾기
  비밀번호찾기
상품목록
  ARM
  PIC
  AVR
  DSP
  MAXQ
  MSP430
  OTHER
게시판
공지사항
자유게시판
강좌-USB기타
자료실
샘플 기획전
전화: 031-429-0845
팩스: 031-477-1407
운영시간
  09:00 ~ 18:00
 
현재위치: > 게시판 > 자료실
자료실
자료실입니다.


찾기
제목 ARM state Mode 0  추천하기
작성자 글쓴이 2012-04-04 10:31:29 415
   
   
3.4 ARM State Mode Labs
 

 이전 장에서는 ARM state mode에 대해서 이야기 할 것인데 기존 etnews.co.kr에서 게제한 자료가(3.4.1 ~ 3.4.4) 잘 되어 있어서 그것으로 대신하며 기존 중복된 부분도 있으나 걍 읽어 보시기 바라며, 예제를 보면서 실습을 하면 되겠습니다.

 

3.4.1 Exception Overview

ARM에는 여섯가지의 CPU 동작 모드를 지원한다는 사실과, 차후 MMU 같은 것에도 그 동작 모드가 관여한다는 것. 그리고 각 모드마다 스택을 따로 설정해 줍니다.  Exception 모드마다 종료 방법이 다릅니다. CPU 동작 모드는 일반적으로는 Exception에 의하여 바뀌게 되고, User 모드가 아니라면 프로그램에 의해 강제로 바꿀 수도 있습니다.

1. Reset 
r14_svc = unpredictable value

SPSR_svc = CPSR

CPSR[5:0] = 0b010011

CPSR[6] = 1

CPSR[7] = 1

PC = 0x0


2.
 Undefined instruction exception  

 

r14_und = address of undefined inst. + 4

SPSR_und = CPSR

CPSR[5:0] = 0b011011

CPSR[6] = unchanged

CPSR[7] = 1

PC = 0x4


Return instruction :
Ømovs pc, r14


3. 
Software Interrupt (swi)

 

r14_svc = address of swi inst. +4

SPSR_svc = CPSR

CPSR[5:0] = 0b010011

CPSR[6] = unchanged

CPSR[7] = 1

PC = 0x8


Return instruction :
Ømovs pc, r14


4. Prefetch & Data Abort

 

Prefetch : r14_abt = address of aborted inst. + 4

Data : r14_abt = address of aborted inst. + 8

SPSR_abt = CPSR

CPSR[5:0] = 0b010111

CPSR[6] = unchanged

CPSR[7] = 1

PC = 0xC(prefetch), 0x10(data)


Return instruction

Prefetch : subs pc, r14, #4

Data : subs pc, r14, #8


5. 
IRQ  

 

r14_irq = address of next inst. to be executed + 4

SPSR_irq = CPSR

CPSR[5:0] = 0b010010

CPSR[6] = unchanged

CPSR[7] = 1

PC = 0x18


Return instruction :
Øsubs pc, r14, #4


6. FIQ

 

r14_fiq = address of next inst. to be executed + 4

SPSR_fiq = CPSR

CPSR[5:0] = 0b010001

CPSR[6] = 1

CPSR[7] = 1

PC = 0x1c


Return instruction :
Øsubs pc, r14, #4


CPSR의 모드 비트 부분에 현재 CPU의 동작모드를 나타내는 비트들이 있는데, 해당 비트를 변경시킴으로서 프로그램에서 동작 모드를 전환할 수 있습니다.
OS를 포팅할 경우 동작모드와 관련하여 메모리 보호기능 등도 구현될 수 있습니다. 해당 인터럽트가 발생하면 CPU는 CPSR의 인터럽트 금지 플래그를 설정합니다. 만약 도중에 인터럽트를 받고 싶다면 사용자가 해당 플래그를 클리어 해주어야 합니다. 또, 동시에 여러 개의 Exception이 발생한 경우라면 그 우선 순위는 다음과 같습니다.

 

Address

Exception

Mode on Entry

Priorities

0x00000000

Reset

Supervisor

1

0x00000004

Undefined Instruction

Undefined

6

0x00000008

Software Interrupt

Supervisor

6

0x0000000C

Prefetch

Abort

5

0x00000010

Data

Abort

2

0x00000014

Reserved

Reserved

Reserved

0x00000018

IRQ

IRQ

4

0x0000001C

FIQ

FIQ

3

 

3.4.2 Exception 동작 모드

Exception과 관련되어 CPU의 동작 모드 몇 가지가 나타나 있습니다. ARM에는 6가지의 동작 모드가 있습니다. 해당  모드는 User Mode, FIQ Mode, IRQ Mode,  Supervisor  Mode,  Abort  Mode, Undefined Mode 등의 6가지 입니다.

 

 - 동작 모드와 범용 레지스터

 

ARM은 각 동작  모드에 따라서 몇가지 기능을 제공합니다. 가장 큰 것으로 레지스터를 리맵핑시키는 기능이 있습니다. 좀 다르게 설명하면, 각 모드마다 전용 레지스터가 따로  있다고도 표현할 수 있습니다.

 

CPU의 동작 모드는 보통 때는 User 모드입니다. 이 때는 기본적으로  r0에서 r15 까지를 사용합니다. 그러다 가령 FIQ가 발생했다고 가정하면 동작 모드가 FIQ 모드로 바뀌게 됩니다. 이와 동시에 r8 부터 r14 까지의 7개의 레지스터는 FIQ 전용 레지스터로 리맵핑 됩니다. 즉,  User 모드의 레지스터와는 별개였던 레지스터 7개가 r8부터 r14까지의 위치에 배치되는 것이죠. 물론 기존의 User 모드에서 사용하던 r8-r14까지의 레지스터와는 별개의 레지스터 입니다.

 

이렇게 하는 장점은 인터럽트 처리 루틴을 작성할 경우 인터럽트 발생시 가장 먼저 하는 일이 사용 중이던 레지스터를 스택에 저장하고, 또 처리루틴이 종료될 때는 다시 복구시키는 일이었습니다. 그러나 ARM에서 FIQ의 경우를 살피면, FIQ 처리 루틴의 코딩 시에는 r8부터 r14까지를 자유롭게 사용할 수 있고, 또 저장과 복구 과정을 생략해도 좋습니다. CPU모드가 바뀜에 따라 레지스터 자체가 별개의 다른 것으로 바뀌었기 때문입니다.

 

위의 그림이 각 모드에 따라 리맵핑 되는 레지스터들을 나타낸  표입니다. FIQ 모드에서는 8개, 그리고 나머지 모드에서는 3개씩의 레지스터가 리맵핑됩니다.

 

레지스터차원에서 이번에는 IRQ가 발생한 경우를 가지고 설명해 보겠습니다.

 

r14는 Link 레지스터로써 Call과 같은 인스트럭션이 발생할 경우 복귀할 번지를 저장해 두는 레지스터 입니다. 다음은 IRQ 발생 과정입니다.

 

1) Use r모드에서 r0-r15를 사용하고 있다.

 

2) IRQ 발생

 

3) ARM CPU는 동작 모드를 IRQ 모드로 바꾼다. (이때 r13과 r14는 IRQ 전용 레지스터로 대치된다.)

 

4) 이 시점의 PC 값은 IRQ 처리 이후 복귀할 번지이다. 그 값을 r14 (이미 IRQ 모드가 되었으므로 r14_irq) 에 넣는다.

 

5) 만약에 r0부터 r12까지를 IRQ처리 루틴에서 사용하고자 한다면 해당 레지스터를 sp(r13, 역시 r13_irq)를 사용하여 스택에 넣는다.

 

여기서 5)번 과정을 눈여겨 볼 필요가 있을 듯 합니다. r13이 스택 포인터로 사용합니다. 그런데,  각 모드마다 r13을 따로 가지고 있으므로, 스택을 CPU 동작 모드마다 따로 관리할 수 있게 되는 것입니다.

 

r14는 복귀 번지가 들어가기 때문에 항상 디폴트로 사용되므로 여분의 레지스터가 필요하겠죠. 그런 이유로 r13과 r14를 각 모드마다 따로 둔 것입니다. FIQ 모드는 그 이름에서도 나타나 있듯이 8개의 레지스터를 따로  두어서 레지스터 저장 복구 과정을 거의 생략할 수 있도록 한 것입니다.

 

그리고 참고로 Exception에서 복귀할 경우엔 기본적으로는 해당  모드의 r14 번지의 내용을 r15번지로 넣는데, 각 모드마다 조금씩의 차이가  있습니다.

 

ARM은 37개의 범용 레지스터를 가지고 있습니다. User 모드의 디폴트 17개 + FIQ 모드 8개 + 나머지 4개의 모드 *3 =12개 해서 17+8+3+3+3+3=37 개로 계산이 됩니다.

 

- 동작 모드와 PSR(스테이터스 레지스터)

 

범용 레지스터와 비슷하게 PSR 역시 동작 모드마다 따로 관리가 됩니다. 해당 레지스터는 뒤에 모드 이름을 붙여서 SPSR_fiq, SPSR_svc, SPSR_abt, SPSR_irq, SPSR_und 와 같은 이름으로 부릅니다. 따라서 PSR 개수는 CPSR을 포함하여 총 6개가 됩니다.

 

SPSR은 CPSR값을 저장해 두는 역할을 합니다. 범용 레지스터가 아예 맵핑이 바뀌는데 반해, 모드가 바뀔 경우, 예를 들어 IRQ가 발생했다면,  기존에 User 모드에서 사용하는 CPSR 값을 SPSR_irq에 저장을 합니다. 그리고 IRQ 모드에서는 CPSR과 SPSR_irq를 둘다 볼 수 있습니다. 후에 IRQ가 끝나는 시점에서 SPSR_irq의 내용을 CPSR로 복구하면  원래의  CPSR 값이 유지됩니다.

 

Exception이 발생했을 때 해당 처리 루틴에는 그 순간의 CPSR값을 그대로 가져오는 것입니다. 다만 시작할 때 해당 값을 SPSR에 저장해 두었기 때문에 IRQ 처리 루틴에서 수정이 된다고 해도, 복귀할 때 SPSR에서 CPSR 값을 다시 가져오므로, 실행 중이던 환경은 그대로 유지가 되는 것입니다.

 

3.4.3 ARM 예외상황

Exception


일반적으로는 인터럽트와 유사한 개념으로 사용합니다. 어떻게 보면 인터럽트 보다는 조금 큰 개념이랄 수도 있고, 개념을 ARM에서의 Exception으로 한정해서  말씀 드리겠습니다.


 

구체적으로 ARM에는 FIQ(Fast Interrupt reQuest)와 IRQ(Interrupt reQu-est), Abort, Software Interrupt, Undefined Instruction Trap의 5가지 Exception이 있고, 각각 Exception이 발생하면 CPU는 대응하는  동작모드로 전환됩니다. 여기에 보통 동작 상태인 User 동작 모드가 추가되어  동작 모드는 총 6개가 있습니다.



- IRQ

일반적으로 I/O 장치로부터의 입력이 들어오면 반응을 하는 흔히 말하는 인터럽트 Exception입니다. IRQ의 종류로는 내부 타이머나 시리얼, 혹은 외부 IRQ 입력 등이 될 수 있습니다.

 

- FIQ

개념적으로는 IRQ와 거의 유사한데, 다만 보다 빠른 처리를 할 수 있도록 제공되는 Exception(모드별로 레지스터 셋을 따로 제공해서, 인터럽트 처리 루틴에서 레지스터를 저장, 복구하는 시간을 줄이는 방식)입니다. IRQ의 소스는 대부분 FIQ로도  맴핑될 수 있습니다. 즉, 타이머  인터럽트를  IRQ로  처리하거나,  혹은 FIQ로 처리할 수도 있다는 의미입니다.

 

- Abort

CPU가 메모리로부터 인스트럭션을 가져오거나, 혹은 인스트럭션을 동작시키면서 데이터를 가져오려고 할 경우, 해당 메모리를  억세스 할 수 없다면 Abort Exception이 발생합니다. 위에 제시한 두 가지 경우에 대응하여 Prefetch Abort와 Data Abort로 구분할 수 있습니다.

 

- Software Interrupt

프로그램에서 임의로 인터럽트를 호출하는 경우입니다. ARM 인스트럭션 SWI 가 이에 해당합니다. 이 Exception이 발생하면 CPU 동작 모드가 Supervisor 모드로 바뀌도록 되어 있고, 보통 OS의 시스템 Call을 구현하기 위해 사용됩니다.

 

- Undefined Instruction Trap

ARM에 정의되어 있지 않은 명령어를 만났을 경우 발생하는 Exception입니다. 이 기능은 코프로세서를 사용하는 경우와 관련되어 사용됩니다.

 

 Address

 Exception

 Mode on entry

 0x0000.0000

 0x0000.0004

 0x0000.0008

 0x0000.000C

 0x0000.0010

 0x0000.0014

 0x0000.0018

 0x0000.001C

 Reset

 Undefined Instruction

 Software Interrupt

 Abort(prefetch)

 Abort(data

 --reserved--

 IRQ

 FIQ

 Supervisor

 Undefined

 Supervisor

 Abort

 Abort

 --

 IRQ

 FIQ

한가지 주의할 점은 8086의 경우엔 해당 벡터에 ADDRESS를 넣어 두면, 인  터럽트 발생 시에 CPU(제어 유닛)이 해당 주소를 가져다가 PC에 넣어 주지만, ARM의 경우엔 그냥 해당 벡터로 점프를 합니다.

예를 들어 IRQ가 발생했다면 다음 순간의 pc(r15)값은 0000.0018이 됩니다. 따라서 해당 벡터 번지에는 단순히 번지가 들어가는 것이 아니라 점프명령 같은 것이 들어갑니다.

3.4.4 ARM 레지스터

ARM에는 31개의 General Purpose 레지스터와 6개의 Status 레지스터가 있습니다. 물론 모두 32비트 레지스터 입니다. 그런데 ARM의 어셈블러에서 사용하는 범용 레지스터 키워드는 r0 ~ r15까지 16개 밖에는 되지 않습니다. 즉, 다시 말해서 사용자가 한번에 사용할

수 있는 레지스터는 16개입니다. 그 중에 몇 개는 프로그램 카운터(PC)나 스택 포인터(SP

) 등의 용도로 사용됩니다. 나머지 레지스터는 CPU 동작 모드(Exception)과 관련되어 r0-

r15로 리맵핑 되어 사용됩니다. 

 

1. Special Purpose General Register


유저가 프로그램할 때 레지스터 지정을 위해 사용할 수 있는 키워드는 r0 ~ r15까지 입니다. 그중에 몇 가지는 특별한 목적을 위해 사용됩니다.


- Program Counter (r15)
r15는 CPU에서 PC와 같은 역할을 합니다. 다만 차이가 있다면 r15를 일반 다른 레지스터처럼 오퍼랜드로 사용할 수 있다는 점이고 ARM 어셈블러에서는 pc라는 키워드와 r15를 동일하게 취급합니다.


- Stack Pointer (r13)
ARM에는 Stack을 위한 명령어가 따로 없습니다. 즉, Push나  Pop 등의 명령어가 제공되지 않습니다. 그러나 sp라는 키워드를 사용하여 r13을 쓸 수 있는데, 묵시적으로 r13을 스택 포인터로 사용할 수 있도록 정해 놓은 듯 합니다. 그리고, Push  명령이나 Pop 명령이 없으므로, ARM에서는 같은 기능을 일반 데이터  전송 명령을 통해 해결합니다. ARM의 데이터 전송명령은 Auto Increment 기능이 있어서 하나의 인스트럭션으로 Push나 Pop과  동일한  기능을 수행 할 수 있습니다.

 

- Link Register (r14)
r14는 링크 레지스터라고 부릅니다. 이 레지스터는 8086 등의 CPU에서는 보지 못했던 기능의 레지스터입니다. 8086등의 프로세서는 서브루틴을 호출할 경우 CALL을 사용하면, 다음에 수행될  프로그램  카운터를 스택에 넣고, 호출될 번지를 프로그램 카운터에 넣는 동작을 하는데, ARM에서는 CALL과 RET와 같은 명령이 없습니다. 대신  'Branch with Link'라는 명령(BL)이 있는데, 해당 명령을 수행하면, CALL과  비슷하게 다음에 수행될 pc(r15)값을 스택이 아니라 lr(r14)에 넣고 분기 번지를 pc(r15)에 넣어 분기합니다. 즉, 스택을 사용하지 않는  것이지요. 복귀할 때는 RET대신 mov pc,lr 이라는  데이터  전송명령으로 복귀합니다.

 

이런 방식은 나름대로 장단점이 있습니다. 우선 단점을 말하자면, 어떤 서브루틴이 콜 되었을 때, 서브루틴에서는 복귀번지가 r14에 들어 있는 상태가 됩니다. 문제는 해당 서브루틴에서 다시 한번 다른  서브 루틴을 콜 한다면, 원래 r14에 보관되어 있던 복귀 번지 값이  덮어 씌워지는 결과가 생깁니다. 이런 경우엔, 수동으로 sp(r13)를 이용하여 스택에 r14 값을 보관해 두어야 합니다. 즉, Call하기 전에 r14를 스택에 보관해 두고, 리턴해서 복구하는 과정을 거치는 셈이지요.

 

그러면 구태여 왜 이런 방법을 사용할까요. 이미 눈치채신 분들도 계시겠지만, 그렇게 Call을 연속적으로 하는 경우가 아닌, 한번만 Call하는 경우라면, 스택을 사용하지 않고 레지스터를 사용함으로써,  속도에서 이익을 얻게 되는 것이죠.


2. ARM Status Register 6개 - but 1개의 Status Register


ARM에는 32비트의 스테  이터스 레지스터가 6개가 있습니다. 그러나 6개 모두를 한꺼번에  사용하지는 못하고, 또 그럴 필요도 없죠. 일단은 하나의 32비트 Status 레지스터만 생각하면 됩니다. 스테이터스 레지스터는 PSR이라고 부릅니다. 그리고 일반적으로 CPSR 이라고 하여 Current Processor Status Register로도 부릅니다.

 

PSR은 크게 Flag Bits부분과 Control Bits부분으로 나뉩니다.

- Flag Bits
어떤 인스트럭션의 결과 등을 나타내는 부분으로 4 비트가 있습니다. 다른 CPU의 그것과 유사한데, 각각 N, Z, C, V 의 4가지입니다.

1) Negative/Less Than Flag
N 으로 표기되는 이 플래그는 연산의 결과가 마이너스인 경우에 Set

2) Zero Flag
Z 으로 표기되는 이 플래그는 연산의 결과가 0이 되었을 경우에 Set

3) Carry/Borrow/Extend Flag
C 로 표기되는 이 플래그는 자리올림이나 내림이 발생한  경우 Set 그리고 Shift 연산 등에서 사용됩니다.

4) Overflow Flag
V 로 표기되는 이 플래그는 연산의 결과가 오버플로우  때에 사용함.


- Control Bits
컨트롤 비트들은 인터럽트를 제어하는 비트와 계속해서  언급되기만 하고 실체를 드러내지 않고 있는 Exception과 관련된 CPU 동작모드를 설정하거나 확인할 수 있는 기능을 가진 Bit 가 있습니다.


1) IRQ / FIQ Disable Bit
ARM의 인터럽트 중에서 IRQ와 FIQ를 금지시킬 수 있는 플래그입니다. 인터럽트의 종류는 이밖에도 몇가지가 더 있는데, 그 중에서 IRQ, FIQ는 PSR을 통해 금지시키거나 가능하도록  설정 할 수 있습니다.

 

2) Mode Bits(5개의 bit)
M0 에서 M4까지의 모드 비트는 CPU의 6개의 동작 상태를 나타냅니다. 즉, 간단히만 말하자면 ARM은 6개의 동작 모드를 가지는데, 이를테면 유저 모드와 인터럽트 모드 등입니다.


N  Z   C  V    .....  I   F  T  M4 M3 M2 M1 M0
31 30 29 28   .....  7  6  5  4    3    2    1   0    

 

3.4.5 Operation Steps of the Lab

1) 3.1.5를 참조하여 ARMMode라는 이름으로 새로운 프로젝트를 만든다.

2) 3.1.5를 참조하여 소스파일을 만들고 ARMMode.s로 저장한다.

셋팅을 아래 그림과 같이 한다. 3.1.5를 참조하여 오브젝트를 만들고 Debug->Remote 하여 에뮬레이터를 연결하고 download명령을 실행한다. 그리고 나서 Single step을 클릭하면서 레지스터들의 변화를 보면 된다.

 

              Figure 3-8 Embest IDE Linker Settings

 

               Figure 3-9 Embest IDE Debug Settings

 

3.4.6 Sample Programs of the Lab

.global _start

.text

_start:

      

# --- Setup interrupt / exception vectors

                 B       Reset_Handler

Undefined_Handler:

                 B       Undefined_Handler

                 B       SWI_Handler

Prefetch_Handler:

                 B       Prefetch_Handler

Abort_Handler:

                 B       Abort_Handler

                 NOP                                                                   /* Reserved vector */

IRQ_Handler:

                 B       IRQ_Handler

FIQ_Handler:

                 B       FIQ_Handler

 

SWI_Handler:

                           mov pc, lr

 

Reset_Handler:

 

#into System mode

                           MRS R0,CPSR

                           BIC R0,R0,#0x1F

                           ORR R0,R0,#0x1F

                           MSR CPSR,R0

                          MOV R0, #1        

                           MOV R1, #2        

                           MOV R2, #3        

                           MOV R3, #4        

                           MOV R4, #5        

                           MOV R5, #6        

                           MOV R6, #7        

                           MOV R7, #8        

                           MOV R8, #9        

                           MOV R9, #10      

                           MOV R10, #11    

                           MOV R11, #12

                           MOV R12, #13    

                           MOV R13, #14    

                           MOV R14, #15

 

#into FIQ mode

                           MRS R0,CPSR

                           BIC R0,R0,#0x1F

                           ORR R0,R0,#0x11

                           MSR CPSR,R0

                           MOV R8, #16      

                           MOV R9, #17      

                           MOV R10, #18    

                           MOV R11, #19    

                           MOV R12, #20    

                           MOV R13, #21    

                           MOV R14, #22

#into SVC mode

                           MRS R0,CPSR

                           BIC R0,R0,#0x1F

                           ORR R0,R0,#0x13

                           MSR CPSR,R0

                           MOV R13, #23    

                           MOV R14, #24

#into Abort mode

                           MRS R0,CPSR

                           BIC R0,R0,#0x1F

                           ORR R0,R0,#0x17

                           MSR CPSR,R0

                           MOV R13, #25    

                           MOV R14, #26

#into IRQ mode

                           MRS R0,CPSR

                           BIC R0,R0,#0x1F

                           ORR R0,R0,#0x12

                           MSR CPSR,R0

                           MOV R13, #27    

                           MOV R14, #28

#into UNDEF mode

                           MRS R0,CPSR

                           BIC R0,R0,#0x1F

                           ORR R0,R0,#0x1b

                           MSR CPSR,R0

                           MOV R13, #29    

                           MOV R14, #30

 

                           B           Reset_Handler

 

.end

 
댓글달기 회원에게만 댓글 작성 권한이 있습니다. 회원가입하여 정보공유를 하면 좋겠습니다.
첨부파일
  스팸신고 스팸해제
글쓰기
 
이전글 C Language Program
다음글 Thumb instruction
 
 
| 회사소개 | 이용약관 | 개인정보취급방침 | 이용안내
Copyright ⓒ 2010 KitKorea All rights reserved.
전화 : 031-429-0845 FAX : 031-477-1407
Contact open@kitkorea.com for more information.
법인명(상호):인터전자 주식회사 주소:14120 경기도 안양시 동안구 흥안대로 112-1 (호계동)
사업자 등록번호 안내 [138-81-28277] / 통신판매업 신고 제 안양 1753호 [사업자정보확인]
개인정보보호책임자 :홍성호(open@kitkorea.com) / 대표자(성명):홍성호
cafe24