Embedded Recipes (2)
http://recipes.egloos.com/5000239
2. Microprocessor 아뜰리에 (Atelier) - ARM을 파헤쳐 보자
a. Microprocessor 아뜰리에
b. ARM inside
c. ARM mode와 THUMB mode
- 원래 ARM은 32bit RISC machine
- THUMB mode : 16비트 버스 라인을 가진 메모리를 사용하기 위하여 명령어들을 16비트로 압축한 명령어 SET
d. ARM 동작 Modes - 나는 어느 mode를 써야하나
ARM의 동작모드는 총 6개
- 표준 사용자 모드
- User, USR: Normal program execution mode
- Privileged mode
- System, SYS : Run privilleged operating system tasks
- Fast Interrupt Request, FIQ : When a high priority (fast) interrupt is raised
- Interrupt Request, IRQ : When a low priority (normal) interrupt is raised
- Supervisor, SVC : A protected mode for the operating system, entered when a SWI instruction is executed
- Abort, ABT : Used to handle memory access violations
- Undef, UND : Used to handle undefined instructions
- Previleged mode : IRQ는 FIQ 등의 인터럽트 사용 가능 유무를 직접 설정할 수 있고, 이 안에서 다른 모드로 변경이 가능하다.
- Default mode는 SVC 모드
e. ARM register와 Context
- ARM은 총 37개의 레지스터를 가지고, 동작 모드가 바뀌면 사용하는 register set도 바뀐다.
- 모든 모드에서 R0 ~ R7, R15, CPSR까지는 공용으로 사용하고, 일부 R8 ~ R14와 CPSR들은 모드에 따라 다른 레지스터를 사용하도록 변경된다.
- 단, System 모드와 User 모드는 완전히 같은 레지스터 set를 사용한다. CPSR의 mode bits만 차이가 남.
- CPSR, Current Program Status Register, 32비트.
12N,Z,C,V[unused]I,F,T,[mode]- N, Negative : 연산 결과가 음수일 때
- Z, Zero ; 연산 결과가 0일 때
- C, Carry : 연산 결과에 자리 올림이 발생한 경우
- V, oVer flow : 연산 결과가 overflow가 발생하였을 때
- I, F : IRQ or FIQ가 걸릴 수 있는지를 표시
- T : Thumb mode인지 여부
- [mode] : 현재 모드가 어느 모드인지를 표시, 이를 변경하면 해당 모드로 전환
- SPSR, Saved Program Status Register : 모드 변경 등의 이유를 CPSR의 내용을 백업하고자 할 때 사용
- R14 (Linked register) : 어딘가로 branch (jump)를 할 때 어디서 해왔는지를 표시, 다시 원래대로 돌아갈 곳을 뜻한다.
- R13 (stack pointer) : 현재 stack을 어디까지 쌓아두었는지 표시
- R15 (Program counter) : 현재 어디를 수행하고 있는지 표시, 현재 Fetch해온 위치를 가리킨다.
- R0 ~ R12 : 일반용도로 사용
- Context : 현재 MCU의 상황, 레지스터 상태, 레지스터들의 snapshot. Context를 복원하면 특정 순간으로 되돌아갈 수 있다.
f. ARM Exceptions and Modes
- priviledged 모드는 자기 마음대로 모드를 변경할 수 있다.
- 또 다른 방법은 하드웨어가 자동적으로 특정 모드로 진입할 수가 있다. 바로 Exception이 발생하였을 때이다.
- Exception은 interrupt를 포함한다.
- Exception이 발생하면 동작을 멈추고 exception 종류에 따라 특별한 주소로 jump한 뒤 exception 처리를 한다.
- SVC : ARM에 전원을 인가하거나 reset 을 시키면 SVC 모드로 전환한 뒤, PC를 0x0으로 점프한다.
- IRQ, FIQ : 인터럽트가 발생하면 IRQ, IFQ 모드로 진입하면서 PC를 0x1C, 0x18로 점프한다.
- ABT : Data abort인 경우, 0x10으로, prefetch abort의 경우에는 0x0C로 점프한다.
- UND : PC를 0x04로 점프한다
- 이렇게 exception이 일어났을 때, 점프하는 주소들을 모아놓은 표를 exception vector table이라고 한다.
- user, system 모드로 가는 exception은 없는데, 이는 system 모드가 user 모드와 같으나 previledged 모드를 전환할 수 있도록 만들었다고 생각해도 된다.
- 한꺼번에 Exception 발생하였을 경우 어느 것을 먼저 처리할 것인지에 대한 순위가 있음.
- Reset
- Data Abort
- FIQ
- IRQ
- Prefetch abort : fetch단계에서 발생하므로 순위가 높지 않아도 먼저 발생하게 되어있다.
- undefined instruction : 주변 기기 제어를 위해 일부러 사용할 때도 있음.
- SWI : 프로그래머가 일부러 발생시키는 것
- Exception 발생 시, 이전 모드로 돌아가기 위해 Context를 저장하였다가 다시 복원하여야 한다.
- 이를 위해서는, CPSR를 저장할 수 있어야 하고, context를 스택에 저장하여야 한다. 또한 원래 수행하던 곳의 주소를 저장해두어야 한다.
- 예를들어 IRQ가 발생하였다고 한다면
- CPSR을 SPSR_irq에 복사하고,
- CPSR의 모드를 IRQ로 변경
- 스택 포인터도 IRQ모드의 스택 포인터로 변경
- IRQ를 disable 시킨다.
- ARM mode로 변경한다. (exception은 ARM에서 처리하여야 함)
- RQ_irq 에 현재 PC를 저장
- PC에 0x12를 저장 : 여기까지는 하드웨어에서 자동으로 처리함.
- R0 ~ R12를 R13_irq의 스택에 저장
- 돌아갈 주소를 보정한다. LR = LR - 4 : 파이프라인에 의해 PC가 이미 2개 증가하였으므로.
- CPSR에 SPSR_irq를 넣으면 이전모드로 돌아감
- STACK에 저장했던 레지스터를 다시 복원
- PC에 R14_irq를 복원
g. ARM/ Thumb PCS - 레지스터 사용법
- 특수 레지스터 외 일반 레지스터에도 쓰임새가 있음.
- APCS(ARM Procedure Call Standard)
- 함수를 부를 때 어떤 레지스터를 써야하는지
- return 값은 어떻게 돌려주는지
- Stack은 어떻게 사용되는지
- 나머지 레지스터는 어떻게 사용되는지
- APCS 외에도, TPCS(Thumb PCS), ATPCS(ARM-Thumb PCS), AAPCS(Procedure Call Standard for ARM Archtecture) 등의 버전들이 존재함.
- R0 ~ R3
- Argument : 함수를 호출할 때, 그 매개변수로 사용되고 리턴 값으로도 사용
- Result : 포인터의 경우, 매개 변수를 리턴하는 것처럼 사용.
- Scratch : 함수 내부에서 임시 저장 용도로 사용
- R4 ~ R11
- 함수 호출 후에 바뀌어서는 안되는 값으로, 사용하려면 스택에 저장 후에 사용하고 복원해줘야 한다.
- R12 ~ R15
- R12 : Veneer 관련
- R13 : Stack Pointer, SP로 사용
- R14 : Link Pointer, LP : 점프 했을 때 돌아오는 곳을 지정
- R15 : Program Counter, PC
h. ARM은 Interrupt냄새를 어떻게 맡는가
- 인터럽트 : 일을 하고 있는 도중 다른 특정 일을 먼저 하게 만들고 돌아와 원래 하던 일을 계속 처리하독 한다.
- Interrupt Controller에 신호를 주면, IC가 CPU의 모드를 IRQ모드로 변경.
- 인터럽트 핸들러에서는 몇번 ISR(Interrupt Service Routine)인지 확인 후에 적당한 ISR을 호출
- Nesting : 인터럽트를 처리하는 중 다른 인터럽트가 걸릴 때. 시스템이나 디자이너마다 달라, 허용을 안하거나 최대 몇개까지는 허용하는 등으로 설계
i. ARM SoC (System On Chip) - ARM 그렇고 말고
- System on Chip, SOC : 자주 사용되는 device들을 block으로 만들어 모듈화.
- 이 block들을 IP(Intellectual Property)이라고 부른다.
- 내부 IP들끼리 버스를 통해 잘 통신할 수 있도록 버스 프로토콜을 제안, AMBA
k. AMBA - SoC안에서 IP끼리의 Bus 규격
- AMBA (Advanced Microcontroller Bus Architecture) : IP끼리 어떻게 통신하고 버스와 어떻게 연결할 것인지 정의해놓은 규약
- AHB (Advanced High Performance Bus)
- ASB (Advanced System Bus)
- APB (Advanced Peripheral Bus)
- 해당 규약을 지원하는 버스에 IP를 연결하면 된다.
- 속도 차이가 있으므로, 느린 IP를 연결할 경우 병목 현상 나타남.
- 아비터(Arbiter) : 버스 사용을 관장
- 동작 순서
- Master가 아비터에서 사용권한 요청 HBUSREQ
- 버스를 사용해도 된다고 응답 HGRANT
- Master가 아비터에게 사용 시작을 알림 HLOCKx
- Master가 Slave에게 HADDR 전달
- 디코더는 HSELx 로 해당 Slave에게 알림
- Write 혹은 Read 신호를 날림
- Slave가 전송 대기 상태 알림 HREADY
- HWDATA 데이터를 전송
- Burst mode : 하나의 주소, 하나의 데이터 순으로 보내는 것이 아니라 wait 신호가 오지 않는한 연속된 주소와 데이터를 한꺼번에 보낸다.
- SINGLE
- INCR : 계속적으로 주소를 증가시킴
- WRAP : 해당 크기의 주소를 반복하면서 데이터를 전송