본문 바로가기

임베디드 디바이스 직접 개발하기 - 튜토리얼


방학 중에 진행할 나름의 대형 프로젝트로써

임베디드 개발을 하드웨어부터 소프트웨어까지 모두 직접 진행해 볼 예정이다.



예전에 임베디드 개발에 대해 책과 구글에서 많이 찾아봤지만, 잘 정리된 흐름을 가진 문서는 별로 없었다.

대부분 이미 특정 타겟이나 환경을 지정해놓고 그에 맞춰서 곧바로 개발에 투입되는 내용이었다.


임베디드 개발 자체를 범용적인 환경에서 구성할 순 없지만,

적어도 처음 시작하거나 가이드가 필요한 사람에게 도움이 될만한 글을 남겨보기로 했다.

(다만 프로그래밍 경험과 OS 등에 대한 기초 지식이 있다는 가정이다)



우선 이 개발 과정을 크게 하드웨어와 시스템으로 나눴다.


하드웨어는 중앙 처리기 같은 시스템 관련 부품은 제외하고 보드 설계에 필요한 전자부품을 우선 익힌다.

이후에 회로를 공부하고 최종적으론 직접 보드를 설계하는 내용을 Hardware 카테고리에서 다루고 있다.

그리고 시스템은 하드웨어 설계부터 소프트웨어 구현까지 임베디드 전반에 대한 내용을 다룰 예정이다.

(하드웨어는 옴니버스식 구성, 시스템은 피카레스크식 구성)



이 글은 계획의 전체 튜토리얼에 해당하는 글로써, 임베디드에 대해서 전반적으로 소개한다.

그리고 이후에 어떤 흐름으로 내용을 진행할 지 길게(절대 간략하지 않음) 설명해보겠다.



0. 임베디드 시스템 소개


임베디드 장비의 사전적 의미를 잠시 살펴보면, 

범용적 컴퓨터와 달리 특정한 목적을 수행하기 위해 설계된 (소형화된) 컴퓨터이다.


범용적 컴퓨터는 일반인들이 사용하는 개인 PC 로 보면 된다.

이러한 범용 컴퓨터는 사용자가 원하는 소프트웨어를 설치하고 필요한 작업을 할 수 있는

'환경' 이 이미 기반으로 만들어져 있다.


반면에 임베디드는 범용성보단 정해진 목적만을 위해 만들어졌기 때문에

다양성이 고려될 필요가 없고, 하드웨어와 소프트웨어의 추가 및 수정 빈도가 훨씬 적다.

즉, 제작 이후에 사용자에 의해 크게 수정되거나 덧붙여지는 것은 거의 없다.


이는 임베디드의 하드웨어적인 특성으로 나타나는데,

최소한의 필요 부품만을 이용해 설계되고, 목적에 따라서 그 구성이 매우 달라진다.



# 중앙 처리기와 아키텍쳐


앞서 임베디드는 다양한 특징 갖는다고 설명했다. 

그 다양함 중에서도 가장 중요한 것은 '중앙 처리기' 이다.

일반 PC 에 사용되는 CPU(중앙처리장치)는 '아키텍쳐'가 통일 되어있다.
흔히 PC 용 CPU는 INTEL 과 AMD 에서 만들지만, 아키텍쳐는 
INTEL 에서 설계한 동일한 것이다.

아키텍쳐라는 것이 어느 영역까지 포함하는 지는 정확힌 모르나
일단은 레지스터의 종류와 개수 그리고 어셈 명령어가 여기에 포함된다.
(= INTEL 과 AMD CPU 에서 어셈 명령에 차이가 없다)

하지만 임베디드 기기에서 사용되는 중앙 처리기는 아키텍쳐가 다양하다.
이는 곧 레지스터, 어셈 등이 다름을 의미하고, 개발자가 고생한다는 것도 의미한다… (주륵)


8bit 프로세서는 주로 AVR, PIC 등이 사용되고
32bit 프로세서는 ARM, MIPS, 80386 등이 사용된다. (아키텍쳐 분류)

특히 32bit 에선 ARM 이 거의 독보적인 존재라고 한다.
ARM 은 아키텍쳐를 설계하고 직접 칩을 생산하진 않는데,
이 설계를 기반으로 INTEL, 삼성, TI, 퀄컴 등에서 ARM 호환 칩을 생산한다.
(뭔가 익숙한 단어가 보인건 기분탓이 아니라, 스마트폰에서도 ARM 칩이 사용되기 때문이다)


# 아키텍쳐와 개발환경


아무튼, 임베디드 개발은 어떤 아키텍쳐의 칩을 쓰냐에 따라 달라진다고 볼 수 있다.
(주로 펌웨어와 OS 의 하드웨어 컨트롤 부분이 완전히 달라진다)


물론 임베디드도 이미 만들어진 보드에서 HIGH 레벨만 작업한다면 큰 차이점은 없다.
최근엔 이 점을 적용시킨 대중화된 개발보드들을 쉽게 접할 수 있다.


개발보드는 기반이 되는 펌웨어를 이미 내장하고 있어,

정해진 개발 툴로 소프트웨어를 올리면 보드에서 이를 저장하고 실행시킨다.


대표적으로 아두이노, 라즈베리 파이, 인텔의 갈릴레오 등이 있고
아두이노는 AVR 을, 라즈베리 파이, 갈릴레오 등은 ARM 아키텍쳐가 사용된다.
개발보드마다 칩이 다르지만 
프로그래밍과 컴파일, PC 연결, 다운로드까지 그럭저럭 비슷하다.

(어디까지나 그럭저럭 비슷한거다.. 잘 모르는 사람 입장에서 보기엔 거기서 거기다)


하지만 앞서 말했듯이 이러한 영역은 HIGH 레벨이고,

우리가 작성한 프로그램이 어떻게 저장되고, 실행 되는지를 다루는건
각 아키텍쳐에 맞게 제작된 펌웨어 또는 OS 가 결정한다.



1. 임베디드 하드웨어


# MCU 와 MPU


앞서 중앙 처리기를 아키텍쳐로 구분했다면, 이번엔 기능과 관련해서 분류하는 내용이다.

사실 전문적인 개발자나 제품을 만드는 회사 입장이 아니라면, 크게 중요하지 않다곤 생각되나

그래도 임베디드를 한다고 자신있게 말하려면, 간단하게나마 알아두는 것이 좋을 듯 싶다.


우선 MPU 는 Micro Processor Unit 의 약자로, CPU 를 하나의 단일 IC 칩에 집적시켜 만든 반도체 소자이다. CPU의 형태 중 소자가 하나인 종류가 MPU 이기 때문에 모든 MPU는 CPU에 해당한다. (역은 X)


반면에 MCU 는 Micro Controller Unit 의 약자로  CPU 기능에 메모리, I/O, 주변장치 컨트롤러 등을 모두 내장시킨 반도체다. 즉, MCU는 메인보드를 통재로 칩 하나에 넣은 것이다.

실제로도 MCU 칩 한 개만으로 소프트웨어를 구동하고 주변 장치를 조작 할 수 있다.

(임베디드 장비에서 부품과 기능을 최소화하기 위한 수요가 MCU 를 만들지 않았나 생각된다)


하지만 사실 두 경계가 애매하고, 칩 제조사에서도 굳이 엄격하게 구분 짓지 않는 듯 싶다.



# 주변 부품


MCU 가 독립적으로 동작할 수 있는 칩이라고 할지라도,

전문적인 목적을 수행하기 위해선 주변 부품들이 필요하다.

회로 구성에 기본이 되는 전원과 저항들부터 크리스탈, RAM, ROM 같은 부품들까지 다양하다.


이러한 부품들의 특성을 간단하게나마 알고 있으면,

특정한 장비나 회로도를 보고 그 장비가 무슨 목적으로 어떻게 구동되는지 대략적으로 이해할 수 있다.


특히 개발을 목적으로 하고 있다면, 필요한 부품을 고르기 위해 필수적으로 알아둬야 한다.



2. 임베디드 통신


임베디드 장비에서 센서나 통신 모듈을 한개도 쓰지 않는 건 거의 없다고 알고있다.

외부에서 데이터를 수집하거나 송수신하는 방법이 없으면, 그 자체로 무엇을 할 수 있겠는가.


그만큼 임베디드에선 통신이 필수적인 부분이고, 알아둬야 한다.


다만 단순히 '통신' 이라 부르기엔 그 범위와 분류도 생각해야 한다.


임베디드 통신은 보통 동일한 통신 모듈을 사용하는 기기 간의 통신을 의미하지만, 

칩이 통신 모듈을 제어하기 위해서도 시리얼 통신을 사용한다.

그리고 보통 개발자는 이 통신 모듈과 어떻게 시리얼 통신을 하는지를 알면 된다.

(물론 통신 모듈 개발자는 이 통신에 대해서 다 알아야 한다…)


통신 부분을 크게 두 가지로 나눠서 생각했는데, 유선과 무선이다.



# 유선 통신


유선 통신이라는 것은 물리적인 회로를 통해 이어져 있는 것이고,

대상이 누구인지, 무슨 규격을 쓰는지 등은 이미 알고 있다고 볼 수 있다.


때문에 임베디드에서 사용되는 유선 통신들은 대체로 프로토콜이 단순하고

별다른 인증 절차 없이, 명령과 데이터만 주고받는 형태가 많다.


그리고 당연하게도, 하나의 임베디드 장비 안에서 이뤄지는 통신도 유선을 사용한다.


대표적으로 UART, SPI, JTAG 등이 있고, 이러한 통신은 칩 자체에서 지원 여부가 결정된다.

이들은 별도의 통신 모듈을 필요로 하지 않고, 데이터에 대한 프로토콜도 엄격하지 않다.

게다가 칩 내에서 구현되어 있기 때문에 각 핀의 사용 용도와 방법 정도만 익히면 쉽게 다룰 수 있다.



# 무선 통신


무선 신호는 기본적으로 공기를 통해 퍼져나가고, 범위 안에만 포함되면 신호를 읽을 수 있다.

때문에 누가 보내며 누가 받을지에 대한 주소를 사용해야 한다.

경우에 따라선 이 주소를 토대로 사전 인증 과정이나 페어링 같은 것을 사용한다.


이미 제작된 통신 모듈을 사용하는 임베디드 장비를 개발할 것이라면,

그 통신이 어떻게 변조되고 어떤 스펙트럼 등을 갖는지 까지 완벽히 이해하진 않아도 된다.

(물론, 경우에 따라 다르다)

다만, 통신에 필요한 데이터가 무엇이고 어떻게 사용해야 하는지를 익혀야 한다.


무선 통신은 굉장히 많은 종류가 사용되고 있는데

그 중에서도 Zigbee(802.15.4), NFC(RFID) 등이 일상에서도 많이 볼 수 있다.




3. 프로젝트 진행 계획


# 소프트웨어 설계


이 프로젝트의 목적은 임베디드 장비를 직접 개발하는 것이다.
특히, 이 카테고리(System)의 주 목적은 부트로더와 OS 의 제작이다.

부트로더와 OS 제작은 병행하여 진행할 예정이다.
BLOB 라는 u-boot 의 전신과 같은 부트로더를 분석하며 제작하는 것과
이미 만들어진 u-boot 를 기반으로 그 위에 임베디드 OS를 제작하는 것이다.

그리고 시간이 남는다면, 아두이노의 부트로더를 분석 및 개조하고,
그 위에 간단한 OS 를 올려보는 것도 진행할 예정이다.
(아두이노는 OS 라고 부를만한 영역은 없고, 부트로더와 사용자 프로그램만 있을 뿐이다.)



부트로더와 OS 외에도, 통신과 하드웨어에 대한 부분도 일부 포함된다.

하드웨어를 선택하고 시스템을 설계하는 내용과 

I/O 또는 외부 통신 모듈을 제어하는 내용이 포함될 것이다.



# 하드웨어 설계


임베디드 장비를 직접 제작할 목적으로 공부하는 프로젝트지만,

직접 제작할 생각이 없더라도 알아두면 도움이 되는 내용 위주로 진행할 예정이다.


우선은 각 부품마다 용도와 기능, 특징, 사용법 등을 하나씩 익혀나가고

이후엔 이를 종합하기 위해 회로를 구성하고 설계하는 내용도 다룰 것이다.

이 내용들은 Hardware 카테고리에 별도로 기재한다.


다만, 중앙 처리기 같은 시스템에 영향을 주는 부품은 이 카테고리에서 펌웨어와 함께 다뤄질 것이다.



# 임베디드 통신


단순 시리얼 통신들은 소프트웨어 개발 부분에서 다룰 것이고,

그외에 통신 모듈을 다루는 것도 결국엔 시리얼 통신을 사용한다.


그렇다고 해도 사용할 통신 자체를 모르면 무슨 데이터를 송수신해야 하는지도 알 수 없다.

때문에 몇몇 대표적인 통신과, 다른 프로젝트를 진행하며 익히는 통신 프로토콜들을

'Network' 카테고리에서 정리할 예정이다.