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모드전환

                                   @ 0xD3 비트를 OR 한다.

    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)CPSRSPSR 2 종류가 있다. PSR 전송명령이란 이 2종류의 레지스터와 범용 레지스터들( R0 ~ R15 )과 의 데이터 전송을 하는 명령이다.


CPSR User모드에서는 컨디션코드 플래그만 쓰기가 가능하고 그 외 모든 특권모드에서는 모든 필드에 쓰기가 가능하다.

SPSR User 모드에서는 정의되어 있지 않고 각 특권 모드의 해당 SPSR만 엑세스가 가능하다.


MRS 명령

CPRS SPRS 레지스터 값을 ARM의 범용 레지스터로 읽어오는 명령이다.

MRS r0, cpsr   @ CPSRr0에 전송한다.

 

MSR 명령

ARM의 범용 레지스터나 상수값을 CPRS SPRS 레지스터에 쓰는 명령이다.

MSR cpsr, r0   @ r0CPSR에 전송한다.

출처 : http://blog.naver.com/serimo/50091044696

+ Recent posts