티스토리 뷰

🔦/ARM

ARM 아키텍처 역사 탐험

philBaek (백광록) 2021. 7. 27. 09:57
728x90

ARM Cortex-M3 시스템 프로그래밍 완전정복 1의 첫 번째 챕터인 Introduction 파트에서는 전체적인 ARM 제품군의 역사와 Cortex 시리즈의 특징에 대해 설명하고 있다. 먼저 ARM 아키텍처의 역사에 대해 중요한 특징 위주로 간단하게 정리해보자면 아래와 같다.

 

(이전 제품군에서 새롭게 추가된 기능 위주로 작성)

ARM2

- 26bits address

- Non cache

 

ARM3

- 4KB cache

 

ARM6

- Architecture : ARMv3

- 32bits address

- coprocessor bus 지원

 

※ coprocessor

코프로세서는 메인 프로세서를 보조하는 프로세서로 MMU on/off, 캐시 메모리 on/off 등을 수행. CP15라고도 불리며, 어셈블리어 명령어(CDP, MRC, MCR, LDC, STC 등)를 통해 코프로세서를 제어할 수 있다.

 

ARM7

- Architecture : ARMv3

- 8KB, 4KB cache

 

ARM7TDMI

- MMU(Memory Management Unit), MPU(Memory Protection Unit) 추가

- 8KB cache

- 3-stage pipeline

- thumb 명령어

ARM7TDMI Pipeline

 

※ Pipeline

펌웨어 코드는 바이너리 파일로 컴파일되어 메모리(ex 플래시 메모리)에 저장된다. 따라서 ARM Core는 프로그램을 실행하기 위해 일련의 단계를 수행하는데, ARM7TDMI는 3 단계의 파이프라인(Fetch - Decode - Execute)을 사용한다. 처리 내용은 아래와 같다.

1. Fetch : 메모리에서 바이너리 파일의 구성요소인 Instruction을 하나씩 가져온다.
2. Decode : 가져온 Instruction을 해석하여 Instruction의 종류와 타겟을 판단한다.
3. Execute : 해석한 명령대로 처리 과정을 수행한다.

기본적으로 3단계이지만, 더 빠른 처리속도를 위해 현재는 13 단계까지 세분화가 되어왔다. 이때 각 단계별로 사용되는 자원이 다르기에 이를 중첩해서 사용하는데, 이를 파이프라인이라 한다.

 

 

3-stage pipeline

 

 

※ Stall

ARM7TDMI에서 ARM 명령어 중에 메모리에 접근하는 명령어인 LDR 명령어가 사용되면 파이프라인 동작 단계가 달라진다. 왜냐하면 ARM7 파이프라인은 위에서 언급했듯이 Fetch-Decode-Execute 3단계로 이루어지는데 메모리에서 데이터를 읽는 Memory 단계와 레지스터에 쓰기를 수행하는 Write 단계에서는 해당 Cycle이 Stall(중단)되기 때문이다.

 

Pipeline Stall 현상

 

하드웨어 디버거를 사용하여 파이프라인 분석 시, 유의점

더보기

PC는 항상 Fetch를 가리켜야 한다. 하지만, 만약 0x2098에 mov R0, #0x3이 있고, 0x209C에 break point를 걸었을 경우, 프로그램을 실행했을 때, 레지스터 상태를 보면 R0에 3이 들어가 있는 것을 확인할 수 있다. 즉, 0x2098은 이미 Excetue 단계이고, 0x209C는 Fecth가 아닌 Decode 단계라는 의미인데 실제로는 그렇지 않다.

JTAG 기반의 디버거는 실시간성이 깨진다는 특징이 있기 때문이다. 즉, 실제 파이프라인을 고려하여 디버깅하는 것이 아니라, 파이프라인을 무시하고, Fetch-Decode-Execute를 한꺼번에 실행한다. 따라서 0x2098은 이미 Execute가 끝났지만, 0x209C는 Fetch를 실행할 준비 단계이다. (이때 step 명령을 실행하면, 다음 주소의 Fetch-Decode-Execute가 한꺼번에 처리되면서 ARM Core가 동작한다.) 하지만, 변수에 break point를 설정하는 경우에는 파이프라인을 정확히 지키게 된다.

 

출처 : 임베디드 레시피

 

ARM8

- Architecture : ARMv4

- 5-stage pipeline

- 분기 예측 (Branch prediction)

- double-bandwidth memory

 

ARM9TDMI

- Architecture : ARMv4T

 

ARM9E

- Architecture : ARMv5TE
- TCMs

 

※ TCM (Tightly Coupled Memory)

전반적인 속도 향상을 위해 cache를 사용하지만, 완벽하게 실시간으로 저장이나 로딩이 되지는 않는다. 정확한 시간을 예상 가능하게 해주기 위해 빠른 SRAM을 Core에 밀접하게 위치시키는데 이를 TCM이라 한다.

 

ARM9 pipeline (Memory 및 Write 단계가 추가되어 해당 단계에서 다른 명령어가 stall되지 않는다)

 

ARM10

- Architecture : ARMv5TE(J)

- 6-stage pipeline

ARM10 pipeline

 

ARM11

- Architecture : ARMv6

- 8, 9-stage pipeline

- Thumb-2

- MMU + TrustZone

 

ARM11 pipeline

 

이때 ARM11에는 Pipeline 효율을 높이기 위한 Program Flow Prediction 기능이 있다. 이는 명령의 흐름을 예측하여 Pipeline의 Stall 현상을 줄여서 효율성을 높이는 역할을 수행한다.

 

ARM11 Program Flow Prediction

 

Coprocessor에 있는 CR(Control Register)의 Z[11] bit를 조절하면 Program Flow Prediction을 Enable / Disable 할 수 있다. 이후, Dynamic Branch Prediction, Branch Folding 등 각 세부 기능은 ACR(Auxiliary Control Register)을 통해 설정할 수 있다. (Coprocessor의 레지스터를 읽고, 저장하기 위해 MRC와 MCR 명령어를 사용)

 


참고 문헌

 

1. ARM Cortex-M3 시스템 프로그래밍 완전정복 1

2. 임베디드 레시피

728x90

'🔦 > ARM' 카테고리의 다른 글

Cortex-M3를 요약하자면?  (0) 2021.07.29
ARM Cortex 시리즈에 대해 알려주세요  (0) 2021.07.27