임베디드 시스템
Embedded System
내장형 체계. 기계장치를 사용하기 위해 기계 '내부에 탑재된' 컴퓨터를 뜻한다. 문자 그대로 이해하려면 애매한 뜻이지만 범용 컴퓨터의 반대말이라고 생각하면 개념을 이해하기 쉽다. 일반적으로 컴퓨터라 부르는 PC가 대표적 범용 컴퓨터이다. 문서작성, , 게임, 인터넷강의 수강, 그림그리기, 코딩 등등 수도 없이 많은 용도로 사용 가능하다. 반면 세탁기나 냉장고 등 가전제품에 들어가는 단일목적 컴퓨터를 임베디드 시스템이라 할 수 있다. 넓은 범주에서 정의하자면, '''특정 목적을 가지고''' 만들어진 프로그래밍 가능한 모든 컴퓨터를 의미한다. PC는 임베디드 시스템을 구축하는 데 사용되긴 하지만, 그 외에도 수많은 용도로 사용될 수 있으므로 그 자체로 임베디드 시스템은 아니다. 전화기, 냉장고, 텔레비전, FAX 등은 각자의 기능을 수행하기 위한 마이크로컨트롤러를 가지고 있으며, 이것들이 프로그래밍 가능할 경우 특수한 목적을 수행하기 위한 컴퓨터이므로 임베디드 시스템이라고 할 수 있다. 게임기도 넓은 관점에서 보면 '게임'이라는 단일화된 소프트웨어를 대상으로 만들어진 임베디드 시스템으로 분류할 수 있다.
성능은 일반 목적 컴퓨팅과 임베디드 컴퓨팅 양 쪽 모두에게 중요한 요소이긴 하지만, 임베디드의 경우 그것 말고도 신경써야 할 것들이 많다. 이 의미는, 임베디드 시스템은 일반 목적 컴퓨터에 비해 더 열악한 하드웨어 환경에서 더 정교하게 작동해야 한다는 뜻이다.
개발환경 구축, 부트로더 제작 및 적재, 임베디드 OS 제작 및 적재, 임베디드 응용 S/W 제작, 시험 순으로 진행되는 경우가 많다.
일단은 개발 환경부터 구축해야 한다. 2000년대 중반 이후 라즈베리 파이(컴퓨터), 자우루스, 팜톱 컴퓨터, V43, 인터넷 공유기 위의 OpenWRT 등 리눅스를 돌릴 수 있는 하드웨어가 저렴하게 공급되면서 이런 기기에서부터 임베디드 시스템 학습을 시작하는 경우가 많다. 그리고 크로스 컴파일러를 쓰기 위해 리눅스 PC나 리눅스 가상환경이 필요하다.
임베디드 OS를 활용해야 하기 때문에 리눅스 커널, Windows NT 커널 중 하나 정도는 커널 공부가 필요하다.
관련 S/W를 제작하기 위해서는 C 프로그래밍이 필수적이며, 심한 경우 어셈블리어를 다뤄야하는 경우도 존재한다.
기업에서 BSP(Board Support Package)를 위주로 하는 경우가 많다. 이는 펌웨어 개발 업무에 가깝다. 칩셋 회사들은 칩과 칩을 구동하기 위한 SW 패키지(BSP)를 대기업에 납품한다. RTOS나 임베디드 리눅스 및 부트로더가 포팅되어 있다.
워낙 사양이 낮기 때문에 외부 라이브러리를 들여올만한 공간이 거의 없다. 그래서 외부 라이브러리 없이 C언어 위주로 거의 다 직접 개발해서 쓰는 경우가 많다.
임베디드나 펌웨어 프로젝트에 있어서 여러 플랫폼에 포팅 가능해야 한다거나, 툴체인을 지원하지 않는다거나 하는 특수한 사정이 있으면 C언어를 사용하여 큰 규모의 소스코드를 작성해야 할 경우가 많다. 이런 경우 C언어인데도 불구하고 객체지향적인 설계를 배워야 모듈이나 레이어 사이의 혼잡을 피할 수 있다. 또 임베디드의 경우 C언어를 배운 다음에는 어셈블리어를 배워야 어셈블리어의 장점을 잘 살린 C언어 사용이 가능하다.
임베디드계에도 '코더'가 있다. 이들은 시간을 많이 소모하면 할 수 있는 소모적, 반복적인 일을 한다. 예를 들어 디바이스 드라이버의 작성을 다른 업체에 하청으로 맡긴 뒤 그 드라이버를 가져와 테스트만 한다든지, 다른 사람이 만든 드라이버를 디바이스에 적용하기 위해 컴파일만 한다든지, 디바이스가 잘 작동하나 테스트만 한다든지 하는 식이다.
저렴한 연습 장비가 없었던 2000년대 초반에는 PC 리눅스를 충분히 공부하기 전에는 임베디드 리눅스에 접근할 엄두도 못 냈다. 개발 보드가 수십만원씩 했기 때문이다. 2002년에는 PDA에 리눅스를 올리는 것만으로도 정부에서 지원을 받을 수 있었다. 그 당시에는 그런 건 아무나 못 하던 일이었기 때문이다.
1. 정의
내장형 체계. 기계장치를 사용하기 위해 기계 '내부에 탑재된' 컴퓨터를 뜻한다. 문자 그대로 이해하려면 애매한 뜻이지만 범용 컴퓨터의 반대말이라고 생각하면 개념을 이해하기 쉽다. 일반적으로 컴퓨터라 부르는 PC가 대표적 범용 컴퓨터이다. 문서작성, , 게임, 인터넷강의 수강, 그림그리기, 코딩 등등 수도 없이 많은 용도로 사용 가능하다. 반면 세탁기나 냉장고 등 가전제품에 들어가는 단일목적 컴퓨터를 임베디드 시스템이라 할 수 있다. 넓은 범주에서 정의하자면, '''특정 목적을 가지고''' 만들어진 프로그래밍 가능한 모든 컴퓨터를 의미한다. PC는 임베디드 시스템을 구축하는 데 사용되긴 하지만, 그 외에도 수많은 용도로 사용될 수 있으므로 그 자체로 임베디드 시스템은 아니다. 전화기, 냉장고, 텔레비전, FAX 등은 각자의 기능을 수행하기 위한 마이크로컨트롤러를 가지고 있으며, 이것들이 프로그래밍 가능할 경우 특수한 목적을 수행하기 위한 컴퓨터이므로 임베디드 시스템이라고 할 수 있다. 게임기도 넓은 관점에서 보면 '게임'이라는 단일화된 소프트웨어를 대상으로 만들어진 임베디드 시스템으로 분류할 수 있다.
2. 특징
성능은 일반 목적 컴퓨팅과 임베디드 컴퓨팅 양 쪽 모두에게 중요한 요소이긴 하지만, 임베디드의 경우 그것 말고도 신경써야 할 것들이 많다. 이 의미는, 임베디드 시스템은 일반 목적 컴퓨터에 비해 더 열악한 하드웨어 환경에서 더 정교하게 작동해야 한다는 뜻이다.
임베디드 시스템의 하드웨어는 성능이 열악하기 때문에 가장 압축된 코드만으로 최고의 효율을 낼 수 있어야 한다. 이는 실력 있는 코딩덕후가 아니라면 힘들다. IT 업계 중 가장 효율적인 코딩을 요구한다. 다른 분야에서는 그냥 '작동'하기만 하면 되지만 이쪽은 그렇게 짜면 프로그램이 느려져서 망한다. 같은 주제를 두고 응용프로그램 개발자가 작성한 코드와, 임베디드 개발자가 작성한 코드를 비교해보면 대개 임베디드 개발자가 작성한 코드 쪽이 압도적으로 간결하고 정갈한 경우가 많다. 업계 특성상 어쩔 수 없다.
목표 응용군에서의 제약사항을 고려해야 한다. 전자제품이라든가 여러 기계들이 고유의 목적을 위한 마이크로프로세서를 가지고 있게 되었지만, 그들이 가진 컴퓨팅 능력의 한계가 있다. 특히 마이크로프로세서가 단가 문제 등으로 상대적으로 작은 크기이거나 기능이 적거나 할 경우 한계가 크다. 여러 가전제품들에 임베디드 시스템을 넣기 위해선 프로그래밍의 최적화가 필요하다. 이 때문에 아직도 어셈블리어가 현역에서 돌아가는 것이며, 더 성능 좋은 알고리즘과 메모리 등의 자원 역시 절약의 필요성이 크다. 이 때문에 사용 가능한 프로그래밍 언어에도 제약이 많다. 대부분의 제품들은 C를 쓰며 대형 프로젝트에는 좀 더 나아가서 C++, 성능이 지나치게 부족한 하드웨어에는 어셈블리어를 쓴다. 여기에서 넘어가서 다른 기능을 제공하기 위해서라면 다른 언어가 쓰이곤 하지만[1] 대다수의 회사에서는 멀리 나가도 C/C++와 어셈블리어 예제만 던져주는 경우가 많다.
목표 응용군에서의 제약사항을 고려해야 한다. 전자제품이라든가 여러 기계들이 고유의 목적을 위한 마이크로프로세서를 가지고 있게 되었지만, 그들이 가진 컴퓨팅 능력의 한계가 있다. 특히 마이크로프로세서가 단가 문제 등으로 상대적으로 작은 크기이거나 기능이 적거나 할 경우 한계가 크다. 여러 가전제품들에 임베디드 시스템을 넣기 위해선 프로그래밍의 최적화가 필요하다. 이 때문에 아직도 어셈블리어가 현역에서 돌아가는 것이며, 더 성능 좋은 알고리즘과 메모리 등의 자원 역시 절약의 필요성이 크다. 이 때문에 사용 가능한 프로그래밍 언어에도 제약이 많다. 대부분의 제품들은 C를 쓰며 대형 프로젝트에는 좀 더 나아가서 C++, 성능이 지나치게 부족한 하드웨어에는 어셈블리어를 쓴다. 여기에서 넘어가서 다른 기능을 제공하기 위해서라면 다른 언어가 쓰이곤 하지만[1] 대다수의 회사에서는 멀리 나가도 C/C++와 어셈블리어 예제만 던져주는 경우가 많다.
- 복잡한 알고리즘
마이크로프로세서에 의해 수행되는 명령은 아주 정교해야 하는 경우가 있다. 예를 들어 자동차를 컨트롤하는 ECU 마이크로프로세서의 경우, 차의 연비를 높이면서 오염을 최소화함과 동시에 차의 퍼포먼스를 높이기 위한 복잡한 필터링을 수행해야 한다.
- GUI 유저 인터페이스
여러 선택지를 가진 유저 인터페이스를 컨트롤하기 위해 자주 사용된다. GPS를 사용한 내비게이션이 복잡한 유저 인터페이스의 좋은 예이다. 임베디드 시스템 GUI를 디자인 하기 위한 비주얼 빌더가 IDE 별로 내장되어 있다. 프로그래밍 언어와 바인드된 전용 UI/UX 디자인 빌더 및 XML등의 디자인 언어가 별개인 경우와, declarative UI와 같이 하나의 프로그래밍 언어에서 디자인 클래스까지 하나로 통합되어 가고 있는 추세이며 프로그래과 UI/UX 디자인이 분리되는 것이 아닌 프로그래밍이 UI/UX를 지배해 가고 있다. 거기에 UI/UX의 그래픽 디자인 요소역시 동일한 프로그래밍 언어에 의해 결합되어 별개의 테마 패키지로 추가 시키고 있다.
- 실시간 처리 지원
많은 임베디드 시스템의 경우 실시간으로 수행되는 것이 중요하다. 만약 어떤 데이터가 데드라인 안에 준비되지 못한다면 시스템이 멈춘다. 1997년 화성에 착륙한 탐사선 마스 패스파인더는 착륙 후 화성의 기상 정보를 지구로 전송하는 과정에서 우선 순위의 역전이 생기는 바람에 데이터들이 제 시간 안에 처리되지 못했고, 이상을 감지한 시스템은 스스로를 리셋했다. 이후 다시 기상 정보를 수집해 지구로 보내는 과정에서 같은 일이 반복해서 발생하면서 탐사 임무를 제대로 수행하지 못한 일이 발생한 적이 있다. #1 이런 문제를 줄이기 위해 많은 임베디드 시스템은 실시간 운영 체제(RTOS)를 사용한다. 실시간 운영체제로는 Nucleus, VxWorks, VRTX 등이 있다.[2]
- 멀티레이트(Multirate)
이 실시간 작업은 하나만 수행되는 게 아니라 여러 개가 동시에 일어나기도 한다. 임베디드 시스템은 어떤 것들은 slow rate로, 어떤 것들은 fast rate로 수행되도록 동시에 컨트롤해야 한다. 멀티미디어를 예로 들면, 스트리밍되는 오디오 부분과 비디오 부분은 서로 rate가 다르지만, 반드시 동기화되어야 한다.
- 하드웨어 지식
펌웨어를 포함하는 임베디드 시스템은 시스템 회로에 대한 지식이 필수 적이다. 임베디드 프로그램 파트와 회로 파트의 업무가 분리되어 있는 경우가 있는데 주로 회로 파트의 경력을 거쳐 펌웨어 임베디드 시스템으로 범위를 넓혀가는 것이 정석이다. 즉, 하드웨어/펌웨어/소프트웨어디자인을 모두 섭렵한 사람만이 진정한 총괄 디렉터로서 임베디드 시스템 디자인이 가능하다.
3. 개발 절차
개발환경 구축, 부트로더 제작 및 적재, 임베디드 OS 제작 및 적재, 임베디드 응용 S/W 제작, 시험 순으로 진행되는 경우가 많다.
일단은 개발 환경부터 구축해야 한다. 2000년대 중반 이후 라즈베리 파이(컴퓨터), 자우루스, 팜톱 컴퓨터, V43, 인터넷 공유기 위의 OpenWRT 등 리눅스를 돌릴 수 있는 하드웨어가 저렴하게 공급되면서 이런 기기에서부터 임베디드 시스템 학습을 시작하는 경우가 많다. 그리고 크로스 컴파일러를 쓰기 위해 리눅스 PC나 리눅스 가상환경이 필요하다.
임베디드 OS를 활용해야 하기 때문에 리눅스 커널, Windows NT 커널 중 하나 정도는 커널 공부가 필요하다.
관련 S/W를 제작하기 위해서는 C 프로그래밍이 필수적이며, 심한 경우 어셈블리어를 다뤄야하는 경우도 존재한다.
4. 소프트웨어
- 부트로더: 하드웨어 초기화, 커널 부팅, 명령처리 등을 담당한다. 목적은 리눅스 커널 부팅 이전에 미리 실행되면서 커널이 올바르게 부팅되기 위해 필요한 모든 관련 작업을 마무리하고 최종적으로 리눅스 커널을 부팅시키는 것이다. 부트로더의 명령어는 보드마다 조금씩 다르지만 대체로 비슷하다. 대개 하드웨어 제조사에서 제공한다.
- 커널: 운영 체제를 이루는 핵심적 소프트웨어. 특히 리눅스 커널에 대해 아는 프로그래머가 중요하다.
- 루트 파일 시스템
- 디바이스 드라이버
- 하드웨어 제어 프로그래밍
5. 관련 용어
- 메시지 큐: 프로세스 간에 적은 양의 데이터를 구조화된 방식으로 넘겨주는 데 사용하며, 하나 이상의 프로세스가 메시지를 사용하고, 사용된 메시지를 하나 이상의 프로세스가 읽을 수 있도록 하는 기능이다.
- Controller Area Network (CAN): 자동차 제어 시스템에 사용할 목적으로 개발된 것으로, 높은 잡음 면역력, 오류 감지 및 처리, 손실 패킷의 재전송 등의 특징을 갖는 두 가닥 직렬 네트워크이다.
- 스택(자료구조): 임베디드 시스템에서 인터럽트가 발생했을 때, 프로세서의 현재 상태와 레지스터 값을 보존하기 위해 일반적으로 사용하는 자료구조.
6. 기업에서
기업에서 BSP(Board Support Package)를 위주로 하는 경우가 많다. 이는 펌웨어 개발 업무에 가깝다. 칩셋 회사들은 칩과 칩을 구동하기 위한 SW 패키지(BSP)를 대기업에 납품한다. RTOS나 임베디드 리눅스 및 부트로더가 포팅되어 있다.
워낙 사양이 낮기 때문에 외부 라이브러리를 들여올만한 공간이 거의 없다. 그래서 외부 라이브러리 없이 C언어 위주로 거의 다 직접 개발해서 쓰는 경우가 많다.
임베디드나 펌웨어 프로젝트에 있어서 여러 플랫폼에 포팅 가능해야 한다거나, 툴체인을 지원하지 않는다거나 하는 특수한 사정이 있으면 C언어를 사용하여 큰 규모의 소스코드를 작성해야 할 경우가 많다. 이런 경우 C언어인데도 불구하고 객체지향적인 설계를 배워야 모듈이나 레이어 사이의 혼잡을 피할 수 있다. 또 임베디드의 경우 C언어를 배운 다음에는 어셈블리어를 배워야 어셈블리어의 장점을 잘 살린 C언어 사용이 가능하다.
임베디드계에도 '코더'가 있다. 이들은 시간을 많이 소모하면 할 수 있는 소모적, 반복적인 일을 한다. 예를 들어 디바이스 드라이버의 작성을 다른 업체에 하청으로 맡긴 뒤 그 드라이버를 가져와 테스트만 한다든지, 다른 사람이 만든 드라이버를 디바이스에 적용하기 위해 컴파일만 한다든지, 디바이스가 잘 작동하나 테스트만 한다든지 하는 식이다.
7. 시험 출제
- 독학학위제 정보통신학과 3단계 과목 '임베디드 시스템'
- 임베디드기사: 2013년부터 시행되기 시작했다. 2016년 필기에 150명이 응시하여 실기에 4명이 합격하였다. 과목은 임베디드 하드웨어, 임베디드 펌웨어, 임베디드 플랫폼, 임베디드 소프트웨어.
- LG이노텍 입사 면접에서는 '임베디드 시스템'이 무엇인지 설명하라는 질문이 나온 적이 있다.
- 한 대학의 기말고사에서는 시험장에 들어가니 칠판에 카메라소자 이름만 덜렁 적혀있고, 그 이름만 가지고 검색해서 스펙시트만 갖고 제어가 되는 디바이스 드라이버를 만들어서 제출하라는 게 과제였다.[3] 사진이 찍히면 A+, 안 찍히면 C+를 주었다. 매년 무수히 많이 쏟아져 나오는 각종 소자들 중에 가장 시장에서 실패한(가장 인터넷에서 자료 찾기 힘든) 소자를 골라내는 게 시험 출제의 전부라고 한다.
8. 역사
저렴한 연습 장비가 없었던 2000년대 초반에는 PC 리눅스를 충분히 공부하기 전에는 임베디드 리눅스에 접근할 엄두도 못 냈다. 개발 보드가 수십만원씩 했기 때문이다. 2002년에는 PDA에 리눅스를 올리는 것만으로도 정부에서 지원을 받을 수 있었다. 그 당시에는 그런 건 아무나 못 하던 일이었기 때문이다.
[1] 안드로이드 기능을 연결해서 쓰기위해 안드로이드 보드를 쓴다던가. 보통 이 경우에는 별도의 임베디드 보드와 안드로이드 기능만을 위한 보드를 별도로 쓰고 둘을 통신으로 이어주는 경우가 많다.[2] 리눅스는 '임베디드 시스템 운영체제'는 맞지만 '실시간 임베디드 운영체제'는 아니다.[3] 드라이버를 다운받으라는 이야기가 아니다!