티스토리 뷰

🔦/ARM

Cortex-M3를 요약하자면?

philBaek (백광록) 2021. 7. 29. 23:57
728x90
반응형

Cortex-M3는 2010년에 출시되어 그 나이가 대략 10살을 넘어섰다. 그런데도 불구하고 Cortex-M3의 특징에 대해 정리하는 것은 아직까지 쓰이는 곳이 꽤 많으며, 요즘 보고 있는 책인 ARM Cortex-M3 시스템 프로그래밍 완전정복 1에서 Cortex-M3를 다루고 있기 때문이다! Cortex-M3에 대해 간략히 정리하자면 아래와 같다.

 

  ARM Cortex-M3
Architecture ARMv7-M (Havard)
ISA Support Thumb / Thumb-2
Pipeline 3-stage + branch speculation
Interrupts NMI + 1 ~ 240 physical interrupts
Interrupt Latency 12 cycles
Inter-Interrupt Latency 6 cycles
Sleep Modes Integrated
Memory Protection 8 region MPU
Dhrystone 1.25 DMIPS/MHz
Power Consumption 0.19mW/MHz

 

위의 표에서 볼 수 있듯이 Cortex-M3는 Havard Architecture이며, Thumb-2 명령어 셋을 지원하는 것을 확인할 수 있다. 또한 분기 예측을 지원하고, 꽤나 많은 인터럽트 소스를 가지는 것을 확인할 수 있다. 이번에는 Cortex-M3에 대해 간략하게만 알아보고, 다음 글에서 더 자세하게 알아보도록 하겠다.

 

Havard Architecture

컴퓨터 아키텍처에는 대표적으로 두 가지 종류가 있다. 바로 하버드 아키텍처와 폰 노이만 아키텍처이다. 둘의 차이에 대해 간단하게 설명하자면 데이터 버스와 명령어 버스가 서로 분리되어 있는지에 대한 여부이다.

 

폰 노이만 아키텍처는 전체적인 모습은 아래 그림과 같다.

 

폰 노이만 아키텍처

 

그림에서 볼 수 있듯이, 폰 노이만 아키텍처는 산술/논리를 담당하는 ALU Unit과 제어를 담당하는 Control Unit이 같은 메모리를 공유한다. 즉, 데이터 메모리와 명령어 메모리가 서로 분리되지 않고, 하나의 버스를 공유하는 구조이다. 구조가 간단하다는 특징이 있지만, 한 가지 문제점이 있다. 바로 명령어를 읽을 때, 데이터를 읽거나 쓸 수 없다는 점이다.

 

반면에, 하버드 아키텍처는 아래 그림의 모습과 같다.

 

하버드 아키텍처

 

그림에서 볼 수 있듯이, 하버드 아키텍처는 하드웨어적으로 명령용, 그리고 데이터용으로 메모리 및 버스를 분할한 구조로서 명령어와 데이터를 동시에 읽을 수 있다는 특징이 있다. 이러한 하버드 아키텍처는 ARM9부터 적용 되었다.

 

최근에는 CPU 내부적으로는 하버드 아키텍처를, 외부적으로는 폰 노이만 아키텍처를 적용해 속도를 더욱 향상시킨 구조를 사용한다.

 

Thumb-2 ISA

ARM7은 Thumb 뿐만 아니라, ARM ISA도 지원하지만, Cortex-M3는 Thumb-2만을 지원한다. 이때 Thumb은 16 bits의 사이즈를 가지며, ARM은 32 bits의 사이즈를 가진다.

 

ARM7의 경우, 16 bits 사이즈인 Thumb 명령어를 사용함으로써 코드 사이즈를 줄일 수 있다는 장점이 있다. 하지만 Thumb 명령어의 경우, 사이즈가 작아 명령어의 종류가 제한적이다. 또한, 모든 인터럽트는 32 bits 사이즈인 ARM 모드로 동작되어야 하기 때문에 Thumb mode로 동작중에 인터럽트가 발생할 경우, 이러한 모드 전환에 많은 시간이 소모된다는 단점이 있다.

 

이를 해결하기 위해 Cortex-M3에서는 Thumb-2 ISA를 지원하는데 Thumb-2는 16 bits와 32 bits 모두를 지원하기에 모드 전환 없이 사용 가능하다는 특징이 있다. 따라서 모드 전환에 필요한 시간 소모를 줄이고, 코드 사이즈도 줄일 수  있어 매우 효율적이다.

 

Pipeline Branch Speculation

Cortex-M3의 파이프라인은 Fetch - Decode - Execute 3단계 구조에 더해서 분기 예측(Branch Speculation)을 수행한다. 먼저 분기 예측을 수행하게 된 배경에 대해 말해보자면 다음과 같다.

 

CPU는 명령 수행 중에 Branch(분기문)를 만나게 되면(Control Hazard) 다른 주소로 점프해야하기에 이전에 파이프라인에 저장해둔 정보는 필요가 없다. 즉, PC 값이 변하기 때문에 중간에 있는 명령어를 실행하지 못하는 현상이 발생하는 것이다. 따라서 이러한 경우, 파이프라인을 Flush 하고, 다시 Fetch - Decode - Excecute를 수행하므로 2 Cycle을 더 소모하게 되는데, 이는 많은 낭비를 가져온다.

 

BR 명령어에 의해 다른 주소로 이동하게 되어 SUB와 ADD는 필요 없어짐

 

분기 예측은 위와 같은 Control Hazard를 피하기 위해 다양한 알고리즘을 사용해서 이를 해결하는 기법이다. 가장 간단하게 예를 하나 들어보자면 다음과 같은 방법이 있다. for 반복문이 100번 실행된다고 가정할 때, 원래는 for 반복문 끝에서 다음 명령을 Fetch 해야 하지만, for 반복문의 첫 번째 명령을 가져옴으로써 파이프라인 Flush 없이 빠른 속도로 100회의 반복문을 처리할 수 있다.

 

Cortex-M3 Interrupt

이전 버전과 달리, Cortex-M3에서는 시스템에서 관리되는 16개의 인터럽트에 더해 최대 240개까지의 인터럽트를 할당할 수 있다. 또한 인터럽트 지연시간도 대폭 줄었는데, stack operation에 대한 사이클 수가 줄었고, tail-chining 및 late-arriving과 같은 인터럽트 관련 알고리즘이 적용되어 이전에 비해 보다 빠른 인터럽트 처리가 가능하게 되었다.

 

Cortex-M3 Interrupt 블록 다이어그램

 

▼ NMI란?

더보기

Non-Maskable Interrupt

NMI란 인터럽트 마스크에 영향을 받지 않는 가장 우선순위가 높은 인터럽트를 의미한다. 즉, 기타 HW 장치에 의해 생성되는 다양한 인터럽트 요구를 우회하기 때문에 다른 인터럽트에 의해 저지(Mask)되지 않는다.

 


참고 문헌

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

728x90

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

ARM Cortex 시리즈에 대해 알려주세요  (0) 2021.07.27
ARM 아키텍처 역사 탐험  (0) 2021.07.27