본문 바로가기
학교에서 공부한 내용이 현업에서 어떻게 쓰이나요?

뭘 알아야 이해를 하지
저는 컴퓨터 공학을 전공했어요. 학교에서 공부할 때 컴파일러, 자료 구조, 컴퓨터 구조, 씨(C), 씨플러스플러스(C++), 자바(JAVA), 오에스(OS) 이러한 과목이 현업에서는 어떻게 쓰이는지가 정말 궁금했어요. 저는 이러한 과목들이 현업에서 조금 밖에 쓰이지 않을 거라 생각했거든요. 다른 분야는 잘 모르겠지만 임베디드 시스템에서는 정말 필수 과목이고 많이 알고 있을수록 좋구 정확한 개념을 잡고 있을 수록 좋아요.

컴파일러(Compiler)
저는 이 과목을 공부 시작할 때 정말 하나도 모르겠더라 구요. 왜 해야 하는지도 모르겠고 이걸 공부해서 어디에 쓰이는지도 모르겠구요.
우선 컴파일러가 무엇인지 알아야겠죠. 임베디드 시스템에서는 주로 씨언어로 프로그램을 만들어요. 이렇게 만든 씨 프로그램을 실행 가능한 바이너리(binary)로 만들어야 하는데, 바로 컴파일러가 이 역할을 한다고 보시면 되요. 컴파일러 종류는 정말 많이 있어요. 씨 컴파일러, 어셈블러 컴파일러, 씨플러스플러스(C++) 컴파일러, 자바(JAVA) 컴파일러 등 프로그램 언어에는 모두 컴파일러가 있어야 해요. 실행 가능한 바이너리(binary)는 개발하는 시피유의 코어(core)에 따라 다르게 만들어져요. 즉, 같은 씨 소스이지만 어떤 시피유의 코어(core)냐에 따라 생성되는 바이너리도 다르답니다. 그래서 새로운 코어(core)가 만들어지면 반드시 새로운 컴파일러도 만들어져야 해요. 기본적으로 어셈블리 컴파일러, 씨 컴파일러는 당연히 만들어야 게죠. 이러한 컴파일러는 코어(core)를 만든 회사에서 만들어요. 또는 컴파일러를 전문적으로 만드는 회사에서도 만들 수도 있어요. 하지만 반드시 회사에서만 만드는 것은 아니랍니다. 임베디드 시스템에서 많이 쓰이는 암 코어를 보면 ARM사에서 만든 ADS 라는 컴파일러가 있는데, 이 컴파일러는 아무래도 코어를 만든 회사에서 만든 컴파일러다 보니 최적의 코드가 만들어져 정말 좋습니다. 이에 반해 공짜 컴파일러도 있어요. 바로 암-지씨씨(arm-gcc) 컴파일러랍니다. ARM사에서 만든 컴파일러에 비해 코드 최적화 및 기타 성능은 다소 떨어지지만 프리웨어라는 점이 매력 있고 인터넷상에서도 쉽게 구할 수가 있기 때문에 학생들이 많이 구해서 사용한답니다.

알고리즘(Algorithm)
대부분 수학이야기예요. 알고리즘을 잘 하고 싶다면 수학을 잘해야 해요.
알고리즘이란 무엇일까요? 저도 막상 설명하려니 잘 정의가 되지 않는데, 대충 이런 거라 생각하면 되요. 만약 내가 엘리베이터 프로그램을 만든다면 어떻게 만들 것인가? 현재 3층에 엘리베이터가 있었는데 1층과 5층에서 동시에 업 버튼을 눌렀다면?
3층이 아니라 6층에 엘리베이터가 있었다면? 이처럼 프로그램을 만들기 전에 어떻게 만들 것인지에 대해 정의를 해 놓고 이것을 다시 수학적 표현으로 프로그램 순서를 만들어 놓은 거랍니다.

⊙ 엘리베이터 알고리즘
- 현재 엘리베이터 위치(3층)
- 1층에서 업 버튼 또는 5층에서 업 버튼
- 만약 현재 엘리베이터 위치가 3층 이하에 있다면  1층으로 이동
- 만약 현재 엘리베이터 위치가 6층 이상에 있다면  5층으로 이동

⊙ 수학적 표현
(1층에서 업 버튼)&&(5층에서 업 버튼)
cur<3
cur-1f= x
x 만큼 아래로 이동
cur>6
cur-5f= x
x 만큼 아래로 이동

⊙ 씨 프로그램
int key_butten;
int current;
int input_1;
int input_5;
input_1=1;
input_5=5;
if current<=3
move = current - input_1;
else if current>=6
move = current - input_5;

운영체제(Operating System)
누구나 운영체제(OS)에 대한 기본 개념은 잘 알고 있을 거예요. 그럼 여러분이 알고 있는 운영체제(OS) 종류는 몇 가지나 되나요? 일반 개인용 컴퓨터에서 사용되는 OS를 임베디드 시스템에서도 사용할 수도 있겠지만 일반인들에게 잘 알려 지지 않는 OS가 정말 많이 있답니다. 임베디드 시스템은 OS를 올려서 개발하는 복잡한 시스템이 있는 반면 OS없이 개발하는 단순한 시스템도 많이 있답니다. 그럼 학교에서 배운 OS과목이 현업에서는 어떻게 쓰일까요?
저는 OS 수업을 들으면서 단순히 OS개발하는 회사 사람들에게만 유용할 거라 생각했었는데, 저의 착각이었죠. 왜냐하면 임베디드 시스템에서 OS를 사용하든 하지 않든 OS개념을 잘 알고 있는 개발자가 더 효율적으로 프로그램을 만들고 제품 성능도 높일 수가 있답니다. 예를 들어 전자사전을 가지고 있었는데 음악 들으면서 사전 검색을 한다고 가정해 보아요. 여기서 음악과 사전 검색을 각각 별도의 일이 동시에 일어나고 있어요. OS를 사용한다면 두 개의 일, 즉 Task 두 개가 동시에 실행되고 있어야 해요. 코어(Core)가 두 개라면 각각을 실행하면 되니 큰 문제가 없지만 코어가 하나라면 동시에 두 개의 일을 처리하기란 쉽지가 않겠죠. 어떻게 하나의 코어에서 두 개를 동시에 처리할 수 있을까요? OS를 사용 한다면 OS자체에서 두 개의 Task가 일정시간 간격으로 코어 사용을 번갈아 가면서 실행되도록 한답니다. 서로 번갈아 가면서 하나의 코어에 짧은 시간 동안 빠르게 사용하도록 하니 사용자는 마치 동시에 두 개의 일을 처리하는 것처럼 느끼게 된답니다. 그럼 OS를 사용하지 않는다면 어떻게 해야 할까요? OS를 사용한 시스템처럼 코어를 번갈아 가면서 사용하게 해야겠죠? 누가해야 할까요? 그건 개발자가 직접 번갈아 가면서 처리할 수 있도록 프로그램을 만들어 줘야 한답니다.
위해서 말씀 드린 바와 같이 OS를 사용하든 하지 않든 하나의 코어를 빠르게 번갈아 가면서 처리해야 한다는 개념은 거의 같습니다. 그래서 학교에서 배운 OS는 개념을 정확이 이해하는데 노력해야 합니다. 가장 오래 기억에 남으려면 여러분들이 직접 간단한 OS를 만들어 보세요.
참! 제가 한가지 당부를 드린다면, OS를 공부하기 위해서 많은 분들께서 리눅스를 보시는데, 그렇게 하지 마세요. 처음에는 의지가 강해서 꿋꿋이 공부를 하시겠지만 아마 대부분 포기 하실 겁니다. 그래서 다들 OS는 어렵다는 결론을 내고 결국 책을 덮어 버리죠. 사실 저도 그랬으니깐요. 정말 OS를 공부하고 싶다면, 작은 OS를 보시는 게 좋을 듯 해요.
저는 현업에서 일을 하다가 uC/OS2를 접하면서 다시 OS 공부를 시작했답니다. ARM9에 uC/OS2를 포팅하면서 OS개념을 확실히 정리를 했어요. 그리고 나서 다른 OS를 봤어요. 일반적으로 임베디드 시스템에서 많이 사용되는 OS는 uC/OS2, Nucleus, Vxworks, NEOS, REX, OKL4, WindwosCE, Linux 등이 있어요. 한가지 OS에 대해 정확이 알게 된다면 나머지 OS들은 처리 방식이 다를 뿐이지 기본적인 개념은 대부분 같아요.

자료구조(Data Structure)
임베디드 시스템의 프로그램을 만들다 보면 자료 구조시간에 배운 내용이 정말 많이 적용되는 것 같아요. 자료 구조라고 함은 사용자가 원하는 정보를 저장하거나 수정하거나 지우거나 할 때 어떻게 프로그램을 만들어야 효율적으로 관리가 될지에 대한 방법을 배운답니다. 보통 임베디드 시스템의 프로그램이라고 하면 대부분 하드웨어 제어만 한다고 생각하겠지만 저는 하드웨어 제어 프로그램과 유아이(User Interface) 프로그램으로 나누어 볼게요.
하드웨어 제어하는 프로그램은 대부분 하드웨어 장치를 직접 Data 값을 쓰거나 읽으면서 장치를 동작을 시키는 반면 유아이(UI) 프로그램은 저장되어 있는 자료를 검색하거나 읽어오고 보여 주는 등 자료를 다양하게 표현을 할 수 있도록 한답니다. 예를 들어 휴대폰에 새로운 사람의 이름과 전화번호를 저장해 놓고, 검색하거나 수정한다면 당연히 하드웨어를 제어하는 프로그램이 아닌 유아이 프로그램에서 처리를 해 줘야겠죠?
사진을 저장하는 프로그램, 동영상 저장하는 프로그램, 전화번호를 저장하는 프로그램, 메모장 프로그램, 문자 메시지 보관하는 프로그램, 전화번호 목록 프로그램 등등... 대부분 자료 구조가 필수라고 보시면 될 것 같아요.

마이크로 프로세서(Micro processor)
마이크로 프로세서 과목은 정말 재미가 있기는 하지만 다소 어렵다는 느낌도 들기도 하고 현업에서는 어떻게 쓰일까 많이 궁금했었어요. 마이크로 프로세서라고 하면 우리가 알고 있는 시피유라고 보시면 되요.
대부분 학교에서 사용되는 시피유는 8비트 짜리를 많이 사용해요. 아직도 현업에서는 8비트 시피유를 사용하고 있기는 하지만 16비트와 32비트가 점점 증가하고 있어요. 휴대폰의 경우는 대부분 32비트 짜리 시피유가 사용되고 있으며 네이게이션, 전자사전, 엠피쓰리, 피엠피 등에서 쓰고 있어요. 여기서 8비트 또는 32비트라고 이야기 하는 것은 하나의 어셈블리 명령어가 차지하는 명령어 길이라고 보시면 되요. 무슨 말이냐구요? ᄒᄒ
여러분이 만든 씨소스를 컴파일을 하고 나면 하나의 바이너리가 만들어지겠죠. 이 바이너리를 실행하는 시피유는 8비트씩 바이너리를 읽어와서 실행을 한답니다. 그럼 32비트라면 어떻게 될까요? 아무래도 비트수가 많을 수록 처리하는 속도가 빨라지겠죠.
마이크로 프로세서 과목에서 반드시 이해하셔야 될 것 LED ON/OFF 랍니다. 씨 프로그램으로 LED ON/OFF 프로그램을 만들 수 있다면 임베디드 시스템에서 하드웨어를 제어할 수 있다는 의미죠. 왜냐하면 LED ON/OFF를 하려면 먼저 회로도를 보셔야 해요. 시피유 어느 핀에 LED를 연결했는지 확인을 한 후 해당 핀에 어떻게 신호를 넣으면 될지 프로그램을 해야 하는데, 그러려면 시피유 데이터 시트를 보면서 프로그램을 해야 하거든요. 그래서 마이크로 프로세서에는 시피유가 어떻게 동작되는지를 이해하는 과목이랍니다. 이 과목이 이해가 되면 현업에서 가장 많이 사용되는 암 프로세서를 이해하는데 많은 도움이 된답니다.

씨언어(C Language)
임베디드 시스템에서는 씨언어를 뺄 수가 없지요. 하드웨어를 제어하기 위한 프로그램을 쉽게 만들 수 있고 실행코드 용량 역시 아주 작기 때문에 임베디드 시스템에서는 대부분 씨언어를 사용하고 있어요. 그럼 씨언어로 하드웨어 제어 프로그램을 잘 하기 위해서는 반드시 시피유 데이타 시트를 자주 보셔야 하고 씨피유에서 어떤 동작을 하는지를 잘 파악하셔야 프로그램으로 만들 수가 있어요. 프로그램을 잘 하려면 비트연산이나 포인터는 잘 다룰 수 있어야 해요. 그리고 메모리를 절약할 수 있는 방법을 알고 있어야 한답니다.
우선 첫 번째로 비트 연산인데요, 일반적으로 LED 하나를 On/Off 하기 위해서는 시피유에서 하나의 핀만 사용하면 되는데, 만약 LED 2개 이상이라면 LED 개수만큼의 핀이 필요해요. 8개 LED를 시피유의 8핀에 각각 연결을 해 놓고 내가 원하는 LED만 동작시킨다면 프로그램을 만들 때 하나의 비트에만 신호가 나가도록 만들어야 해요.
만약 8비트 시피유를 쓴다면 8비트를 하나의 그룹으로 묶어서 A라는 그룹을 지정하고, A그룹에서 해당되는 비트에만 0 또는 1값이 들어가도록 프로그램을 만들면 되어요.

 

 

 

 

A = 0x01 -> LED1 On
A = 0x02 -> LED2 On
A = 0x40 -> LED7 On
A = 0x80 -> LED8 On

두 번째는 포인터입니다.
임베디드 시스템에서는 포인터가 아주 중요하죠. 포인터를 설명하려면 먼저 어드레스 개념에 대해 이해하셔야 해요. 일반적으로 시피유는 두 가지의 어드레스를 가지고 있는데, IO맵 어드레스와 메모리맵 어드레스랍니다.
IO맵 어드레스는 시피유에서 시리얼 컨트롤러 레지스터, 엘시디 컨트롤러 레지스터 등에 주어지는 주소입니다. 메모리맵 어드레스는 실제 임베디드 시스템 프로그램이 동작하기 위해 바이너리가 어디엔가 들어가 있어야 하고 프로그램 실행을 위해서는 에스디램(SDRAM) 메모리가 있어야 하죠. 이러한 메모리에 주어지는 주소랍니다. 그래서 IO맵 어드레스이든 메모리맵 어드레스이든 각각 해당 되는 어드레스에 데이터 값이 존재하는데요, 해당 어드레스에 데이터를 읽거나 쓰기 할 때 바로 씨언어에서는 포인터를 사용한답니다.

int * UART register = 0x1234

마지막으로 메모리 최적화예요.
메모리 공간을 최대한 절약을 해야 해요. 왜냐면, 하드웨어 구성 중에 메모리가 비교적 비싼 단가에 포함되기 때문에 최소한의 메모리 공간으로 최대한의 성능을 내기 위한 바이너리가 만들어져야 해요. 그러기 위해서는 프로그램을 만들 때 “어떻게 프로그램을 하면 메모리가 최적화가 될까?” 고민을 하면서 만들어야 되요. 아래와 같이 구조체를 사용했다면 총 얼마만큼 메모리 공간이 필요할까요?

typedef struct struct1 {
char name;
int age;
char addr;
int num;
}strtype1;
strtype1 han;

정답은
  [D:0x10000] han = (
    [D:0x10000] name = 0,
    [D:0x10004] age = 0,
    [D:0x10008] addr = 0,
    [D:0x1000C] num = 0)
 
SD:00010000| 00   [D:0x10000] han.name = 0   \\structure\Global\han
SD:00010001| 00    |                                     \\structure\Global\han+0x1
SD:00010002| 00    |                                     \\structure\Global\han+0x2
SD:00010003| 00    |                                     \\structure\Global\han+0x3
SD:00010004| 00   [D:0x10004] han.age = 0     \\structure\Global\han+0x4
SD:00010005| 00    |                                     \\structure\Global\han+0x5
SD:00010006| 00    |                                     \\structure\Global\han+0x6
SD:00010007| 00    +                                     \\structure\Global\han+0x7
SD:00010008| 00   [D:0x10008] han.addr = 0    \\structure\Global\han+0x8
SD:00010009| 00    |                                     \\structure\Global\han+0x9
SD:0001000A| 00    |                                    \\structure\Global\han+0x0A
SD:0001000B| 00    |                                    \\structure\Global\han+0x0B
SD:0001000C| 00   [D:0x1000C] han.num = 0    \\structure\Global\han+0x0C
SD:0001000D| 00    |                                    \\structure\Global\han+0x0D
SD:0001000E| 00    |                                    \\structure\Global\han+0x0E
SD:0001000F| 00    +                                    \\structure\Global\han+0x0F

 

 

그럼 소스를 조금만 수정해서 다음과 같이 만들었다면 메모리 공간은 얼마나 될까요?

typedef  __packed struct struct2 {
   char name;
   int age;
   char addr;
   int num;
}strtype2;        
strtype2 byul;
(*ADS1.2 컴파일러 사용시)
 
  [D:0x10010] byul = (
    [D:0x10010] name = 0,
    [D:0x10011] age = 0,
    [D:0x10015] addr = 0,
    [D:0x10016] num = 0)
 
SD:00010010| 00   [D:0x10010] byul.name = 0  \\structure\Global\byul
SD:00010011| 00   [D:0x10011] byul.age = 0    \\structure\Global\byul+0x1
SD:00010012| 00    |                                    \\structure\Global\byul+0x2
SD:00010013| 00    |                                    \\structure\Global\byul+0x3
SD:00010014| 00    +                                    \\structure\Global\byul+0x4
SD:00010015| 00   [D:0x10015] byul.addr = 0   \\structure\Global\byul+0x5
SD:00010016| 00   [D:0x10016] byul.num = 0    \\structure\Global\byul+0x6
SD:00010017| 00    |                                    \\structure\Global\byul+0x7
SD:00010018| 00    |                                    \\structure\Global\byul+0x8
SD:00010019| 00    +                                    \\structure\Global\byul+0x9

 

 

실제 메모리 영역에서 차이점이 있죠?


컴퓨터 구조(Computer Architecture)
컴퓨터 구조 시간에는 시피유 또는 코어 동작 방식을 집중 있게 다루고 기타 주변 장치들이 어떻게 동작하는지를 배운답니다.
여기서 제일 중요한 것이 바로 시피유 또는 코어 동작 방식에 대해 깊이 살펴보는데 주로 파이프라인에 대해 자세히 다루죠.
하지만 수업시간에 배운 것처럼 모든 시피유나 코어가 똑같진 않아요. 다만 전체 흐름은 같다고 보시면 되요. 가령 암 코어 같은 경우에는 코어 시리즈에 따라 다른데 암7은 패치(Petch), 디코드(Decode), 익스큐트(Execute) 3단계가 있는 반면, 암9은 패치(Petch), 디코드(Decode), 익스큐트(Execute), 메모리(Memory), 라이트(Write) 5단계가 있어요. 암11은 8단계가 있지요. 밉스의 경우에는 패치(Petch), 디코드(Decode), 익스큐트(Execute) 4단계가 있어요. 이처럼 코어 또는 시피유에 따라 파이프 라인 단계가 다르지만 실제 동작하는 개념은 같다고 보시면 되죠.

Written by Soto

 

 
Linked at 친절한 임베디드 시스템 개발자.. at 2010/01/19 09:43

... bsp; 102 어떤 공부부터 시작해야할 지 모르겠어요? 103 학교에서 공부한 내용이 현업에서 어떻게 쓰이나요 104 취업이냐 진학이냐? 105 연봉 많이 받으려면? ... more

Commented by 히언 at 2010/01/19 10:54
전 컴퓨터를 전공하지는 않았는데, 여러가지 필요한 것들을 배우는군요. 하!
Commented by soto at 2010/01/20 06:53
넵...^^;
Commented by 까마귀 at 2010/01/19 12:49
OS 없이 프로그램을 개발한다는 건 프로그램이 하드웨어 리소스를 관리하는 OS의 기능을 가지고 있어야 할테니 OS를 개발 한다고 봐도 되겠군요.
Commented by soto at 2010/01/20 06:54
깔끔하게 요약해 주셨네요. 감사합니다.
Commented by 김경진 at 2010/01/19 17:12
정말...학교 다시 돌아간다면 열심히 공부할텐데요... 언제나 때늦은 후회뿐입니다. ^^
요즘은 전자공학이나, 컴퓨터 공학이나 결국 다 알아야 한다는 ㅠ.ㅠ ...
Commented by soto at 2010/01/20 06:55
그러네요. ㅋㅋ
Commented by Ruring at 2010/01/19 17:54
ㅎ_ㅎ 재미있는거 많이배우셨내요 ㅎ_ㅎ
Commented by soto at 2010/01/20 06:57
네..저는 나름 재미가 있었지만
어려워하는 친구들도 많이 봤습니다.
그래서 저는 모두가 하기 싫어하는 것을 해야겠구나 라고 생각했죠.ㅋㅋ
그래야 취업할때 경쟁력이 있을거라 생각했거든요.ㅎㅎ
Commented by Ruring at 2010/01/21 16:51
ㅋㅋ 저도 마찬가지였어요 ㅋ

물론 재미도있었지만 ㅋㅋ

전 친구들이 이해가안되더라구요 (<- ㅡ.ㅡ; (웃자고한소리임/..))
Commented by 히언 at 2010/01/21 20:10
루링님, 완전~ 물의파란소동이에요~
전 똑똑한 부류가 아니라 부러워요~ 크흐흑 T.T
Commented by 락이즈 at 2010/01/19 20:18
한번씩은 셤 공부한다고 봤던건데...기억이 가물가물 ㅠㅠ 이렇게 중요한줄 알았으면 좀 더 확실히 공부할껄 그랬어요...지금은 4학년 마지막이라...(가을 졸업) 전공에 신경을 못 쓰네요...강의 목차에 4학년 때 꼭 해봐야 되는것? 이라고 있던데...어떤 말씀을 해주실지...기대됩니다...가능한 빨리 보고 싶어요~
Commented by soto at 2010/01/20 06:58
기대를 너무 하시진 마시구요..ㅋㅋ
암튼 꼭 도움이 될 만한 이야기라고 생각이 되요...
Commented by 락이즈 at 2010/01/19 20:20
아 그리고 좋을 글 올려주셔서 감사합니다. 많은 도움이 되고 있어요~
Commented by soto at 2010/01/20 07:01
고객 숙여 정말 감사합니다.
저에게도 팬이 생긴다는 느낌...오~!좋네요.
제가 보답할 수 있는 것은 좋은 글을 많이 올려 주는 것..이겠죠 후후..
Commented by 레몬향최루탄 at 2010/01/20 23:49
처음 보시는분들이 개념잡기 좋게 깔끔하게 정리해주셨네요 좋은글~
Commented by soto at 2010/01/21 06:24
감사합니다. ^^;
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.
친절한 임베디드 시스템 개발자 되기 강좌 글 전체 리스트 (링크) -



댓글





친절한 임베디드 개발자 되기 강좌 글 전체 리스트 (링크) -