[EETB] #2 마이크로컴퓨터 하드웨어

문연수·2022년 8월 31일
1

EETB

목록 보기
2/9

 이하의 글은 필자가 임베디드 엔지니ㅓ 교과서 (와타나베 노보루 & 마키노 신지 지음, 정인식 옮김, 제이펍 출판사) 를 읽고 그 내용을 정리한 글이다.

1. 임베디드 시스템의 구성

 .임베디드 시스템은 기능이 정해진 목적에 따라 구성되어 전용의 동작을 하기 때문에 동작 중에 기능이 변화하는 일은 없다.

2. 임베디드 마이크로컴퓨터의 구성

- 1. 하드웨어의 종류

  • CPU, Central Processing Unit

  • 메모리
    ROM(Read-Only Memory))
    RAM(Random Access Memory))

  • 주변장치(Peripheral)
    Timer
    DMA Controller
    Interrupt Controller
    Serial Controller
    A/D Controller
    PWM Controller

- 2. CPU 와 마이크로 프로세서

  • CPU: 계산에 필요한 부품을 하나의 칩으로 합쳐 놓은 것이다.
  • 주변장치: 주변에서 접속되는 하드웨어로, 마이크로컴퓨터의 코어라고 불리는 CPU 에 의해 제어된다.
  • BUS: CPU 와 주변 장치를 연결하는 신호선
  • 마이크로컴퓨터: CPU <---> 버스 <---> 주변 장치1, 주변장치 2

- 3. 메모리

 CPU 가 없이 주변장치 만으로 이루어진 하드웨어 구성으로도 용도에 맞춘 기능을 실현할 수 있다. (그냥 VCC - 저항 - 스위치 - LED - GND 직렬로 연결하면 되긴 함)

 그러나 이보다 더 복잡한 작업을 수행(입력에 따라 LED 가 깜빡이거나 색상 변화 등)에는 CPU 의 힘이 필요하다.

 단, CPU 만 추가해선 제대로 된 동작을 기대하기 어렵고 임베디드 동작 절차를 기술한 프로그램 이 CPU 에 전달되어야 한다.

이 프로그램을 보관하기 위해 메모리라는 하드웨어가 필요하다.

- 4. ROM

  • ROM 은 읽기 전용 메모리를 뜻하며, 프로그램을 보관해 두고 CPU 로부터 읽기 요구가 있을 때 프로그램을 읽어 들여 CPU 에 프로그램을 전달하는 역할을 담당한다.
  • ROM 에는 CPU 가 이해할 수 있는 기계어의 형태로 프로그램의 명세를 저장해야 한다.
  • ROM 의 내부는 어드레스(주소)라는 나뉜 구획이 있으며, 각각의 구획에 기계어의 명령어를 보관한다.

- 5. RAM

  • RAM 은 프로그램을 실행할 때 일시적으로 데이터의 보관이 필요한 경우에 사용된다. ROM 은 읽기만이 가능한 메모리이므로 일시적인 보관 장소로는 이용할 수 없기 때문이다.
  • 일시적으로 데이터의 보관이 필요한 것은 특정 기능과 별개의 기능을 전환할 때 등이다. (필자는 이것의 예로 Context Switching 을 들고 싶다, 물론 범용 레지스터에 저장되어 질 수도 있지만 뭐가 되었든 기존 작업을 저장해야 한다)
  • 시리얼 콘솔에 문자를 출력할 때 문자나 숫자는 CPU 에서 생성되고, 이것들의 값을 시리얼로 전달하기 위해 RAM 에 임시적으로 보관해둔다. 그런 다음, 시리얼 콘솔에 출력하는 기능이 동작해 RAM 에 일시적으로 보관한 값을 읽어서 콘솔에 출력하는 것이다. (DMA 등이 활용될 수도 있겠다)

- 6. 메모리의 종류

  • ROM, RAM 과 함께 용도에 맞게 몇 가지 종류가 있다. 기본적인 성질로서 ROM 은 비휘발성(Non-volatile memory) 라고 불리며, 전원이 꺼져도 내용이 지워지지 않는다. RAM 은 휘발성 메모리(volatile)라고 불리며, 전원이 꺼지면 내용도 지워진다.
분류종류기억한 내용쓰기 방법삭제 방법단점
마스크 ROM명령 코드, 고정 데이터 (상수 등)제조공정에서 기록삭제 불가제조의 시간이 걸린다.
플래시 메모리명령 코드, 고정 데이터 (상수 등)
전원이 꺼져도 지워지면 안되는 데이터
전기적삭제 단위가 크다.
|EEPROM명령 코드, 고정 데이터 (상수 등)
전원이 꺼져도 지워지면 안되는 데이터
전기적용량이 작다.
EPROM명령 코드, 고정 데이터 (상수 등)|자외선고가
PROM(TOP)명령 코드, 고정 데이터 (상수 등)삭제 불가로 1회 재기록삭제 불가이므로 삭제하면 다시 만들어야 한다.
휘발성SRAM전원이 꺼지면 사라져도
|
전기적소비 전류가 작다.모듈 면적이 크다.
메모리DRAM좋은 명령 코드나 데이터프로그램 처리에서 보관영역으로 이용프로그램 처리에서 0 클리어 등리프레쉬가 필요하다.

eMMC 란...?

 eMMC 는 요즈음 PC 에서도 사용하게 된 NAND 형의 플래시 장치이다. eMMC 가 아닌 단순 NAND 형 플래시는 데이터를 기록할 때에 덮어쓰기를 할 수 없다. 기록이 끝난 장소에 별개의 데이터를 기록할 때는 일단 삭제를 해야 하기 때문에 프로그램으로 NAND 형 플래시를 관리해야 한다.

 이에 반해 eMMC 는 읽기와 쓰기를 관리하는 하드웨어와 NAND형 장치가 일체형으로 이루어진 메모리이다. NAND 형 플래시와는 달리 덮어쓸 때에도 eMMC 자체에서 관리 해준다. 또한 eMMC 는 SD 카드처럼 사용할 수 있기 때문에 최근에 자주 사용되는 메모리다.

필자가 사용하는 ODROID 에서도 저장 장치로 eMMC 를 사용한다. 독특한 쓰기 장치가 따로 존재한다.

- 7. 버스의 구성

버스는 메인 버스와 로컬 버스로 나뉠 수 있다:

  • 메인 버스: CPU 로부터 고속으로 제어하기 원하므로 고속으로 동작하는 버스
  • 로컬 버스: 브릿지(Bridge)를 경유하는 저속으로 동작하는 주변장치를 위한 버스

- 8. 메인버스의 용도

 메인 버스는 CPU 와 메모리(ROM/RAM) 또는 주변장치에 접속하기 위한 신호선이다.

  • 주소버스: 메모리나 주변 장치에 접근할 특정 위치를 나타내기 위해 이용되는 신호선이다. 메모리나 주변장치의 장소를 지정하기 위해서 주소 신호가 CPU로부터 지정된다.
  • 데이터 버스: 메모리나 주변장치로부터 뎅이터를 읽어 들이기 위한 신호선이다. 데이터 버스는 쌍방향으로 되어 있으며, CPU로부터의 출력, CPU로의 입력이 가능하도록 되어 있다.
  • 컨트롤 버스: 메모리나 주변장치를 제어하기 위한 신호선이다. 데이터를 읽고 쓰는 타이밍이나, 주변장치와 CPU 간의 제어에 필요한 신호를 전달하기 위해 사용된다.

 각종 버스 신호는 clock 이라고 부르는 하드웨어를 동작시키기 위한 타이밍 신호에 동기화되어 CPU로부터의 지시 대상이 되는 메모리나 주변장치에 지시를 전달하는 데 사용된다.

- 8. 로컬버스

 로컬버스는 메인버스와는 달리 메인버스의 클럭 속도보다도 저속으로 동작하는 주변장치를 제어하는 신호선으로 되어 있다. 로컬 버스를 사용함으로써 많은 주변 장치에 접속할 수 있다.

* 브릿지

  • 메인 버스와 로컬 버스를 연결하는 컨트롤러를 말하며, 하드웨어 구성에 따라 다른 이름으로 부른다. 브릿지는 고속으로 동작하는 메인 버스와 저속으로 동작하는 로컬 버스와의 속도를 통제해 주는 하드웨어이다.

* UART(Universal Asynchronous Receiver/Transmitter)

  • 동기식 직렬 신호를 병렬 신호로, 또는 역으로 병렬 신호를 직렬 신호로 변환하는 하드웨어로서 로컬버스에 접속된다. CPU로부터 데이터를 송신할 때에는 UART 에 대해 8~16비트의 폭으로 데이터가 병렬 전송된다.
  • UART 끼리 통신할 때에는 비동기 직렬 통신을 처리한다. 비동기 방식은 보조동기 방식이라고도 불리며, 지금부터 데이터를 보낸다, 이것으로 데이터가 끝났다 라는 신호를 실제 데이터 사이에 보내서 데이터를 송수신하는 장치끼리 상호인식을 하여 통신하는 방식이다.

임베디드 시스템에서는 호스트 PC 와 임베디드 시스템에 접속하여 시리얼 콘솔로 테스트나 디버깅할 때에 많이 이용한다.

* I2C

  • 시리얼 제어버스로서 시리얼 클럭(Serial CLock, SCL)과 양방향 시리얼 데이터(Serial DAta, SDA)의 2개의 신호선을 사용하여 통신하는 동기식 직렬 통신이다.
  • 마스터(주) 장치와 슬레이브(종) 장치라는 관계가 있어서 복수의 슬레이브 장치에 접속할 수 있다. 마스터 장치는 개별로 정해진 슬레이브주소를 지정하여 슬레이브 장치를 선택해 통신한다.

터치 센서나 가속도 센서 등 센서 디바이스의 접속에 자주 이용된다.

* SPI

  • SPI 는 시리얼로 제어하는 버스로써 SCK(시리얼 클락)와 단방향의 시리얼 데이터 인(Serial Data In, SDI), 시리얼 데이터 아웃(SDO)의 세 가지 신호선으로 통신하는 동기식 직력 통신이다.
  • 버스에서 복수의 슬레이브에 접속할 수 있는 것은 I2C 와 마찬가지이지만, 슬레이브 디바이스를 선택하려면 제어버스인 슬레이브 셀렉트(Slave Select, SS)를 이용해야 한다.
  • I2C보다 많은 선이 필요하지만 데이터 포맷이나 원리가 단순하므로 I2C 버스보다도 고속으로 통신할 수 있다.

SPI 는 플래시 메모리와 같은 스토리지 디바이스나 CPU 간의 통신 등에 많이 사용된다. (CPU 간의 통신은 HMP 와 같은 구조에서의 CPU 간 통신을 의미하는 것? 이 아닐까 생각한다)

- 10. 주변장치

주변장치는 CPU 주변에 놓여 있는 하드웨어다.

* DMA (Direct Memory Access) 컨트롤러

  • 일반적으로 CPU가 메모리의 데이터 읽기, 쓰기를 실행한다. 그리고 이러한 방식을 PIO(Programmed I/O)라고 부른다.
  • PIO 방식으로 대량의 데이터를 읽고 쓰면 CPU 는 다른 처리를 할 수 없게 된다. 이것에 비해 DMA 는 CPU를 사용하지 않고 메모리의 데이터를 읽고 쓰는 주변 장치다.
  • DMA 실행 시에는 각 주변장치 사이에서나 CPU로부터의 데이터가 부딪치지 않도록 조정할 관리자인 버스 아비터(Bus Arbiter)를 통해 버스로 사용하기 위한 버스 중재(Bus Arbitration)를 실시한다.
  • 단, 데이터를 메모리에 전송하는 동안에는 버스를 점유하므로 메모리 엑세스가 느려질 수 있다.

* 타이머

  • 타이머는 프로그램에서 주변장치를 주기적으로 감시하거나, 주기적으로 데이터를 출력하는 등 시간 관련 처리를 위해서 필수적인 장치이다.
  • 타이머는 카운터라고 부르는 레지스터에 주기 시간을 설정한다. 주기 시간이 경과되면 처리 중간에 끼어들어(인터럽트(Interrupt)) 그 사실을 CPU 에 통지한다.

* RTC (Real-Time Clock)

 시간을 관리하는 주변장치이다. 시간을 한번 설정해주면 전원이 켜진 동안은 매 초 시간이 갱신된다.

* GPIO (General Purpose Input/Output)

 CPU 가 외부로부터의 입력 및 출력을 범용으로 입출력할 수 있는 포트다. 실제로 CPU에 연결되어 있는 포트로, CPU 의 설정을 통해 활성화 또는 비활성화 할 수 있다.

- 11. 주변장치의 제어 방식

 대다수의 주변장치는 레지스터(register)라는 제어용 메모리를 사용하여 CPU로부터 제어한다. 각 주변장치에 따라 비트 위치나 비트 폭 등의 구성이 다르지만, CPU로부터 제어할 때 레지스터의 읽기/쓰기를 통해 레스터로의 쓰기/읽기를 통해 제어한다는 공통점이 있다.

* 메모리 맵드 I/O (Memory Mapped I/O)

 ROM, RAM 과 마찬가지로 주변장치의 레지스터로 메모리를 취급한다.

0x0000 ~ 0x8000: ROM 영역
0x8000 ~ 0xFF00: RAM 영역
0xFF00 ~ 0xFFFF: 주변장치의 레지스터

* I/O 맵드 I/O (I/O Mapped I/O)

 ROM, RAM 은 메모리 공간으로 취급하나, 주변장치의 레지스터는 전용의 명령으로 제어한다.

0x0000 ~ 0x8000: ROM 영역
0x8000 ~ 0xFFFF: RAM 영역

메모리와 주변장치의 레지스터 주소를 구분하여 취급

0x00 ~ 0xFF: 주변장치의 레지스터

3. CPU 란?

 CPU는 Central Processing Unit 의 약자로 한글로는 중앙 처리 장치 라 부르는 하드웨어로서 ROM 으로부터 실행해야 할 절차를 읽어들여, 읽어들인 절차를 해석하여 실행한다.

1. CPU의 구성

* 프로그램 카운터(PC: Program Counter)

 프로그램 카운터는 CPU가 실행하는 명령의 장소를 관리하여 다음에 실행해야 할 명령을 읽을 위치(주소=번지)를 CPU에 전달하는 역할을 한다.

* 디코더

 읽어들인 명령의 의미를 해독하는 하드웨어다.

* ALU (Arithmetic Logic Unit)

 정수의 덧셈, 뺄셈 등의 사칙연산이나, AND, OR, NOT 등의 논리연산을 실행하는 하드웨어 회로다.

* 범용 레지스터 (General Purpose Register)

 CPU에 내장된 메모리로 고속이지만, 숫자 값을 하나 기억할 수 있는 정도의 용량이 작은 메모리다.

* 시스템 레지스터

 CPU 가 명령을 실행할 때에 이용하는 레지스터이다. 명령을 보관하는 명령 레지스터, 번지를 관리하는 주소 레지스터, CPU의 상태를 관리하는 상태 레지스터 (플래그 레지스터) 등이 있다.

2. CPU의 명령 실행

  • 명령은 기본적으로 네 가지 절차로 실행된다:
    1. ROM으로부터 하나의 명령어를 추출 (명령어 페치 사이클)
    2. 추출한 명령을 해독하여 실행 준비하기 (명령 디코드 사이클)
    3. 명령 실행 (실행 사이클)
    4. 명령 실행결과의 반영 (라이트백 사이클)
  • CPU의 명령은 크게 세 가지 종류로 나뉠 수 있다.
    1. CPU 와 메모리 사이에서 데이터를 교환하는 명령
    2. CPU 와 주변장치 사이에서 데이터를 교환하는 명령
    3. CPU 안에서만 실행되는 명령

3. 인터럽트

  • 인터럽트(끼어들기)는 주변장치로부터의 처리 요구를 CPU에 통지하기 위한 신호다. CPU가 인터럽트 신호를 받으면 인터럽트 벡터 테이블(Interrupt Vector Table)이라는 전용의 위치에 실행이 옮겨진다.
  • 인터럽트 벡터테이블에는 미리 정해진 프로그램(필자는 서브루틴이라 부르고 싶다.)이 등록되어 있어서 인터럽트 번호에 의해 정해진 처리로 점프한다. 인터럽트 처리가 끝나면 원래 처리하고 있던 위치로 돌아와 일상적인 동작을 계속해서 실시한다.
  • 인터럽트에는 CPU 내부의 타이머로 발생하는 타이머 인터럽트와 주변장치 등의 외부 하드웨어로부터 발생하는 외부 인터럽트가 있다.

* 인터럽트의 종류와 벡터

  • 임베디드 시스템에서는 다수의 인터럽트를 취급해야 한다. 인터럽트 신호가 발생할 때 인터럽트 종류에 대응하는 처리를 동작시키게 된다.
  • 인터럽트 벡터는 정해진 메모리 주소의 테이블 인터럽트 요인의 수만큼 배치된다. 인터럽트 벡터에는 처리 그 자체를 등록하는 것이 아니라 처리가 존재하는 메모리 상의 주소(번지)를 등록해준다.

 시스템마다 다를 수 있겠지만 필자가 알고 있는 Exception Vector Table 의 각 Exception, Interrupt 에 할당된 크기는 Instruction 1 개 이므로 보통 점프 명령어를 넣어서 이를 처리하는 서브 루틴으로 뛰어 넘어간다고 알고 있다.

* 인터럽트의 우선순위

  • 인터럽트를 실행하려면 우선순위를 결정해야 한다. 여러 인터럽트가 동시에 발생할 때 우선순위가 정해져 있지 않으면 어느 인터럽트 요인을 먼저 처리해야 할 지 알 수 없기 때문이다.
  • 인터럽트 우선순위를 설정할 수 없는 CPU 에서는 하드웨어의 회로를 설계할 때에 CPU의 인터럽트 신호에 접속되는 주변장치가 결정되면 우선순위로 결정된다. 한번 주변장치의 접속이 결정되면 하드웨어를 다시 만들지 않는 한 우선순위를 바꿀 수 없게 된다.

 사실, 대부분의 내용을 알고 있었기에 읽는데 전혀 부담이 없었다. 몰랐던 내용도 몇 가지 있었지만 대부분 이전의 읽었던 책들(Operating System: A Three Easy Pieaces, Inside Machine, 임베디드 OS 개발 프로젝트, 리눅스 커널 내부구조, etc.)에서 나왔던 내용이라서 쭈욱 읽어 나갔다. 특히 한국어라서 정말 술술 잘 읽혔다.

그래도 다시금 정리 차원에서 정리해서 올려본다.

출처

[Book] 임베디드 엔지니어 교과서, 와타나베 노보루, 마키노 신지 지음, 정인식 옮김, 제이펍 출판사

profile
2000.11.30

0개의 댓글