3. 임베디드 시스템의 개념, 특징, 구성
참고도서 : 임베디드 엔지니어 교과서, 와타나베 노보루, 제이펍, 2020
책을 내용을 참고하였으며, 추가 정보가 필요할 경우 ChatGPT와 구글 검색을 활용합니다.
이 글은 포토폴리오 목적이며, 별도의 수익을 창출하지 않습니다.
임베디드 시스템이란?
임베디드 시스템이란 마이크로 컴퓨터를 탑제한 기계나 장치를 의미합니다. 기존의 PC와 다른점이라고 한다면, 임베디드 시스템에서 입력은 센서를 통해 얻은 정보가 될 수 있고, 출력은 화면에 출력하거나 모터를 동작하는 등의 제어 신호에 해당할 수 있습니다.
임베디드 시스템의 특징
창문으로 들어오는 빛의 양이 적으면 전등을 켜고, 많으면 전등을 끄는 시스템이 있다고 생각을 해보겠습니다. 이 경우에 다음과 같은 특징을 가질 것입니다.
1. 임베디드 시스템은 외부 세계의 변화를 감지하고, 그 결과를 다시 외부세계로 피드백합니다. 쉽게 설명하면 빛의 양을 측정하고, 이를 통해 전등을 제어합니다.
2. 빛의양을 측정하고 전등을 켜고 끄는 동작을 한다고 생각해볼 때, 이 동작을 하는 시스템을 위해 수백만원짜리 데스크탑을 사용할 필요는 없을 것이고, 아두이노나 ESP32 보드 선에서 동작시킬 수 있을 것입니다. 아두이노는 시중에서 2만원정도면 구할 수 있지만, 데스크탑은 가격이 비쌉니다. 반대로 이야기하면 동작을 하는데, 적절한 보드를 선택해야한다는 것을 의미하고 이로 인한 제약조건이 부여됩니다.
3. 방에 불이 꺼지고 5초가 지나면 죽는 사람이 있다고 합시다. 그러면 센서에서 들어온 정보를 바탕으로 빛이 줄었음을 판단하고 전등을 켜는 과정이 5초보다 더 오랜 시간이 걸린다고 하면, 이 시스템은 망했다고 볼 수 있습니다. 극단적으로 예시를 들었지만 이는 자동차의 브레이크의 상황을 떠올려보면 됩니다. 그렇기에 임베디드 시스템에서는 실시간성이 중요합니다.
4. 높은 신뢰성입니다. 세 번째의 예시처럼 5초가 지나면 죽는 사람이 있다고 합시다. 이 시스템은 시간이 지날 수록 전등을 켜는 속도가 느려진다고 하면, 안될 겁니다. 그래서 주어진 조건에서 규정된 시간 내에 요구된 기능을 완료해낼 수 있는 성질을 말합니다.
임베디드 소프트웨어
일반적으로 하드웨어와 어플리케이션(소프트웨어)의 사이에 펌웨어가 들어갑니다. 여기서 임베디드 시스템에 내장된 운영체제와 펌웨어를 임베디드 소프트웨어라고 합니다. 그래서 하드웨어를 직접 제어하는 것을 임베디드 소프트웨어라고 합니다.
임베디드 시스템의 구성
임베디드 시스템은 기능이 정해진 목적에 따라 구성되어 전용의 동작을 하기 땝문에 동작 중에 기능이 변화하는 일은 없습니다.
임베디드에 들어가는 마이크로 컴퓨터는 다음으로 구성이 되어 있습니다.
1. CPU : 인간의 두뇌에 해당
2. 메모리 : 기억하기 위한 (ROM : 절차를 저장한 메모리 / RAM : 절차를 실행하기 위해 일시적으로 사용하는 메모리)
3. 주변장치 : 입출력을 담당
CPU
- 계산에 필요한 부품을 하나의 칩으로 합쳐놓은 것
- 주변장치의 추가로 기능을 늘릴 수 있다. 주변장치와 CPU는 버스(bus) 신호선에 접속되어 있다.
메모리
프로그램을 보관해 두기 위해 메모리가 필요하다. 프로그램 자체를 보관하여 CPU에 절차를 전달하기 위해 사용하는 메모리는 ROM이 있으며, CPU가 ROM으로 부터 읽어 들인 절차를 실행할 때 사용하는 RAM이 있다.
ROM
ROM 내부는 Address 인 구획이 있으며, 각 구획에 기계어의 명령이 보관된다. 프로그램을 실행할 때는 CPU로부터 읽어 내고 싶은 주소가 ROM에 건네지고, ROM은 그 주소에 적혀 있는 명령을 읽어 내서 CPU에 전달한다.
(마스크 ROM은 데이터를 바꿀 수 없고, 프로그래머블 ROM은 데이터를 바꿀 수 있다)
RAM
프로그램을 실행할 때 일시적으로 데이터의 보관이 필요할 경우에 사용된다.
(SRAM과 DRAM으로 나뉜다)
버스
메모리 등의 고속 주변장치는 CPU로부터 고속으로 제어하기 원하므로 고속으로 동작하는 메인버스에 접속한다
저속으로 동작하는 주변장치는 브리지를 경유하여 로컬버스에 접속한다.
메인버스
CPU와 메모리 또는 주변장치에 접속하기 위한 신호선으로 주소버스, 데이터버스, 컨트롤버스로 나뉜다.
- 주소버스 : 메모리나 주변장치에 접근할 특정 위치를 나타내기 위해 사용되는 신호선
- 데이터버스 : 메모리나 주변장치로부터 데이터를 읽어 들이기 위한 신호선으로 CPU로부터 입출력이 가능하다.
- 컨트롤버스 : 메모리나 주변장치를 제어하기 위한 신호선
버스신호는 클럭이라는 타이밍 신호에 동기화되어 CPU로부터의 지시대상이 되는 메모리나 주변장치에 지시를 전달한다.
로컬버스
메인버스의 클럭 속도보다도 저속으로 동작하는 주변장치를 제어하는 신호선으로 로컬 버스를 통해 많은 주변장치에 접속 할 수 있다.
브리지
메인버스와 로컬버스를 연결하는 컨트롤러로 고속으로 동작하는 메인 버스와 저속으로 동작하는 로컬 버스와의 속도차를 통제해주는 하드웨어다. 저속의 로컬 버스로부터의 데이터를 관리하고 고속의 메인 버스 타이밍에 맞추어 데이터를 송수신해주는 하드웨어다.
UART
동기식 직렬 신호를 병렬 신호로 또는 역으로 병렬 신호를 직렬 신호로 변환하는 하드웨어로서 로컬 버스에 접속된다. CPU로부터 데이터를 송신할 때는 UART에 의해 8~16비트의 폭으로 데이터가 병렬 전송된다. 이를 직렬의 데이터 신호로 변환하여 직렬 신호를 송신한다. 이를 수신할 때는 위에서 했던 작업을 역으로 한다.
UART끼리의 통신은 비동기 직렬 통신을 처리한다.
I2C
시리얼 제어 버스로서 시리얼 클럭과 양방향 시리얼 데이터 2개의 신호선을 사용하여 통신하는 동기식 직렬 통신
SPI
시리얼을 제어하는 버스로서 시리얼클럭과 단방향의 시리얼 데이터 인, 시리얼 데이터 아웃의 세 가지 신호선으로 통신하는 동기식 직렬 통신이다. I2C보다 고속으로 통신할 수 있다.
주변장치
대다수의 주변장치는 레지스터라는 제어용 메모리를 사용하여 CPU로 부터 제어한다.
DMA
메모리에 엑세스하는 주변장치로 CPU를 사용하지 않고 메모리의 데이터를 읽고 쓴다. CPU와 작업이 충돌될 수 있기 때문에 버스 아비터가 이를 중재한다. DMA는 편리하지만 전송 시의 설정 내용이 잘못되면 큰 사고를 야기할 수 있다.
타이머
시간처리를 위해서 필수적인 주변장치로 카운터 라고 부르는 레지터에 주기 시간을 설정해서 주기 시간이 지나면 인터럽트하여 CPU에 통지한다. CPU는 인터럽트를 받아들여 프로그램을 동작시킨다.
RTC
시간을 관리하기 위한 주변장치로 전원이 켜 있는 동안은 매초 시간이 갱신된다.
GPIO
CPU가 외부로부터의 입력 및 출력을 범용으로 입출력할 수 있는 포트이다.
CPU의 구성
- 프로그램 카운터(PC) : ROM 내의 프로그램의 어디를 참고할지 관리하는 하드웨어로 다음에 실행해야할 명령을 읽을 위치를 CPU에 전달하는 역할
- 디코더 : 읽어 들인 명령어를 해독
- ALU : 연산을 실행하는 하드웨어
- 범용 레지스터 : CPU에 내장된 범용 메모리
- 시스템 레지스터 : CPU가 명령을 실행할 때에 이용하는 레지스터로 명령 레지스터, 주소 레지스터, 상태 레지스터 등으로 구성된