ARM에 리셋
신호가 입력이 되면 리셋 예외처리가 발생한다. 리셋은 전원을 처음 연결하거나 리셋
스위치를 누를 경우 발생한다.
1. ARM 상태로
전환( CPRS[5] = 0 )
2. 인터럽트 중지 ( FIQ disable :
CPRS[6] = 1, IRQ disable : CPRS[7] = 1)
3. SVC 모드로
전환( CPRS[4:0] = 10011 )
4. 어드레스 0x0 번지로 분기하여
리셋 핸들러를 처리한다.
따라서 시스템의 0x0 번지는
Linker script file( U-boot.lds)의 Entry point에서 선언된 '_start'가 되고 여기서 부터
코드가 실행되어 reset으로 분기, 시스템의 부팅 처리를 수행한다.
다음은 부트로더의 reset 핸들 러에서 처리하는 코드이다.
< cpu/s5pc1xx/start.s 파일에서 >
/*
*************************************************************************
*
*
Jump vector table as in table 3.1 in [1]
*
*************************************************************************
*/
.globl
_start
_start: b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr
pc, _not_used
ldr pc, _irq
ldr pc, _fiq
_undefined_instruction:
.word undefined_instruction
_software_interrupt:
.word
software_interrupt
_prefetch_abort:
.word prefetch_abort
_data_abort:
.word data_abort
_not_used:
.word not_used
_irq:
.word irq
_fiq:
.word fiq
_pad:
.word 0x12345678 /*
now 16*4=64 */
.global _end_vect
_end_vect:
.balignl
16,0xdeadbeef
/*
* the actual
reset code
*/
reset:
/*
* set the cpu to SVC32 mode and IRQ & FIQ disable
*/
mrs
r0, cpsr
bic r0,
r0, #0x1F @ r0 레지스터의 0x1F 비트들을 비트 클리어한다.
orr r0, r0, #0xD3 @ 1101 0011 : ARM상태전환, 인터럽트 중지, SVC모드전환
msr
cpsr, r0
* ARM의 상태 레지스터(PSR)
상태 레지스터는 1개 의 CPSR과 5개의 SPSR로 구성되어 있고 내부 구조는 서로 동일하다.
비
트 |
명
칭 |
분
류 |
의
미 |
CPSR[4:0] |
모드비트 |
컨트롤
비트 |
프로세서의 동작모드를 의미한다. 10000 User 모드 10001 FIQ 모드 10010 IRQ 모드 10011 SVC 모드 10111 Abort
모드 11011 Undefined
모드 11111 System
모드 |
CPSR[5] |
상태비트( T ) |
ARM 아키텍쳐에서 16비트 명령인 Thumb 명령을 실행할 수
있는 상태인 경우를 1 Thumb상태, 0인
경우는 ARM 상태를 의미한다 |
|
CPSR[6] |
FIQ |
비트가 1로 설정되어
있으면 disable, 0이면 Enable |
|
CPSR[7] |
IRQ |
비트가 1로 설정되어
있으면 disable, 0이면 Enable |
|
CPSR[24] |
J bit |
컨디션코드
플래그 |
새로운 ARM 아키텍쳐에서
JAVA 바이트 코드 명령이 가능한데 JAVA
명령 실행
상태이면 설정된다 |
CPSR[27] |
Q
flag(Q) |
새로운 ARM 아키텍쳐에서
추가된 포화 연산 명령의 수행결과 포화상태가 발생하면 설정된다. 사용후 반드시
클리어를 해 주어야
한다 |
|
CPSR[28] |
Overflow(
V ) |
연산결과가 오버플로우가 되었을 때 설정된다 |
|
CPSR[29] |
Carry
flag( C ) |
자리올림이나 내림이 발생한 경우, Shift 연
산에서 캐리가 발생한 경우에 설정된다 |
|
CPSR[30] |
Zero( Z ) |
연산결과가 0인
경우에 설정된다 |
|
CPSR[31] |
Negative(
N ) |
연산 결과가 – 값인
경우에 설정된다 |
상태 레지스터(PSR) 전송 명령어
상태 레지스터(PSR)는
CPSR과 SPSR로 2 종류가 있다. PSR 전송명령이란 이 2종류의 레지스터와 범용 레지스터들( R0 ~ R15 )과
의 데이터
전송을 하는 명령이다.
CPSR은 User모드에서는 컨디션코드 플래그만 쓰기가
가능하고 그 외 모든 특권모드에서는 모든 필드에 쓰기가 가능하다.
SPSR은 User 모드에서는 정의되어 있지 않고 각 특권 모드의 해당 SPSR만 엑세스가 가능하다.
MRS 명령
CPRS와 SPRS 레지스터 값을 ARM의
범용 레지스터로 읽어오는 명령이다.
MRS r0,
cpsr @ CPSR을 r0에 전송한다.
MSR 명령
ARM의 범용 레지스터나 상수값을 CPRS나 SPRS 레지스터에 쓰는 명령이다.
출처 : http://blog.naver.com/serimo/50091044696