**임베디드 시스템**은 기계나 기타 제어가 필요한 시스템에 대해, 제어를 위한 특정 기능을 수행하는 컴퓨터 시스템이자 장치 내에 존재하는 전자 시스템이다. 즉, 임베디드 시스템은 전체 장치의 일부분으로 구성되며 제어가 필요한 시스템을 위한 두뇌 역할을 하는 '특정 목적의 컴퓨터 시스템'이다. 개인용 컴퓨터와 같은 특정되지 않는 일반적인 목적을 수행하는 '범용 시스템'과 대비된다. 특정 목적을 수행하는 컴퓨터 시스템이므로 목적을 설정하고 이를 수행하는 프로그램 코드를 작성하여 메모리에 기록하고 이를 읽어들여 동작시키는 방법이 일반적이다.

전자 하드웨어와 기계 부분을 포함하는 전체 장치의 일부로 소프트웨어가 내장되었다는 의미에서 **임베디드**라는 단어가 사용되었다. 임베디드 시스템은 오늘날 일상 생활에 쓰이는 많은 장치들을 제어하고 있다.

전자 시스템을 통해 특정 기능을 수행하는 컴퓨터 시스템이며, 종종 실시간(real-time computing) 계산을 행하는 데 있어 제약을 갖는다.

임베디드 시스템에는 마이크로컨트롤러(microcontroller)나 DSP(digital signal processor) 등의 프로세서 코어가 장착될 수 있다.

마이크로컨트롤러는 규모가 작은 시스템에 사용하므로 보통 운영 체제를 포함하지 않는 경향이 있다면, 임베디드는 좀 더 규모가 크기 때문에 운영 체제가 시스템에 포함된다. 이 운영체제 위에 특수한 기능만을 수행하도록 응용 프로그램이 장착되어 동작하는 경향이있다. 예를 들어 같은 ARM이라도 마이크로컨트롤러는 한 칩에 메모리을 포함하고 기타 하드웨어를 포함한다. 여기서 메모리는 용량이 크지 않기 때문에 운영체제를 포함하기에는 한계가 있다. 그러나 임베디드 시스템에서는 하드웨어는 한 칩내에 장착하지만, 칩 밖에 많은 용량의 메모리를 장착하고 PCB에서 연결하는 것이 일반적이다. 이것은 시스템이 크기 때문에 용량이 큰 메모리를 시스템에 장착할 필요성이 있기 때문이다.

일반적으로 "임베디드 시스템"이란 용어는 엄밀하게 정의된 것은 아닌 것이, 대부분의 시스템은 어느 정도의 확장성 또는 재프로그램 능력을 갖추고 있다. 예를 들어 수첩형 컴퓨터는 임베디드 시스템과 유사한 운영 체제와 마이컴을 사용할 수 있지만, 다른 응용 프로그램을 읽어들이거나 다른 주변장치를 연결하는 것이 허용된다. 더 나아가서 재프로그램성을 주요 기능으로 드러내지 않는 시스템도 보통 소프트웨어 갱신을 지원할 필요가 있다. "범용" 과 "임베디드" 사이의 연속체 속에서 대형 응용 시스템은 한두 가지 기능 전용으로 설계되었다 하더라도 부품 수준에서 범용 요소를 대부분 가지고 있다.

개인용 컴퓨터는 하드 디스크와 같은 대용량 저장장치에 운영 체제를 내장하고 있다. 그에 반해, 임베디드 시스템은 운영 체제와 응용 프로그램들이 롬(플래시)에 이미지 형태로 저장되어 있다가 시동과 동시에 램 디스크를 만든 다음, 램 디스크 위에 운영 체제와 응용 프로그램들이 구성되고 구동되는 시스템도 있다.

## 역사
최초의 현대의 임베디드 시스템 가운데 하나는 MIT 인스트루멘테이션 연구소의 찰스 스타크 드레이퍼가 개발한 아폴로 가이던스 컴퓨터였다. 당시에 크기와 무게를 줄이기 위해 새로 개발된 모놀리딕 집적 회로를 도입했기 때문에 아폴로 프로젝트에서 이 아폴로 가이던스 컴퓨터는 가장 위험한 물건으로 취급되었다. 초기 대량 생산된 임베디드 시스템은 1961년에 출시된 미니트맨 미사일용 오토네틱스 D-17 가이던스 컴퓨터였다. 미니트맨 II가 1966년 생산을 시작했을 때, D-17은 최초의 고용량 이용 집적 회로였던 새로운 컴퓨터로 교체되었다.

## 임베디드 다양성과 경향성
임베디드 시스템은 하나 이상의 주 처리 코어로 제어되는데, 이 코어는 보통 마이크로콘트롤러 또는 디지털 신호 처리 장치이다. 그러나 특정 임무 전용으로 사용되며, 때로 매우 강력한 연산능력이 요구될 수도 있다. 예를 들어 항공 관제 시스템도 임베디드 시스템으로 보는 것이 유용할 수도 있다. 비록 대형 컴퓨터와 공항, 레이다 망을 잇는 지역 또는 전국 전산망도 동원되지만 말이다. (각각의 레이다는 한 두개씩의 임베디드 시스템을 가지고 있을 것이다.)

임베디드 시스템은 특정 임무에 전념하기 때문에 설계자들이 최적화하여 그 크기와 생산 비용을 줄이고 신뢰성과 성능을 향상시킬 수 있다. 어떤 임베디드 시스템은 대량생산되어 규모의 경제로부터 득을 보기도 한다.

외형적으로 임베디드 시스템의 범위는 들고 다닐 수 있는 디지털 시계와 MP3 재생장치부터 커다란 고정 설비, 예를 들어 교통 신호등, 공장 제어 장치, 또는 원자력 발전소 제어 시스템에 이른다. 복잡성도 다양하여 간단히 한개의 마이컴만 사용한 것부터 매우 복잡한, 여러 단위와 주변장치, 네트워크를 갖추고 큰 캐비넷 안에 설치되는 것도 있다.

## 특징
임베디드 시스템은 대개 저가로 선택된 기능만을 수행하도록 설계되어 있으며, 몇몇 기능은 매우 빠른 처리가 필요하며, 다른 기능들은 대부분 속도를 중요하게 여기지 않는 경우가 많다.

그래서 흔히 임베디드 시스템의 많은 부품들은 성능이 낮은 것들이다. 여기서 느리다는 것은 단지 클럭 속도만을 뜻하는 것은 아니다. 임베디드 시스템의 전체 구조는 단가를 낮추기 위해 범용 컴퓨터 시스템의 하드웨어에 비해 의도적으로 단순화되어 있다. 예를 들어, 임베디드 시스템은 개인용 컴퓨터에서 쓰이는 일반 주변장치 인터페이스에 비해 10배 정도는 느린 직렬 버스 방식으로 제어되는 주변 장치를 사용하는 경우가 많다.

많은 임베디드 시스템이 수백만 개 규모로 양산되기 때문에, 생산 비용을 줄이는 것이 주요 관심사 중 하나일 수밖에 없다. 몇몇 임베디드 시스템들은 대단한 처리 성능과 자원을 필요로 하지 않기 때문에, 그러한 시스템에는 (상대적으로) 느린 프로세서와 작은 크기의 메모리를 탑재하여 비용을 절감할 수 있다.

하드웨어 장치의 롬이나 플래시 메모리에 내장하는 소프트웨어를 일러 펌웨어라 한다. 임베디드 시스템 상의 프로그램은 대개 제한된 하드웨어 자원 위에서 실시간(real-time) 제약 조건을 가지고 동작한다. 시스템 상에 디스크 드라이브나 운영 체제, 키보드나 화면이 없는 경우도 많다. 파일 시스템을 가지고 있지 않을 수도 있으며, 플래시 드라이브를 저장 매체로 사용할 수도 있다. 사용자 인터페이스가 있다 하더라도 조그마한 키패드거나 LCD 정도일 수 있다.

임베디드 시스템은 여러 해에 이르는 오랜 기간 동안 오류 없이 안정적으로 돌아가도록 설계된다. 따라서 펌웨어는 개인용 컴퓨터에서 쓰이는 소프트웨어보다 신중한 개발과 테스트 과정을 거친다. 대부분의 임베디드 시스템은 디스크 드라이브나 스위치, 버튼 등 기계적인 동작으로 손상을 입을 수 있는 부품의 사용을 피하고 대신 플래시 메모리 같은 물리적 손상에서 비교적 자유로운 칩 자재를 사용한다.

또한 임베디드 시스템이 적용되는 분야는 석유 시추공, 우주공간 등 인간이 직접 즉각적인 제어를 하기 어려운 장소일 수 있다. 따라서 임베디드 시스템은 최악의 상황에서도 스스로 다시 기동할 수 있어야 한다. 이러한 응급 복구는 소프트웨어가 주기적으로 타이머를 건드리지 않으면 컴퓨터를 초기화시키는 왓치독 타이머라고 불리는 전자 부품을 통해 이루어진다.

## 플랫폼
임베디드 시스템에서 큰 흐름 가운데 하나는 특정 적용 분야에 맞는 IC들을 하나의 CPU 칩에 집적시킴으로써 별도의 주변 장치용 칩을 보드 위에 달지 않아도 되도록 하는 시스템 온 칩 기술이다.

임베디드 시스템에는 ARM, MIPS, 콜드파이어/68K, PowerPC, x86, PIC 마이크로컨트롤러, 8051 등 많은 다양한 CPU 아키텍처가 사용된다. 이러한 점이 **데스크톱 컴퓨터**(개인용 컴퓨터) 시장과는 대별되는 점이다.

2003년 기준으로, 데스크톱 컴퓨터 시장에선 인텔/IBM x86이나 애플의 매킨토시에서 사용되는 모토로라/IBM PowerPC만이 경쟁 아키텍처이다.

2006년을 기준, CPU 아키텍처에서는 ARM 코어가 가장 강세이다. 이 밖에도 400여개 이상의 임베디드 시스템에 쓰이는 코어가 있다. 인텔 8051, PIC 마이크로컨트롤러, AVR(ARM 코어 사용) 8비트 등이 시장에서 가장 많이 사용되는 종류이다.

### ARM
ARM은 보통 8비트에 비해 고성능에 많이 사용한다. 따라서 리눅스 커널을 포팅하여 많이 사용한다. OS를 탑재하기 위해 ARM 칩 외부에 RAM이나 FLASH을 PCB 상에 장착한다. 리눅스 개발에 필요한 요소와 ARM과 결합하여 소프트웨어 및 하드웨어가 개발되는 경우가 일반적이다.

ARM-코어, FLASH, 그리고 RAM을 한 칩에 만들어지면 리눅스 포팅이 힘들어져 OS없이 전체 시스템을 C언어 등을 동원하여 요구 동작에 맞게 코딩하여 시스템을 구성한다. 이러한 ARM은 8비트 MCU와 OS를 갖는 임베디드의 중간 성능과 기능을 발휘한다.

## 운영 체제
임베디드 시스템은 흔히 운영 체제를 사용하지 않는 경우도 많으며, 사용한다 하더라도 윈도우 CE나 리눅스 등 임베디드에 맞춰진 운영 체제나 RTOS:국방/항공용 실시간 운영체제(NEOS)를 사용하여 자신의 새로운 시스템에 설정한다. 이는 대개의 임베디드 시스템의 경우 CPU나 메모리 자원 등의 구성이 일반 PC 등의 표준적인 플랫폼과는 달리 한계가 있는 시스템으로 일반 개인 컴퓨터용 운영 체제를 사용할 수 없기 때문이다.

## 개발 도구 및 디버깅
일반적인 컴퓨터 프로그래머가 그렇듯이, 임베디드 시스템 설계자들도 프로그래밍을 위해 컴파일러, 어셈블러디버거를 사용한다.

### 리눅스 운영 체제 개발환경
리눅스 커널 기반의 운영 체제를 사용할 경우, 개발 도구는 보통 GNU의 gcc을 사용한다.

gcc는 소스를 웹사이트에서 가져온 뒤, 목적 CPU에 맞추어 컴파일하면 gcc 관련 도구를 생성할 수 있다. 목적 CPU을 설정하고 make을 사용하면 해당 CPU의 크로스 컴파일러 gcc 관련 실행 파일을 얻을 수 있다.

gcc를 사용할 때, 프로그램 개발에서 다음 2가지 방식의 개발도구를 사용한다:

위의 이클립스를 사용하기 위해 개발환경은 리눅스 PC의 X-윈도우에서 주로 행해진다.

gcc를 윈도우에서 실행할 경우, 시그윈 상에서 실행되도록 gcc을 컴파일하면 된다.

#### 커널 개발
커널이 동작할 때, 내부의 상태를 표시하는 가장 일반적인 방법은 C언어 커널함수 **printk**을 사용하여 외부의 통신라인으로 표시하는 방법이 있다.

전용 CPU의 에뮬레이션 도구가 있다면 커널의 디버깅의 편리성을 얻을 수 있다.

#### 응용 프로그램 개발
이클립스는 디버깅 도구로 GDB을 사용할 수 있다. 리눅스 응용 프로그램을 디버깅할 때, GDB 서버를 타킷 보드에 설치하고 이클립스와 연결하면 이더넷 등의 통신을 통해 디버깅이 가능하다.

### 윈도우 CE 개발환경
윈도우 CE는 윈도우 PC에서 동작하고 비주얼 스튜디오 개발환경에서 이루어진다. 초기의 환경은 커널(윈도우 CE 플랫폼 빌더)과 응용 프로그램 개발(임베디드 비주얼 C++)이 다른 도구를 사용했다. 이후 커널 컴파일과 응용 프로그램 개발이 비주얼 스튜디오에 통합하여 개발한다. 윈도우 CE와 PC 윈도우 응용 프로그램은 차이가 있으므로 비주얼 스튜디오의 설정은 달라야 한다. 윈도우 CE용 개발 도구를 설치해야 한다.

윈도우 임베디드 컴팩트 7 설치 예:
순서로 설치한다.

### 기타 경향
디버깅은 인서킷 에뮬레이터 등의 디버거(디버깅 프로그램)를 이용하여 이루어진다.

임베디드 시스템 설계자는 일반적인 소프트웨어 프로그래머가 흔히 사용하지 않는 도구들도 가끔 이용한다.