ARM은 RISC processor core design으로 가장 유명하다. ARM은 직접 공장을 소유해서 processor를 생산하는 것이 아니라 디자인과 라이센스를 주고 다른 회사에서 생산해서 파는 방식을 사용....
ARM architecture은 RISC architecture이다. fixed length instruction을 사용하고 load-store architecture이다(memory-to-register load instruction과 register-to-memory store instruction이 있고 arithmetic instruction으로 메모리 접근은 불가능하다).
Cortex-A
series (application)
full OS를 지원할 정도의 high performance를 가지고 있는 프로세서이다. high-end system에 사용한다. 성능이 좋지만 비싸다.
Cortex-R
series (real-time)
높은 성능을 가지고 있고 real-time application에서 사용할 수 있다.
Cortex-M
series (microcontroller)
비용에 민감한 상황에서 합리적으로 선택할 수 있는 마이크로 컨트롤러다. 센서같은 것도 들어있다. 비용이 저렴하지만 성능이 떨어진다.
ARM architecture은 instruction set을 포함한 여러 detail을 설명하는 것이고 architecture reference manual에 문서로 정리되어 있다.
ARM architecture에 기반한 physical implementation이 ARM processor이다. 구현과 관련한 detail이 더 많이 있다. 프로세서의 technical reference manual에 기술된다.
AArch64
만 64bit을 위한 것이고 나머지 instruction은 32bit용이다.
AArch32
는 instruction의 길이가 32bit이고 Thumb
은 16bit이다. Thumb-2
32bit와 16bit를 모두 이용한다.
위의 그래프에서 세로축은 성능을 의미하며 higher is better이다.
그래프를 분석해보자.
32bit인 경우 : ARM
이 Thumb
보다 성능이 좋다.
ARM
이 Thumb
에 비해 total number of instruction을 줄일 수 있기 때문이다.
instruction의 bit수가 클 수록 한 instruction을 통해 할 수 있는 일이 많아진다. memory width가 32bit인데 굳이 16bit instruction을 사용하는 것은 비효율적이다.
16bit인 경우 : Thumb
이 ARM
보다 성능이 좋다.
ARM
instuction은 32bit이기 때문에 memory width가 16bit일 때 사용하려면 한 instruction을 fetch하기 위해 memory access를 2번 해야한다. 그래서 ARM
의 속도가 더 느려지게 된다.
Thumb-2
instruction은 ARM
instruction과 Thumb
instruction이 각각 32bit와 16bit의 fixed length를 쓰는 것과 다르게 32bit와 16bit를 둘 다 사용할 수 있다.
Thumb-2
instruction은 ARM
instruction을 사용하는 것에 비해 core size를 26% 줄일 수 있다. 또한 complex instruction은 32bit으로 나타낼 수 있기 때문에 Thumb
instruction에 비해 25% 성능이 더 좋다.
ARM state
에서는 32bit instruction을 사용할 수 있고 Thumb state
에서는 16bit instruction을 사용할 수 있다.
current instruction state는 branch address의 LSB
를 통해 결정된다.
LSB
가 0인 경우 : ARM mode
LSB
가 1인 경우 : Thumb mode
M
뒤에 붙은 숫자가 작을 수록 작은 프로세서이다.
Cortex-M0
: 매우 작은 프로세서.. 싸고 성능 안좋음
Cortex-M0+
: 가장 energy-efficient한 프로세서. small embedded system에 사용한다.
Cortex-M1
: FPGA 디자인에 최적화 되어있는 프로세서.
Cortex-M3
: low-power microcontroller를 위한 작고 powerful한 embedded 프로세서.
ARM instruction을 알아들을 수 없고 Thumb과 Thumb-2 instruction만 decode할 수 있다. harvard architecture를 사용한다.
3-stage pipeline을 사용한다.
Cortex-M4
: Cortex-M3
에서 multimedia를 위한 instruction이 추가된 프로세서.
Cortex-M7
: high-performance 프로세서.
Cortex-M23
: Cortex-M0+
와 비슷하지만 Cortex-M0+
이 Armv6-M
architecture를 사용하는 것과 달리 Armv8-M
을 사용한다. TrustZone security extension을 지원한다!
Cortex-M33
: Cortex-M3
, Cortex-M4
와 비슷하며 TrustZone security extension을 지원한다.
Fully programmable in C : Cortex-M
은 C로 fully programmable하다. 즉, C로 펌웨어를 만들 수 있다.
Stack-based exception model : 하드웨어에서 exception이 발생하면 handle하기 전에 stack에 자동으로 register값이 push되고 handle이 끝나면 그 값들을 restore한다.
Thumb & Thumb-2 instruction sets : ARM instruction은 사용하지 않는다.
Two processor modes : user task를 위한 thread mode와 exception을 위한 handler mode가 있다.
Cortex-M
프로세서에는 R0
부터 R12
까지 13개의 레지스터가 있지만 Thumb mode에서는 R0
부터 R7
까지 8개의 레지스터밖에 사용하지 못한다.
그것은 Thumb instruction의 크기가 너무 작아서 그렇다. 16bit밖에 사용하지 못하는데 13개의 레지스터를 사용하려면 레지스터의 위치를 표현하는 데에 4bit를 써야한다. 8개의 레지스터만 쓰면 위치를 나타낼 때 3bit면 충분하므로 Thumb mode에서는 사용할 수 있는 레지스터의 수를 제한한다.
R13
은 stack pointer로 사용된다.
Cortex-M
에는 총 2개의 mode가 있기 때문에 stack pointer도 2개가 있다.
MSP
) : default stack pointer이다. OS kernel과 exception handler, privileged mode에서 사용된다. 일반적인 운영체제로 생각해보면 kernel mode에서 사용되는 stack pointer를 의미한다.PSP
) : user application code에서 사용하는 stack pointer를 의미한다.두 stack pointer는 한 번에 하나만 visible하다. 각 시점에서 R13
을 통해 현재 사용중인 stack pointer만 지정할 수 있다.
예를 들면 MSP
를 사용중일 때는 R13
을 통해 MSP
만 보이며 PSP
는 지정할 수 없다.
R14
는 link register이다(LR
).
LR
은 function이 call됐을 때 return address를 저장하는 용도로 사용된다.
main:
...
BL foo ;PC = foo, LR = next instruction
...
foo:
...
BX LR ;Return
R15
는 program counter이다(PC
). PC
에는 next instruction의 주소가 담겨있다.
PC
를 읽어들일 때 LSB
는 항상 0이다.
PC
에 write를 할 때 branch가 유발된다. LSB
는 Thumb state operation을 의미하기 위해 항상 1이어야 한다. 만약 0이라면 Cortex-M
에서는 fault exception을 유발한다.
Cortex-M
에는 special register가 있다.
PSRs
)PRIMASK
, FAULTMASK
, BASEPRI
)CONTROL
)special register들은 MSR
이나 MRS
instruction을 통해서만 접근할 수 있다.
MSR
이나 MRS
은 memory address를 통해서 access하지 않고 register를 통해서만 access한다!
MRS <reg>, <special_reg> ; Read special register
MSR <special_reg>, <reg> ; Write to special register
PSRs
은 3개의 status register로 나누어진다.
APSR
)IPSR
)EPSR
)만약 다 합쳐서 collective item으로 접근한다면 xPSR
이 사용된다(code에서는 PSR
이 사용된다).IPSR
와 EPSR
은 read-only이다.
MRS r0, APSR ; Read flag state into r0
MRS r0, IPSR ; Read exception/interrupt state
MRS r0, EPSR ; Read exception state
MSR APSR, r0 ; Write flag state
xPSR
에는 다음과 같은 방법으로 접근할 수 있다.
MRS r0, PSR ; Read the combined program status word
MSR PSR, r0 ; Write combined program state word
Cortex-M
의 bit field는 다음과 같다.
N
, Z
, C
, V
, Q
는 APSR
에서 사용하는 bit field이자 flag이다.
ICI/IT
와 T
는 EPSR
에서 사용한다. T
가 항상 1이라는 점에 주목하자.
Exception Number
은 IPSR
에서 사용한다.
이 레지스터들은 exception을 disable할 때 사용된다.
PRIMASK
, FAULTMASK
, BASEPRI
에 access하기 위해서는 MRS
와 MSR
instruction을 사용해야 한다.
세 레지스터는 user access level에서 set 될 수 없다.
control register는 privilege level과 stack pointer selection을 정의하기 위해 사용된다.CONTROL[1]
은 Cortex-M3에서 handler mode일 때 항상 0이지만 thread mode에서는 0 또는 1 둘 다 될 수 있다. core가 thread mode이고 privilege mode일 때만 이 bit을 write 할 수 있다.
CONTROL[0]
은 privilege mode에서만 write할 수 있다.
Control register에 access하기 위해서는 MRS
와 MSR
instruction을 사용해야 한다.
두 개의 mode와 두 개의 privilege level이 있다. operation mode는 processor가 normal program을 running하고 있는지 exception handler를 running하고 있는지 나타낸다.
CONTROL
register는 software 실행이 privileged인지 unprivileged인지 나타낸다.MSR
(move register to special register), MRS
(move special register to register) instruction에 limited access를 하고 CPS
(change processor state) instruction을 사용할 수 없다.vector table은 word data의 array인데 각 data는 한 exception/interrupt의 handler의 starting address를 나타낸다.
vector table의 base address는 NVIC
의 relocation register를 set해서 바꿀 수 있지만 초기값은 0x0
이다.
프로세서가 reset에서 exit하면 두 word를 memory로부터 읽는다.
0x00000000
: R13
의 default value (MSP
)0x00000004
: reset vector (startup program의 starting address, thumb state를 나타내기 위해 LSB
는 1로 set되어야 함)