임베디드 리눅스(Embedded Linux)의 개념

코드도사에서 포스팅 한 내용중에서 프로그래머의 종류를 보면 임베디드 시스템 프로그래머로 분류된 프로그래머가 있다고 소개를 해 드렸습니다. 그렇다면 임베디드 시스템 프로그래머는 어떤 환경에서 어떻게 프로그래밍을 하는 것일까요? 임베디드 시스템에서 많이 쓰이는 OS인 Linux와 함께 임베디드 시스템 프로그래머가 어떻게 개발을 하는지 한번 설명을 해볼까 합니다.

임베디드 리눅스는 왜 사용할까?

임베디드 시스템이 구동되려면 시스템을 Control 하는 Software가 필요합니다. 이 Software는 시스템의 종류에 따라 천차만별이지만, 8 Bit 혹은 16 Bit 마이크로프로세서에서는 시스템을 구동하기 위해 프로그래머가 코드를 작성하여 내부 메모리에 저장하여 시스템을 구동 시키게 됩니다. 보통 이런 Software를 Firmware 라고 많이 불립니다.

하지만 임베디드 시스템도 고성능의 프로세서(CPU)를 사용하게 되고, 규모도 커지면서 프로그래머가 일일이 코드를 작성하는게 어렵게 되었습니다. 따라서 시스템에 OS를 사용하여 기본적인 Control을 담당하게 되었습니다. 이들 OS를 임베디드 OS 라고 보통 부릅니다.

임베디드 OS에는 여러 종류가 있는데, 대표적으로는 임베디드 Windows 계열과 임베디드 Linux가 있습니다. 시중에 공급되는 임베디드 시스템 대부분이 이 두 계열의 OS를 사용하고 있다고 보면 됩니다.

그중에서 단연 독보적인 존재는 바로 임베디드 Linux 입니다. 아마 많은 임베디드 시스템이 임베디드 Linux를 사용하고 있습니다. 가장 큰 이유는 이름에서 알수 있듯이 Linux의 장점으로 인해 임베디드 Linux를 많이 사용한다고 보시면 되겠습니다.

임베디드 Linux의 대표적인 build 환경인 BuildRoot

GPL 기반의 Linux는 개발 비용이 크게 단축되고, Source 가 공개 되어 있으며 많은 솔루션들이 Open Source 형태로 제공이 되어 개발 기간 또한 단축되어 개발에 유리하기 때문입니다. 저 또한 임베디드 Linux 기반의 시스템을 개발하고 있어서 임베디드 Linux는 장점이 단점보다 많은 OS라고 생각합니다.

임베디드 Linux를 왜 사용하는지 이제 이해되시죠?^^

임베디드  리눅스(Embedded Linux) 소개

그럼 임베디드 리눅스에 대하여 간략히 소개를 해 보도록 하겠습니다. 임베디드 리눅스(Embedded Linux)는 쉽게 말해서 리눅스 OS를 임베디드 장치에 포팅하여 사용하는 리눅스를 의미한다고 보시면 되겠습니다.

임베디드 리눅스 장치/장비는 많은 종류가 있지만, 주변의 임베디드 장치를 예로 들면 가장 대표적인 장치가 휴대폰(스마트폰)이 있고 네트워크 공유기(Router), 자동차 블랙박스, 네비게이션, 가전, 결재 단말기, 의료 기기, DVR, 청소로봇 등등 리눅스를 사용하는 임베디드 장치/장비는 우리 주변에서 널리 쓰이고 있습니다.

알게 모르게 실생활에 친숙한 임베디드 리눅스인거 같습니다.

일반 리눅스와의 차이점은?

그렇다면 리눅스와 임베디드 리눅스는 완전 다른 건가요? 아님 같은 건가요? 둘 사이에는 약간의 차이점이 있습니다. 한번 알아보도록 하겠습니다.

  리눅스 임베디드 리눅스
주 사용 용도 데스트탑 PC 혹은 서버 임베디드 시스템 장치/장비
사용 CPU 인텔, AMD 데스크탑/서버 CPU ARM, AVR32, MIPS, PowerPC, m68k 등등
설치 방법  리눅스 배포판 CD/USB/Network로 손쉬운 설치 Bootloader, 리눅스 Kernel, FileSystem 등을 별도로 Target Board에 전송하여 사이즈를 줄여서 설치. 다소 절차가 복잡하고 난이도가 있다.
주 사용자 일반 사용자 혹은 서버 관리자, 서버 개발자 임베디드 시스템 개발자
시스템 자원 소모 충분한 HDD, RAM 등의 시스템 자원 사용. 시스템 자원 소모에 대한 부담이 덜하다.  한정된 RAM, Flash 등의 자원으로 인해 최소화/최적화가 필요함.
대표 패키지 레드햇, 데비안, 우분투, 민트 리눅스  안드로이드 SDK, BuildRoot, OpenWRT
S/W 업그레이드 용이성 자체 OS 지원의 원활함으로 인해 용이함. 업그레이드는 개발자가 해줘야 함으로써 제조사가 해주지 않으면 즉각 업그레이드는 어렵다.

 

 

 

위의 표를 봤을때는 리눅스와 임베디드 리눅스는 사용용도에 따라서 차이를 보입니다. 주로 리눅스는 일반사용자로 까지 범위가 넓어지는 반면, 임베디드 리눅스는 개발자(프로그래머)들이 임베디드 시스템 개발 용도로 사용 범위가 좁아지는것을 알 수 있습니다.

임베디드 리눅스 개발시 필요한 요소

자 그럼 임베디드 리눅스를 한번 만져보고 싶은 생각이 듭니다. 어떻게 만져봐야 될까요? 이번 포스트에서는 간단하게 언급 해 보도록 하겠습니다.

임베디드 리눅스를 임베디드 시스템에 사용하려면 몇가지 준비해야 할 사항들이 있습니다. 크게 3가지를 준비해야 하는데요 리눅스가 깔린 PC 혹은 서버(리눅스 머신), 임베디드 시스템 타켓 보드, 타켓 보드에 데이터를 전송할수 있는 JTAG 케이블이 필요합니다. 

그런데 이상하죠? 임베디드 시스템 타켓 보드만 있으면 되는게 아닌가요? 라는 분도 계실겁니다. 하지만 임베디드 리눅스를 만지려면 임베디드 타켓 보드 뿐만 아니라 임베디드 타켓 보드에 Bootloader + Kernel + File System 등을 컴파일할 호스트(Host) 머신이 필요합니다. 호스트 머신은 일반 리눅스가 깔린 보통 PC도 가능합니다. 임베디드 리눅스를 만지는게 약간 번거롭기는 합니다.만약 호스트 머신을 Linux 전용으로 준비하기 어렵다면 VirtualBox 같은 가상머신으로 구동하는 방법도 가능합니다. ( 아래 링크 참조 )

또한 호스트 PC 에서 임베디드 타켓 보드로 데이터를 전송할 케이블이 필요한데요, 이걸 보통 JTAG을 사용하여 전송을 하게 됩니다. 요즘에는 일반적으로 USB로 된 JTAG 케이블을 많이 사용합니다.

Digilent사의 JTAG 케이블

여기에 추가적으로 호스트 PC에서 임베디드 타켓보드로 개발한 파일들을 전송하려면 이터넷 포트를 통해서 주로 전송을 하는데요, 그래서 호스트 PC와 타겟보드를 연결할 수 있는 이더넷 케이블도 준비하는게 좋습니다. ( 거의 필수라고 보시면 되요. )

위 항목들이 준비되었으면 임베디드 리눅스 시스템을 개발할 준비가 되었다고 보면 될꺼 같습니다.

임베디드 리눅스 개발시 많이 사용하는  SDK 소개

임베디드 리눅스를 타겟 보드에 넣으려면 Bootloader, Linux Kernel, File System(ROOT FS) 등을 컴파일하여 바이너리(Binary) 형태의 데이터를 타켓보드로 전송을 해야 합니다. 그러면 각각의 Bootloader와 Linux Kernel, Root File System 등을 각각 소스를 컴파일하여 Bootloader, Kernel, Root File System 의 순서대로 타켓 보드에 전송을 해야 하는데요, 사실 이 작업이 번거롭고 각 부분별로 소스를 컴파일하여 타켓 보드의 환경에 맞게 프로그래머가 수정을 해야 하는 작업이 필요합니다.

그런데 전세계의 리눅서들은 이런 번거로운 부분을 좀더 편리하게 하기 위해 임베디드 리눅스용 SDK를 Open Source로 제공을 하고 있습니다. 참 편리하죠?ㅋ 그래서 임베디드 리눅스에 많이 사용되는 SDK를 위주로 소개를 해 보도록 하겠습니다.

1) Android Platform

오픈소스와 리눅스를 최근들어 아주 돋보이게 하는 임베디드 시스템 개발 환경입니다. Android Platform은 스마트폰이 등장한 이후에 가장 인기있는 임베디드 시스템 플렛폼이 되었다고 해도 과언이 아닙니다. 모바일에서 iOS와 더불어 지구상에서 가장 많이 탑재되어 있는 Android OS의 Build 환경이라고 볼 수 있습니다. 비율적인 걸로 봐서는 Android Platform이 전세계 모바일의 70%를 차지하고 있다고 해도 과언이 아닐겁니다. 

Android Platform은 Linux Kernel로 시스템을 운영합니다. 따라서 오픈소스인 Linux Kernel Source를 탑재하여 Android platform 빌드환경이 제공됩니다. 주로 Mobile 제조사인 삼성, LG, 화웨이, 샤오미 등의 Android OS 기반 Mobile 제품에 탑재되고 있습니다. 그외에 방송용 셋탑박스, 멀티미디어 기기 등에 Android Platform을 포팅하여 제품을 개발하는 제조사도 많이 존재합니다. 최근 버전은 Android Q 라는 버전이네요. 

Android Platform은 Linux Kernel Source를 기반으로 만들어진 Build 환경이지만, 일반적인 임베디드 리눅스 개발 환경과는 약간의 차이는 있습니다. 하지만 모든 소스는 Android platform의 공급사인 구글에서 Open되어 누구나 참고하고 개발을 할수 있습니다. 다만 구글에 기술지원을 받으려면 비용이 든다는 점은 간과하면 안됩니다.

2) Buildroot

출처 – BuildRoot 공식 사이트

임베디드 리눅스 개발환경을 좀더 쉽고 편하게 구축하기 위한 툴의 패키지라고 볼 수 있습니다. BuildRoot는 리눅스 정신에 부합하게 모든 소스가 공개가 되어 있는 Open Source 솔루션입니다. 아주 많은 Target CPU를 지원하며 관련된 Toolchain을 어렵지 않고 구할 수 있습니다. 

또한  임베디드 리눅스 시스템을 개발하기 위한 수많은 유틸리티가 제공되어 개발자가 좀더 편하고 유용하게 사용할 수 있습니다. CPU 제조사에서도 임베디드 리눅스 BSP를 제공할때 BuildRoot를 사용하여 시스템 제조사에 공급하기도 합니다. 그많큼 임베디드 리눅스 개발 환경에서 많이 사용하는 프로젝트라고 볼 수 있습니다.

심지어는 라즈베리파이까지 지원합니다. 따라서 라즈베리파이에도 BuildRoot를 컴파일 하여 이미지를 올려서 동작을 시킬 수 있습니다. 추후 포스트에서는 라즈베리파이에 BuildRoot 이미지를 올리는 예제를 올릴 예정입니다. 

임베디드 리눅스에 대한 개발 환경을 맛보시려면 BuildRoot부터 시작하는 것도 좋습니다. 

3) OpenWRT

OpenWRT 로고

OpenWRT는 네트워크 라우터를 개발할때 임베디드 리눅스를 탑재하면서 소스가 오픈되었고 그 프로젝트가 수많은 네트워크 라우터 및 네트워크 장치/장비에 탑재되면서 꽤 인기있는 임베디드 리눅스 개발환경이 되었습니다. 현재까지는 활발하게 업데이트 및 릴리즈가 되어 있는 임베디드 리눅스 기반의 오픈소스 프로젝트입니다.

저또한 OpenWRT로 네트워크 라우터를 개발하였던 경험이 있었고, 네트워크 라우터를 구축하기 위한 맞춤형 유틸리티들이 제공되어서 네트워크 라우터 제품을 구현하기 쉽게 되어 있는 흥미로운 Build 환경이라고 볼 수 있습니다. 

얼마전에 구입한 VoCore2 도 OpenWRT를 제공하고 있네요. 아직 올려보지 못했는데, 조만간 올리게 되면 관련내용을 코드도사에 공유할 계획입니다. 또한 흥미로운 점은 OpenWRT 기반의 네트워크 라우터 제품이 워낙 많아서 정식 펌웨어가 제공하지 못한 기능을 업그레이드 하는데 OpenWRT를 사용하여 커스텀 개발도 가능합니다. 이 것도 시간나면 해볼 생각입니다^^

임베디드 리눅스 프로그래밍을 시작하려면?

지금까지 임베디드 리눅스를 시작하기 위해 대략적인 개념과 준비사항, SDK 등을 알아봤습니다.  임베디드 리눅스를 다루고 관련 프로그래밍을 하려면 여러 지식과 스킬이 필요한데요, 어떤것들이 있을지 알아보겠습니다.

1) C/C++ 코딩 능력

임베디드 리눅스를 다루기 위해서는 꼭 필요한 부분입니다. 임베디드 리눅스를 넘어서 리눅스의 커널과 드라이버 및 많은 어플리케이션들이 C 혹은 C++ 코드로 작성되어 배포되고 있습니다. 제가 C++도 같이 언급을 했지만,  리눅스 어플리케이션 중에서 간혹 C++로 작성된 어플리케이션이 존재합니다. 그래서  C++ 도 포함시켰는데요, 실제 대부분의 리눅스 커널 및 드라이버, 어플리케이션들은  C로 작성되고, 개발되며 배포되고 있습니다.

따라서  임베디드 리눅스를 다루려면 C는기본적으로 꼭 알고 있어야 되는 부분입니다. C++까지 다룬다면 금상첨화겠죠?^^

2) Linux 기본 명령어 사용법

이건 임베디드 리눅스 뿐만 아니라 리눅스를 다룬다면 꼭 알고 있어야 되는 지식입니다. 리눅스는 Windows의 GUI 환경도 지원하지만, 기본적으로 검은 바탕에 흰색 글씨인 명령어 프롬프트 환경에서 다뤄야 될 상황이 많이 발생하게 됩니다.

이때 파일을 조회, 복사, 이동, 디렉토리 생성등의 작업을 명령어(command)를 입력하여 지시를 내리게 되는데, 기본적인 명령어는 알고 있는게 리눅스를 비롯하여 임베디드 리눅스를 다루고 개발하는데 수월하게 됩니다.

기본적인 명령어는 꼭 익혀두시기 바랍니다.

3) vi 에디터 사용법

임베디드 리눅스를 다루려면 vi 에디터는 꼭 다룰줄 알아야 합니다. 프로그래밍을 할때 본인이 주로 사용하는 에디터를 별도로 사용하더라도 디버깅 및 문제파악을 위해서는 vi를 사용할 때가 많아집니다. 임베디드 리눅스를 다루시려면 이참에 vi 에디터 사용법을 익히는 것도 임베디드 리눅스를 다룰때 큰 도움이 될 수 있습니다.

Vim 에디터 실행화면

4) Makefile 작성 및 사용법

Makefile은 리눅스 혹은 임베디드 리눅스에서 C나 C++의 Source를 Compile하여 실행파일을 생성하기 위한 스크립트 언어라고 볼 수 있습니다. Linux Shell과는 약간 다르지만 크게 차이는 나지 않기 때문에 리눅스 혹은 임베디드 리눅스를 개발하는데에는 반드시 사용해야 하고 알아야 하는 부분이기도 합니다. 

임베디드 리눅스를 개발하려면 해야 할게 많지만 Makefile 사용법을 알아두면 아주 유용하고 쉽게 개발을 할 수 있으므로 차근차근 익혀두는게 좋습니다. 

5) Serial 통신 터미널 사용법

위 화면은 임베디드 리눅스 기반의 시스템의 Serial 통신 터미널 장면입니다. 임베디드 리눅스를 개발하면 거의 필수적으로 사용하는 통신 방식입니다. Telnet이나 SSH로도 개발이 가능하지만 전원 인가후 시스템 부팅부터 운용까지 모든 부분을 Serial 통신으로 확인할 수 있기 때문에 Serial 통신에 대한 내용도 알아둘 필요가 있습니다. 

시리얼 통신은 주로 FTDI사의 Chip을 사용하여 통신합니다. 따라서 시리얼 통신 관련 케이블과 드라이버는 거의 대부분 FTDI사의 제품을 사용한다고 보면 되겠습니다. 시리얼 통신은 그렇게 어려운게 아니므로 처음 개발 시작시에 사용법을 잠깐 익혀두면 그 이후로는 단순히 꼽고 테라텀같은 터미널 프로그램으로 임베디드 타겟 보드와 연결하여 사용하면 됩니다. 

6) Linux Shell Script 작성법

임베디드 리눅스 환경에서 vi로 열어본 Shell Script

리눅스 혹은 임베디드 리눅스를 개발하기 위한 필수 조건중 하나입니다. Linux Shell Script는 C/C++과 같이 리눅스 내부의 시스템 동작과 프로그램의 실행과 관련하여 거의 대부분 사용된다고 볼 수 있습니다. C나 C++과 같이 문법이 어렵지 않고 상대적으로 간편한 편이지만, 리눅스에서는 그 기능은 강력하다고 볼 수 있습니다. C/C++을 사용하지 않아도 시스템 구동시 필요한 기능은 Linux Shell Script로 구현이 가능합니다. 

따라서 임베디드 리눅스 기반의 시스템을 개발하려면 Linux Shell Script는 필수적으로 알아야 될 것입니다. 참 할께 많죠?ㅋ 그렇다고 너무 부담은 가질 필요는 없습니다. C를 공부했던 것처럼 차근차근 익혀가다 보면 금새 익숙해지는게 Shell Script라고 생각됩니다. 

7) 기본적인 Hardware 지식 및 시스템 구조 지식

임베디드 리눅스 기반의 시스템을 개발하다 보면 본의 아니게 Hardware적인 지식을 알아야 할 경우가 생깁니다. ARM Core는 무엇이고,CPU의 동작은 어떻게 하며, Clock 속도는 무엇이며 전원 인가시 5V가 필요하고, GPIO를 Access하려면 어떻게 해야 하고… Signal이 High일때와 Low일때의 차이가 어떤지… 등등의 지식을 알아야 될 필요가 느껴집니다. 

임베디드 리눅스 시스템을 개발할 때 본인이 어떤 파트를 맡아서 개발할지 모르겠지만 만약 타겟보드의 초기 boot initial을 확인해줘야 한다면 심지어는 타겟보드의 회로도까지 확인해 봐야 할 경우가 생길지도 모릅니다. 하지만 회로도까지 볼줄 알아야 할 필요까진 없습니다. 기본적인 하드웨어 지식, 즉 위에 언급한 간단한 내용정도만 숙지하고 있으면 될꺼 같습니다. 본인이 회사에서 개발을 할때 어떤 부분이 필요한지는 협업을 하는 사람들과 함께 논의를 해보고 나서 적절히 조절하는 것도 괜찮을꺼 같습니다. S/W 코딩만 했던 사람에게 너무 가혹하겠죠?ㅋ 

그럼에도 임베디드 리눅스 기반의 시스템 개발시에는 하드웨어 지식을 알면 알수록 개발에 도움은 됩니다. 많이 알면 알수록 노하우와 지식은 쌓이는 거니까요^^

'코드도사(codedosa.com)'에는 쿠팡파트너스 등의 제휴링크가 포함되어 있으며 수수료를 제공받을 수 있습니다.