본문 바로가기
Firmware Programming

[ARM] ARM 프로세서 기초

by TYB 2024. 2. 13.
반응형

ARM이란?

Adavanced RISC Machine의 약자로 CPU의 한 종류고, 다양한 임베디드 기기에서 사용되는 32-bit-RISC프로세서임.

ARM의 코어는 RISC아키텍처 방식을 사용합니다.

 

ARM프로세서의 특징

1. 32-bit-RISC 프로세서 CPU로서 Instruction Set이 간단

2. 전력소모가 적음

3. 성능에 따라 다양한 CPU제공

4. 32Bit 명령인 ARM명령과 16bit 명령인 Thumb명령 제공5. SOC 용 지적 재산(IP)로 제공- 다양한 업체에서 CPU를 라이센싱 하여 생산- 사용자 특화된 Chip 을 생산할 수 있게 됨- 라이선스에 따라서 내부 구조에 대한 수정도 가능

 

RISC(Reduced Instruction Set Computer)의 특징

1. 상대적으로 적은 수의 명령어를 가짐

2. 명령어들의 복잡도를 줄임.

3. 하드웨어보다는 소프트웨어에 유연성과 기능성을 제공.

4. 컴파일러에 더욱 의존.

 

 

 

ARM사는 직접 반도체를 제조하여 판매하는 것이 아니라 설계한 프로세서를 반도체 회사에 Hard Macrocell 또는 Synthesizable core로 제공
반도체 제조회사 또는 SoC 제조사에서는 ARM사로부터 제공받은 ARM core와 주변장치를 추가하여 SoC(System on a Chip)를 만들어 사용자에게 판매 하거나 자체 제품에서 사용

 

 

ARM 명령어 처리 과정

 

ARM 명령어 파이프 라인

 

ARM 코어의 구조

 

 

 

 

ARM의 operating mode에는 7가지가 있음. 

 1.User Mode => RTOS없이 그냥 돌릴 때가 User Mode

 2. SVC(Supervisor Mode)=>STM에서 RTOS 를 올리거나 하면 Supervisor모드가 되는거임.

 3. FIQ(Fast Interrupt Request) Mode => 빠른 인터럽트의 처리를 위한 프로세서의 동작 모드
 4. IRQ(Interrupt Request) Mode =>일반적으로 사용되는 인터럽트를 처리하기 위한 프로세서의 동작 모드

 5.Abort Mode =>명령이나 데이터를 메모리로부터 읽거나 쓸 때 오류가 발생하면 ARM은 Abort 모드가 된다. 메모리 예외     처리

 6. Undefined Mode => ARM이 정의되지 않은 명령을 수행하려고 하면 수행되는 프로세서의 동작 모드

 7. System Mode => User 모드와 동일한 용도로 사용되지만 privilege 모드이다. ARM Architecture v4이후부터 지원된다.

 

위의 mode 중 Interrupt나 메모리 예외 처리를 통틀어서 Exception이라고함.

 

 

레지스터는 프로세서가 작업을 하는데 사용되는 값을 저장하는 공간(CPU)

32비트 길이의 37개 레지스터가 있음.(실제로 사용되는건 16개 레지스터고 모드마다 사용하는 별도의 레지스터들이 있음.)

 

37가지 레지스터의 종류를 살펴보자면

30개의 범용 레지스터,

1개의 PC(R15, Program Counter- 코드를 읽어옴),

1개의 CPSR(Current Program Status Register) - 프로세서가 수행하고 있는 현재 동작 상태를 나타냄,

5개의 SPSR(Saved Program STatus Register) - 7가지 모드가 있는데, 이전 모드의 CSPR의 복사본으로 ARM이 하드웨어      적으로 이전 모드의 CPSR 값을 각각의 모드에 해당하는 SPSR에 복사하고, Exception 발생 시 CSPR로 복사.

    System mode를 제외한 모든 previlege 모드에 각각 하나씩 존재함.

 

실제로 살펴보려면

ubuntu@ubuntu8:~/pi_bsp/u-boot/arch/arm/lib$ vi vectors.S

 

전원이 켜지면 program counter에 _reset을 넣어주고 b로 분기하니까 arch/arm/cpu/armv7/start.S reset 파일의 reset으로 가서 부팅을 진행한다는거임.

 

 

operating 모드 별로 사용 가능한 레지스터

 

-ARM state

   16개의 범용 레지스터(R0~R15), 상태 레지스터{ 1개의 CPSR  (  previlege 모드일 경우 각각 하나의 SPSR)}

   리셋하거나 인터럽트를 거치고 나오면 무조건 ARM state로 돌아옴.

 

- Thumb state

   8개의 범용 레지스터 (R0~R7) , {R13(SP),R14(LR),R15(PC)}=>{연산명령에서는 사용불가}

   상태 레지스터  {1개의 CPSR  (previlege 모드일 경우 각각 하나의 SPSR)}

arm에서 운영모드가 바뀌면 stack에 하드웨어적으로 push pop을 해준다. 속도가 sw에 비해 훨씬 빠름.

 

 

Stack Pointer(R13)

프로그램에서 사용하는 스택의 위치를 저장하는 레지스터(스택은 지역변수가 저장되는 메모리 공간)

 

Link Register(R14)

서브루틴에서 리턴할 주소를 저장하고 있는 레지스터. 서브루틴을 호출하는 BL명령을 사용하면 PC값을 자동으로 LR에 저장하게 되고 리턴할 때는 MOV PC,LR 명령으로 LR에 저장되어 있던 리턴 주소를 PC에 저장함.

 

Program Counter(R15)

ARM state일 경우 위치 정보 비트 [31:2] 저장, Thumb state의 경우 위치 정보 비트 [31:1] 저장

다른 범용 레지스터와 마찬가지로 ADD, SUB와 같은 연산 명령을 사용하여 프로그램이 분기할 위치를 조정 가능하고
프로세서의 모든 동작 모드에 대하여 하나만 존재한다.

 

 

Program Status Register (PSR)(1개의 CPSR, 5개의 SPSR)

PSR 레지스터의 정보는 3가지로 구분됨.

ㄱ. Condition code flag  ALU의 연산 결과 정보(=명령 실행 결과)를 가지는 flag 정보를 가지고 있다
ㄴ. Control bits  프로세서를 제어하기 위한 비트로 구성(프로세서의 모드, 동작 state 와 인터럽트를 제어)

I/F 비트
IRQ(‘I’ 비트) 또는 FIQ(‘F’ 비트)를 diable(세트) 또는 enable(클리어)
T 비트
ARM Architecture xT 버전인 경우 Thumb state 임을 나타낸다.
상태를 나타낼 뿐 프로세서는 이 비트에 강제로 값을 write 할 수 없다.
BX 명령에 의해서만 제어된다

Mode bits
ARM의 7 가지의 동작 모드를 나타낸다.

M[4:0] Operating Mode M[4:0] Operating Mode
10000 User 모드 10111 Abort 모드
10001 FIQ 모드 11011 Undefined 모드
10010 IRQ 모드 11111 System 모드
10011 SVC 모드    


ㄷ. Reserved 

 

 

 

힙 영역과 스택 영역의 차이는?

힙영역은 동적메모리 할당이므로 free를 해줘야하고 stack은 auto 변수를 붙여주면 알아서 메모리를 관리해줌.

 

 

 

프로세서가 메모리 접근은 Byte, halfword(2바이트) 또는 word(4바이트) 단위로만 가능

-> 만약 이걸 지키지 않고 액세스하면 un-aligned access가 됨.

 

ARM은 Little-Endian 시스템임.

 

 

Little-Endian
메모리의 하위 어드레스(Byte 어드레스 “0”)에 LSB(Least Significant Byte)가 위치하고 있는 메모리 구조
LSB는 메모리 데이터의 가장 하위 비트 0 에서 7 까지

왼쪽이 빅 엔디안, 오른쪽이 리틀 엔디안

0,4,8은 word 어드레스, 0,2,4,6,8,10은 halfword 어드레스, 0,1,2,3,4,…은 byte 어드레스를 니타낸다.
word로 메모리를 액세스 하는데 1,2 또는 3 번지를 액세스 하면 un-aligned 액세스가 된다.

 

 

 

 

32bit Instruction Set(명령어)

 

1.Load/Store와 같은 메모리 참조 명령이나 Branch 명령에서는 모두 상대주소(Indirect Address)방식을 사용
2.Immediate 상수는 32 비트 명령어 내에 표시 된다. Immediate 상수는 32비트 이하의 상수이다(#을 붙여서 구분)

3.모든 ARM 명령어는 조건부 실행이 가능
4.Load/Store Architecture를 사용

 

 

16bit Thumb 명령어
32비트의 ARM 명령을 16비트로 재구성한 명령, CPU가 32bit 16bit 명령어가 혼재되어 처리.

 

 

반응형