읽기일기

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비트.

    • 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 발생하였을 경우 어느 것을 먼저 처리할 것인지에 대한 순위가 있음.
    1. Reset
    2. Data Abort
    3. FIQ
    4. IRQ
    5. Prefetch abort : fetch단계에서 발생하므로 순위가 높지 않아도 먼저 발생하게 되어있다.
    6. undefined instruction : 주변 기기 제어를 위해 일부러 사용할 때도 있음.
    7. SWI : 프로그래머가 일부러 발생시키는 것
  • Exception 발생 시, 이전 모드로 돌아가기 위해 Context를 저장하였다가 다시 복원하여야 한다.
  • 이를 위해서는, CPSR를 저장할 수 있어야 하고, context를 스택에 저장하여야 한다. 또한 원래 수행하던 곳의 주소를 저장해두어야 한다.
  • 예를들어 IRQ가 발생하였다고 한다면
    1. CPSR을 SPSR_irq에 복사하고,
    2. CPSR의 모드를 IRQ로 변경
    3. 스택 포인터도 IRQ모드의 스택 포인터로 변경
    4. IRQ를 disable 시킨다.
    5. ARM mode로 변경한다. (exception은 ARM에서 처리하여야 함)
    6. RQ_irq 에 현재 PC를 저장
    7. PC에 0x12를 저장 : 여기까지는 하드웨어에서 자동으로 처리함.
    8. R0 ~ R12를 R13_irq의 스택에 저장
    9. 돌아갈 주소를 보정한다. LR = LR - 4 : 파이프라인에 의해 PC가 이미 2개 증가하였으므로.
    10. CPSR에 SPSR_irq를 넣으면 이전모드로 돌아감
    11. STACK에 저장했던 레지스터를 다시 복원
    12. 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) : 버스 사용을 관장
  • 동작 순서
    1. Master가 아비터에서 사용권한 요청 HBUSREQ
    2. 버스를 사용해도 된다고 응답 HGRANT
    3. Master가 아비터에게 사용 시작을 알림 HLOCKx
    4. Master가 Slave에게 HADDR 전달
    5. 디코더는 HSELx 로 해당 Slave에게 알림
    6. Write 혹은 Read 신호를 날림
    7. Slave가 전송 대기 상태 알림 HREADY
    8. HWDATA 데이터를 전송
  • Burst mode : 하나의 주소, 하나의 데이터 순으로 보내는 것이 아니라 wait 신호가 오지 않는한 연속된 주소와 데이터를 한꺼번에 보낸다.
    • SINGLE
    • INCR : 계속적으로 주소를 증가시킴
    • WRAP : 해당 크기의 주소를 반복하면서 데이터를 전송


Add a Comment Trackback