최근 수정 시각 : 2018-06-18 23:03:49

임베디드 시스템

파일:나무위키프로젝트.png
이 문서는 나무위키 컴퓨터 프로젝트에서 다루는 문서입니다.
해당 프로젝트 문서를 방문하여 도움이 필요한 문서에 기여하여 주세요!

Embedded System
1. 정의2. 특징3. 개발 절차4. 소프트웨어
4.1. 커널
5. 관련 용어6. 임베디드 프로그래머 실무자의 업무7. 시험 출제

1. 정의

넓은 범주에서 정의하자면, 특정 목적을 가지고 만들어진 프로그래밍 가능한 모든 컴퓨터를 의미한다. PC는 임베디드 시스템을 구축하는 데 사용되긴 하지만, 그 외에도 수많은 용도로 사용될 수 있으므로 그 자체로 임베디드 시스템은 아니다. 전화기, 냉장고, 텔레비전, FAX 등은 각자의 기능을 수행하기 위한 마이크로컨트롤러를 가지고 있으며, 이것들이 프로그래밍 가능할 경우 특수한 목적을 수행하기 위한 컴퓨터이므로 임베디드 시스템이라고 할 수 있다. 게임기도 넓은 관점에서 보면 '게임'이라는 단일화된 소프트웨어를 대상으로 만들어진 임베디드 시스템으로 분류할 수 있다.

2. 특징

성능은 일반 목적 컴퓨팅과 임베디드 컴퓨팅 양 쪽 모두에게 중요한 요소이긴 하지만, 임베디드의 경우 그것 말고도 신경써야 할 것들이 많다. 이 의미는, 임베디드 시스템은 일반 목적 컴퓨터에 비해 더 열악한 하드웨어 환경에서 더 정교하게 작동해야 한다는 뜻이다.
  • 개발자의 코딩실력
    IT업계에선 당연히 코딩이 중요하지만, 임베디드 시스템쪽은 특히 중요하다. 컴퓨터공학과, 정보통신공학과에서 진출할 수 있는 업계 중 가장 뛰어난 코딩 실력이 요구되는 곳이 바로 임베디드 시스템 분야다. 다른 분야의 경우엔 어떻게든 '작동하기만 하면 된다'라고 퉁 치고 넘어갈 수 있지만, 임베디드쪽은 하드웨어 성능 자체가 워낙 열악하기 때문에 최고의 효율을 낼 수 있도록 코딩해야한다. 단순히 '작동'하는 코드를 짜는게 아니라, '최고의 효율' '최고로 압축된' 코드를 짜야하기 때문에 어지간한 코딩덕후가 아니라면 힘들다. 같은 주제를 두고 응용프로그램 개발자가 작성한 코드와, 임베디드 개발자가 작성한 코드를 비교해보면 대개 임베디드 개발자가 작성한 코드쪽이 압도적으로 간결하고 아름다운 경우가 많다. 업계 특성상 어쩔 수 없다.
  • 복잡한 알고리즘
    마이크로프로세서에 의해 수행되는 명령은 아주 정교해야 하는 경우가 있다. 예를 들어 자동차를 컨트롤하는 ECU 마이크로프로세서의 경우, 차의 연비를 높이면서 오염을 최소화함과 동시에 차의 퍼포먼스를 높이기 위한 복잡한 필터링을 수행해야 한다.
  • 유저 인터페이스
    여러 선택지를 가진 유저 인터페이스를 컨트롤하기 위해 자주 사용된다. GPS를 사용한 네비게이션이 복잡한 유저 인터페이스의 좋은 예이다.
여기다 임베디드 시스템을 더 복잡하게 만들기 위해(?) 일정 시간 안에 수행되어야 하는 데드라인을 만들기도 한다.
  • 실시간 처리 지원
    많은 임베디드 시스템의 경우 실시간으로 수행되는 것이 중요하다. 만약 어떤 데이터가 데드라인 안에 준비되지 못한다면 시스템이 멈춘다. 1997년 화성에 착륙한 탐사선 마스 패스파인더는 착륙 후 화성의 기상 정보를 지구로 전송하는 과정에서 우선 순위의 역전이 생기는 바람에 데이터들이 제 시간 안에 처리되지 못했고, 이상을 감지한 시스템은 스스로를 리셋했다. 이후 다시 기상 정보를 수집해 지구로 보내는 과정에서 같은 일이 반복해서 발생하면서 탐사 임무를 제대로 수행하지 못한 일이 발생한 적이 있다. #1 이런 문제를 줄이기 위해 많은 임베디드 시스템은 실시간 운영 체제(RTOS)를 사용한다. 실시간 운영체제로는 Nucleus, VxWorks, VRTX 등이 있다.[1]
  • 멀티레이트(Multirate)
    이 실시간 작업은 하나만 수행되는 게 아니라 여러 개가 동시에 일어나기도 한다. 임베디드 시스템은 어떤 것들은 slow rate로, 어떤 것들은 fast rate로 수행되도록 동시에 컨트롤해야 한다. 멀티미디어를 예로 들면, 스트리밍되는 오디오 부분과 비디오 부분은 서로 rate가 다르지만, 반드시 동기화되어야 한다.
  • 최적화(optimization): 목표 응용군에서의 제약사항 고려
    전자제품이라든가 여러 기계들이 고유의 목적을 위한 마이크로프로세서를 가지고 있게 되었지만, 그들이 가진 컴퓨팅 능력의 한계가 있을 수 있다. 마이크로프로세서가 단가 문제 등으로 상대적으로 작은 크기이거나 기능이 적거나 할 경우. 여러 가전제품들에 임베디드 시스템을 넣기 위해선 프로그래밍의 최적화가 필요하다. 이 때문에 아직도 어셈블리어가 현역에서 돌아가는 것이며, 더 성능 좋은 알고리즘과 메모리 등의 자원 역시 절약의 필요성이 크다. 이 때문에 사용 가능한 프로그래밍 언어에도 제약이 많을 수 있다. 대부분의 제품들은 보통 어셈블리어 혹은 C를 쓰며 대형 프로젝트에는 좀 더 나아가서 C++을 쓴다. 여기에서 넘어가서 다른기능을 제공하기 위해서라면 다른언어가 쓰이곤 하지만[2] 대다수의 회사에서는 멀리나가도 C와 어셈블리어 예제만 던져주는 경우가 많다.

3. 개발 절차

임베디드 시스템의 개발 절차를 간략히 소개하자면 개발환경 구축, 부트로더 제작 및 적재, 임베디드 OS 제작 및 적재, 임베디드 응용 S/W 제작, 시험 순으로 진행되는 경우가 많다.

일단은 개발 환경부터 구축해야 한다. 저렴한 연습 장비가 없었던 2000년대 초반에는 PC 리눅스를 충분히 공부하기 전에는 임베디드 리눅스에 접근할 엄두도 못 냈다. 개발 보드가 수십만원씩 했기 때문이다. 대개 라즈베리 파이인터넷 공유기 위의 OpenWRT 등 저렴하면서도 리눅스를 돌릴 수 있는 하드웨어부터 시작하는 경우가 많다. 그리고 크로스컴파일러[3]를 쓰기 위해 리눅스 PC가 필요하다. 없을 경우 가상환경이라도 좋으니 리눅스 PC가 필요하다.[4]

임베디드 OS를 활용해야 하기 때문에 리눅스와 윈도우 중 하나는 운영 체제에 대해 커널 수준까지 깊은 공부가 필요하다. 그리고 관련 S/W를 제작하기 위해서는 C/C++ 프로그래밍이 필수적이다.

4. 소프트웨어

  • 부트로더: 하드웨어 초기화, 커널 부팅, 명령처리 등을 담당한다. 목적은 리눅스 커널 부팅 이전에 미리 실행되면서 커널이 올바르게 부팅되기 위
해 필요한 모든 관련 작업을 마무리하고 최종적으로 리눅스 커널을 부팅시키는 것이다. 부트로더의 명령어는 보드마다 조금씩 다르지만 대체로 비슷하다. 대개 하드웨어 제조사에서 제공한다.
  • 커널: 운영체계를 이루는 핵심적 소프트웨어
  • 루트 파일 시스템
  • 디바이스 드라이버
    • 문자 (character) 디바이스: open, close, read, write 같은 시스템 콜로 구현한다. 바이트 단위로 입출력한다는 점은 파일과 같으나, 문자 디바이스는 데이터 채널로서 순차적으로만 접근 가능하다는 점이 파일 시스템과 다르다. 블록과 네트워크는 전문적인 곳 위주로 작성되고, 실제로 일반 프로그래머가 작성하는 것은 문자 디바이스가 대부분이다. 터치 스크린의 디바이스 드라이버는 이쪽에 속한다.
    • 블록 디바이스
    • 네트워크 디바이스
  • 하드웨어 제어 프로그래밍

4.1. 커널

Linux Kernel module 개발 방법은 module_init, module_exit 매크로에 function을 연결해 두면 insmod 와 rmmod 로 각 function이 호출되어 동작되며 이 모듈 구조를 가지고 커널 드라이버가 작성된다.

USB 디바이스 드라이버 작성시 module_init 과 연결된 function에서 usb 디바이스를 만들어 usb_register()를 통해 OS 서브 시스템에 등록을 해야 한다. 여기서 등록된 probe 함수는 디바이스가 연결되었을 때 디바이스를 초기화 해주고 통신할 수 있도록 하부 드라이버에게 알려주는 역할을 수행한다. Linux 의 경우 호스트와 디바이스간 연결 설정은 클라이언트 드라이버 의해서 연결되는 것이 아니라 하부 시스템(USB host controller driver 와 USB core)에 의해서 이뤄진다. 즉 디바이스가 허브 포트에서 감지된 이후 하부 시스템이 각 디바이스의 Configuration 디스크립터를 요청하고 디스크립터 내의 Interface 와 EndPoint 정보를 이용하여 디바이스와 최종 연결설정 요청을 완료하게 되고, 이 연결 설정 과정이 완료(Set-Configuration)가 되면 Probe 함수가 비로소 호출되게 된다. 만약 이러한 디스크립터 정보가 완전하게 정상적으로 송수신이 안 되는 경우의 예외처리 부분은 모두 하위 시스템에게 위임을 해야 한다. 하부 시스템에서 디스크립터 데이터의 무결성을 위해 어느 정도 예외처리를 수행하고는 있다. 하지만 어떤 경우에는 연결설정을 정상 완료시켜 버린다. 이 경우 디바이스단 펌웨어는 정상적으로 연결설정이 된 것으로 인식 되지만 호스트 시스템에서는 연결 설정이 완료되었지만 하부시스템은 예외처리로 인해 인터페이스가 존재하지 않는 것을 파악 했기 때문에 probe 함수가 수행되지 못하게 되어 결국 애플리케이션에서는 디바이스에 대한 핸들 얻기가 실패하게 된다. 즉 연결은 정상 수행되었지만 호스트에서는 통신 수행이 불가능하고, 디바이스에서는 통신 요청을 대기하고 있는 상태 불일치 장애 상황이 지속되게 된다. 따라서 이러한 예외가 발생한 경우 Linux USB 클라이언트 드라이버에서의 통신 예외처리는 커널을 수정하지 않고는 불가능하다. [5]

5. 관련 용어

  • 메시지 큐: 프로세스 간에 적은 양의 데이터를 구조화된 방식으로 넘겨주는 데 사용하며, 하나 이상의 프로세스가 메시지를 사용하고, 사용된 메시지를 하나 이상의 프로세스가 읽을 수 있도록 하는 기능이다.
  • Controller Area Network (CAN): 자동차 제어 시스템에 사용할 목적으로 개발된 것으로, 높은 잡음 면역력, 오류 감지 및 처리, 손실 패킷의 재전송 등의 특징을 갖는 두 가닥 직렬 네트워크이다.
  • 스택 (stack): 임베디드 시스템에서 인터럽트가 발생했을 때, 프로세서의 현재 상태와 레지스터 값을 보존하기 위해 일반적으로 사용하는 자료구조.

6. 임베디드 프로그래머 실무자의 업무

대기업은 BSP 위주로 하는 경우가 많다. 이는 Firmware 업무에 가깝다. 칩셋 회사들은 칩과 칩을 구동하기 위한 SW 패키지 (BSP)를 대기업에 납품한다. RTOS나 임베디드 리눅스 및 부트로더가 포팅되어 있다.

C 위주로 외부 라이브러리 없이 거의 다 직접 개발해서 쓰는 경우가 많다. 워낙 사양이 낮기 때문에 외부 라이브러리를 들여올만한 공간이 없는 경우가 많아서 그렇다.

7. 시험 출제

  • 독학학위제 정보통신학과 3단계 과목 '임베디드 시스템'
  • 임베디드 기사: 2013년부터 시행되기 시작했다. 2016년 필기에 150명이 응시하여 실기에 4명이 합격하였다. 과목은 임베디드 하드웨어, 임베디드 펌웨어, 임베디드 플랫폼, 임베디드 소프트웨어.
  • LG이노텍 입사 면접에서는 '임베디드 시스템'이 무엇인지 설명하라는 질문이 나온 적이 있다.
  • 한 대학의 기말고사에서는 시험장에 들어가니 칠판에 카메라소자 이름만 덜렁 적혀있고, 그 이름만 가지고 검색해서 드라이버를 만들어서 제출한 후에 사진이 찍히면 A+, 안 찍히면 C+를 주었다. 매년 무수히 많이 쏟아져 나오는 각종 소자들 중에 가장 시장에서 실패한(가장 인터넷에서 자료 찾기 힘든) 소자를 골라내는 게 시험 출제의 전부라고.


[1] 리눅스는 '임베디드 시스템 운영체제'는 맞지만 '실시간 임베디드 운영체제'는 아니다.[2] 안드로이드 기능을 연결해서 쓰기위해 안드로이드 보드를 쓴다던가. 보통 이경우에는 별도의 임베디드 보드와 안드로이드 기능만을 위한 보드를 별도로 쓰고 둘을 통신으로 이어주는 경우가 많다.[3] 임베디드 시스템 개발 툴을 설치한 시스템에서, 고급 언어로 작성된 임베디드 시스템 응용 프로그램이 실행될 수 있는 코드로 컴파일해 주는 도구이다.[4] 임베디드 기기에서 직접 컴파일을 시도할 경우 이론적으로는 가능하지만 너무 느려서 한세월 걸린다. 참고로 공유기 하드웨어는 486~586 수준밖에 안 된다.[5] 관련 학술발표: Linux 및 MS-Windows 기반 USB 디바이스 드라이버 작성시 통신 안정성 향상을 위한 고려 사항 연구

분류