· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
gurugio/Linux Class

임베디드 리눅스 강의 커리큘럼

전자과 4년제 학부 4학년 대상의 임베디드 강의 과정

강의 목적

현재 폭발적으로 증가하고 있고 앞으로도 중요한 기술 잇슈가 될 임베디드 시스템 개발을 위한 강의입니다. 산업 현장에서는 실질적인 개발 지식이나 최소한 개발 기술을 익힐 수 있는 바탕이 된 졸업생들을 원하고 있지만 대학 교육이 이를 충족시키지 못하는 현실입니다. 그래서 운영체제, 컴퓨터 구조, 자료구조와 기초 언어 과목을 이수한 학부 4학년을 대상으로 임베디드 시스템 개발 수업을 열고자 합니다.

강의의 목적은 임베디드 환경에 사용되는 하드웨어를 제작하고 OS를 설치하기 위한 기반 지식을 얻는 것입니다. 따라서 OS보다 상위 레벨의 어플리케이션은 다루지 않습니다.


리눅스를 이용한 개발 강의 필요

  • 대학생들에게 리눅스 환경에서의 개발 경험
  • 대학생들에게 리눅스를 이용한 임베디드 시스템 개발 마인드와 기반 지식
  • 오픈 소스에 대한 학생들의 참여와 국내 리눅스 산업에 도움


1학기(16주=32수업) 과정

  • 과목 이름 : 컴퓨터 구조
  • 컴퓨터 구조 이론 수업과 병행
  • 실습 보드는 관련 연구실에서 제작하여 학생 개별 구입 (약 23만원) - 보드 가격 조정 중
  • 각 주제의 수업 시간은 바뀔 수 있습니다.


    수업 시간표

주차. (강의시간) 수업 주제

1. (2) 회로 이해
  • 회로도 읽는 방법
  • 실습 보드의 회로 이해 : POWER, CLOCK, RESET, SDRAM, FLASH, SERIAL, JTAG
2. (2) 패치 파일을 이용한 부트로더, 리눅스 커널 포팅
  • 개발 환경 꾸미기 : 크로스 컴파일러, JFLASH 프로그램 설치, tftpd / bootpd 설치
  • 패치 파일을 가지고 u-boot와 커널 포팅, 보드 동작 시키기
3-4. (4) 어셈블리 프로그래밍 실습
  • GPIO 설정해서 LED 출력 (2)
  • FFUART의 입출력 (2)
5-7. (6) u-boot 부트로더 포팅
  • 부팅 과정, 하드웨어 설정 이해 (1)
  • FLASH 드라이버 작성, SDRAM 및 기타 하드웨어 초기화를 위해 DATASHEET 읽기 (2)
  • 직접 소스 수정해서 보드에 포팅하기 (3)
8-11. (8) 커널 포팅
  • 리눅스 부팅 과정 이해 (2)
  • 하드웨어 관련 코드 수정 (3)
  • Vanilla 커널을 직접 수정해서 보드에 포팅하기 (3)
12-15. (8) 디바이스 드라이버 작성
  • GPIO를 위한 디바이스 드라이버 작성 (2)
  • 인터럽트를 이용한 디바이스 드라이버 (2)
  • 특정 하드웨어의 디바이스 드라이버 - 미정



선수 과목

  • 전자과 학생을 대상으로 하므로 기본적인 회로 지식은 가지고 있다고 가정함
  • 자료구조 : 프로그래밍에 필요한 기초적인 자료구조 이해
  • C 언어 (, 8086 혹은 ARM 계열 어셈블리 언어)
  • 컴퓨터 구조 : 임베디드 시스템의 하드웨어를 이해를 위해 필요
  • 논리 회로 : 임베디드 시스템의 하드웨어와 회로도를 이해하기 위해 필요
  • 운영체제 : 리눅스 커널의 흐름을 파악하기 위한 최소한의 관련 지식(필수 아님)

    전자과 학부 4학년을 대상으로 하므로 학부 과정에서 필수적으로 수강해야 하는 과목들을 모두 요구함

고려 사항


  • 하드웨어를 PCB로 만들어서 쓰지 않고 직접 손으로 만들 수 없을까?
    • 하드웨어를 직접 만들어보는게 가장 좋음. 안되면 서브 보드라도 만들어 봐야 함
    • datasheet를 직접 읽고 만들어보는 연습 필요
  • 수업의 연장선으로 과제를 내어서 수업과 실습이 연계되게 해야 함 - 실습 과목으로?
  • GPIO를 사용한 외부 장치와의 연계 및 디바이스 드라이버 작성


보드 개발


  • CPU + SDRAM + FLASH + JTAG로 구성된 코어 보드만을 만들고 RS-232와 Ethernet등 기타 모듈을 위해 학생들이 직접 만능 기판으로 서브 보드를 만들게 한다.
  • GPIO나 LCD등을 만능 기판을 이용해서 연결하고 드라이버를 작성
  • 코어 보드와 서브 보드를 슬롯 형태로 연결

    보드 가격

  • PCB 제작 비용 + BGA 칩 부착 비용 : 코어 보드 + 슬롯이 부착된 슬레이브 보드
  • CPU : PXA270
  • SDRAM MEMORY : 16MB 이상
  • FLASH MEMORY : 16MB 이상
  • RS-232 : 2개
  • ethernet : 1개
  • LCD 추가 가능
  • 슬롯 타입 :
  • 드라이버 실습을 위한 디바이스 :

    참고 보드

  • http://www.elogics.co.kr/bbs/view.php?id=pro&no=6
  • http://www.arm.co.kr/solution/4_7.php


Author(s): 김기오 (gurugio@hanmail_nospam.net)

Date: 2005-12-23

@edu_schdule.zip (11.01 KB)


References: http://kelp.or.kr

ARM Emulator





Keywords

강의, 수업, 학부생



기타 의견/ 수정 사항

많은 의견 바랍니다. 혹시 강의를 해보신 분들께서는 강의 시간에 대해서 조언을 해주시면 정말 큰 도움이 될것 같습니다.

기타 의견은 여기에 써주세요



고도리 (2005년 12월 23일 오후 04:59)
1년 과정으로 너무 많은 것을 하는것 같네요....^^

실무쪽에서 볼 경우 가장 힘든 부분은 임베디드 파트보다는, C와 같은 프로그래밍언어에 대해 익숙하지 않은 것입니다.

보통 임베디드의 경우 바로 입사한 사람한테 주지 않습니다. 잘못했다 난리나면....^^

해서 보통은 application쪽을 많이 시킵니다. 말이 임베디드지 OS쪽 올라가면 끝이거든요.....

간단하게

1. 최소한 C는 잘 다뤄야 한다. app를 웬만한 거는 알아서 짤 정도 2. 세팅법 위주로는 삼가했으면.... 3. 직접 hw를 제작까지 해봐야 하나, 올려주신 자룔보면 hw를 직접 하실 생각인것 같은데, 보통 보드당 LCD 없는 보드 개발비만 1000~2000 정도 잡아야 할겁니다(물론 이것보다는 안들지만 실패감안) 4. wince나 리눅스나 한쪽만 하는게 나을 것 같다.

등이지만, 실제로는 타겟보드를 간단하게 나마 떠 보고(아니면 기본만 된것을 사다가) sub boad를 하나 만들어서 거기에서 직접 driver 올려보고 작업하는게 많이 배울 수 있을 듯 합니다.

최소한 한번만 만들어보면 자기게 되니깐요(궂이 다가 아니고 디바이스 하나만이라도요.)



일단 현실적으로 제 주위 친구들의 반응을 예상하자면,

1. 23만원 더 들어가네? 등록금도 350만원이고 책값도 한 학기에 15만원씩 나가는데..그냥 다른거 듣자.

2. 수업 시간 빡빡하다. 아무리 기초가 되는 과목 들어두었지만, 이 과목 하나만 하는 것도 아니고 이거 듣다간 이번 학기 말리겠다.

저도 위 생각과 비슷하지만,

2학기 내용은 흥미롭네요.^^;;



학기는 이론 위주고 2학기는 실습 위주인 것 같네요. 그런데 1,2학기 강좌가 독립적인 건지 통합된 건지가 불분명합니다. 구성에 영향을 미칠 수 있는 문제라고 생각하는데요.

역시 제일 맘에 걸리는 건 보드 값 23만원. 다른 곳에서는 어떻게 하고 있는지 모르겠지만, 학교 수업이고 하니 학교에서 지원을 받을 수 있다면 좋겠습니다. 보드를 한번 쓰고 버릴 것도 아니니..

1학기 수업의 경우, 실습을 막판에 몰아서 하는 것처럼 쓰여 있는데 저는 별로 좋아하지 않는 스타일입니다. 가능하면 중간중간에 실습거리를 많이 만들어주세요. 그리고 컴공과 학생이라면 datasheet에 익숙하지 않을 수 있으니 그런 걸 많이 읽고 실습해볼 수 있도록 하면 좋을 것 같네요.

2학기 수업의 경우, 다른 부분은 잘 모르겠고 환경 설정에 너무 많은 시간을 투자하는 건 아닌지 걱정입니다. 환경 설정은 문서만 잘 만들어주고 질답만 좀 해주면 대부분 맨땅에 헤딩해가면서 잘 구축하기 때문에 시간 배분을 적게해도 좋을 것 같네요. 보충수업으로 해도 되고요.


제 생각에는 하드웨어와 커널에만 너무 편향되어 있는 것 같습니다.

시스템 효율을 높이기 위한 다양한 방법(initscript라던가 파일시스템 선택, 루트이미지 구성)이라던가 GUI툴킷 선택, 등등 모두를 알려주는 건 무리일지 모르지만 간단한 언급이라도 있는게 좋을 것 같습니다. 그리고 마지막으로 자기힘으로 문제를 해결할 수 없을 때 대응 방법(버그질라나 메일링 리스트 접근 방식)등도 언급해주면 금상첨화일 듯 합니다.


  1. 보드를 구입하라는 것은 엄청난 진입장벽입니다. 이게 이번 과목만을 위한 장비가 아니라면 학교에서 구입하도록 하셔야 할 듯.
  2. 학교에서의 수업은 무슨 단기간 프로젝트가 아니라면 좀더 쉽고 일반적인 내용을 배워야 합니다. 또 4학년 과목인바, 너무 어려우면 중간에 모두 포기하고 폐강의 위험도 있습니다. 쉽고 만만하게 보이게, 그러나 실력 향상에 도움이 되는 방향으로
  3. 수업이 한두시간 밖에 안되는 내용입니다. 수업 따로 실습따로 하면 효과(?)를 절대 얻을 수 없습니다. 강의 한두시간에 실습 2시간으로 해야 이런 류의 수업이 효과가 극대화됩니다.
  4. 수업의 연장선상으로 과제를 내는 것도 중요합니다. 과제를 집에서도 할 수 있어야겠죠. (그래서 보드를 구입?)
  5. 빡세도 재밌어야 합니다. 4학년동안의 수업중 가장 기억에 남는 수업이라는 말씀을 듣고 싶으시다면 조금만(?) 시간투자하면 쉽게 풀릴 수 있도록 해야합니다. 어려운 문제는 그 해결법도 미리 제시해놓으셔야 하고요. 성취욕의 극대화, 쉽고도 어렵게(?) 지속적인 자극 등등이 필수.


제가 생각하는 임베디드 리눅스랑은 좀 다른거 같네요~

너무 커널 포팅쪽으로만 가게 되는거 아닌지 모르겠습니다. 많은 상용보드에서 리눅스 포팅하는 법은 자세히 나와있지 않나요? 아무튼 실무에서 접해야할 지식이지 학교에서 해야할 지식은 아닌거 같은 느낌이......

디바이스 드라이버개발 과 디바이스 드라이버 이용해서 프로그래밍 하는 방향은 어떤지 모르겠습니다...

임베디드 리눅스인데 1학기에서는 하드웨어를 공부하는 느낌이군요. 실질적으로 하드웨어를 제작하는 것이 아니라면 그냥 2학기 커리큘럼이 좋아 보입니다. 그리고 1,2학기로 나누신다면 2학기의 과제를 하시고 임베디드 보드에 있는 I/O를 사용하는 제어 프로그램쪽으로 생각해는 것이 좋을 것같군요. 제어만이 아니라 입력과 출력을 위한 장치를 붙일 수도 있고 특정한 데이터를 전송하는 것도 가능하지요. 간단한 신호를 받아들이는 바퀴달린 로봇같은 것도 가능하고요.

임베디드 시스템의 회로보다는 내부 리눅스의 포팅과 에플리케이션의 개발 그리고 이를 사용한 외부 장치와의 연계를 생각해보시는 것이 좋을 것같군요.

1. 99학번 너무 빡세다. 학부 과정으론 어려울 것 같다.

2. 98학번 2학기 과정을 압축해서 1학기에 넣어야 할 것 같다. (1년 과정보단 1학기 정도로 압축) 리눅스 설치, 개발환경 설정, 부팅과정 이해 등은 임베디드 시스템 선수 과목으로 더 적합할 듯.

3. 00학번 어렵게 느껴짐. 대학원 진학 목표로 삼은 애들 아니면 안 들을 거 같음. 임베디드 시스템이란 과목이 있기에 학부 과정에서 듣는 과목으론 메리트가 없을 듯. 하드웨어 위주의 내용 4학년 때 어려운 과목 듣는 사람이 있을까.

4. 동갑내기 친구, 대학교 가지 않고 바로 취업함. 현재 모바일 자바 프로그래머(경력 5년)

(대학 수업을 들어보지 않아서 시선이 좀 다를 수도 있습니다) bit 컴퓨터 임베디드 과정에서도 아무것도 모르는 상태에서(c정도 알고) 실무배치까지 6개월 정도 (3개월 이론, 3개월 실습) 하루 8시간 빡세게 배운다. 기초강좌라 하기엔 내용이 너무 상업적이고, 상업적인 내용이라고 하기에는 공부하는게 너무 짧다. 어정쩡하다.

제생각에는 학부에서 그런 내용으로 수업하면 2~3명 끝까지 (제대로)따라오면 성공일듯합니다. 실제로 커널을 직접 포팅하려고 보면 필요한 사전지식이 너무나 많습니다. gurugio님은 학생들이 너무 열정적일꺼라고 생각하시거나(이건 아닐꺼같구요...), 자신이 알고있는 지식들을 처음접하는 사람들이 익히기까지 걸릴 시간들을 너무 짧게보시는것같습니다.

"좀더 빨리 쉽게 배울수 있도록 해주는것"이 목적이시라면 PC상에서의 디바이스 드라이버 제작으로 방향을 잡으시는것이 더 좋을것같습니다. 간단한 char device driver같은 경우는 linux를 잘 모르는 사람도 쉽게 배울수 있습니다. 여기서 좀더 나가면 프린터포트를 이용해서 하드웨어도 한번 제어해보고, plx칩에 led랑 스위치 몇개 붙여서 보드하나 뜨시면 간단한 pci card드라이버도 실습해보실수있습니다.

웬만큼 복잡한 드라이버가 아닌이상 디바이스 드라이버가 커널포팅보다 필요한 사전지식도 적고, 접근하기 쉽습니다. 그리고 실무에서도 커널포팅보다는 디바이스 드라이버에 대한 지식이 훨씬 많이 필요합니다. 학생들에게 비싼돈 들여서 보드구입하게 해가면서 포팅 수업하시는것보다는 pc환경에서 디바이스 드라이버 수업하시는게 훨씬 도움되지않을까 생각됩니다.

제 경험을 말씀드리면 우리 과에 임베디드 시스템이라는 강좌가 있습니다. 4학년 1학기에 듣는 강좌인데 Computer as Component인가? 하는 책을 강의 교재로 사용했었습니다. 수업 내용은 강의 교재 내용을 기본으로 해서 교수님이 별도로 준비한 자료로 ARM, Xscale 등의 주요 임베디드용 프로세서들의 구조, 특징, AMBA 버스 등을 배웠고 기말 텀프로젝트로 ARM 보드를 이용한 프로젝트가 나왔습니다. 프로젝트는 네 단계로 진행되었는데 처음에는 Armulator를 이용한 간단한 프로그래밍, 두번째는 U-boot를 이용한 LCD와 키패드 제어, 세번째는 LCD와 키패드를 제어하는 리눅스 디바이스 드라이버 제작, 네번째는 자유 주제 프로젝트였습니다. 두번째부터는 2인 1조였구요. 자유 프로젝트로는 화상 인식을 이용한 게임(플스 게임 모작), 필기인식 계산기, 지문 인식 시스템 등이 나왔습니다.

이 모든 것이 한 학기 강좌였고 대부분의 학생이 프로젝트를 그런대로 마무리했습니다. 4학년 1학기였기에 이전 코스를 생각해보면 C언어에 대한 기초 지식 정도가 있는 상황에 리눅스는 bash 약간, vi 약간 정도 쓸 줄 아는 상태가 대부분이었을 겁니다.

그러나...

개인적으로는 아주 힘든 강좌였고 이클립스의 편안한 프로그래밍에 젖은 저에게 ARM 보드를 이용한 프로그래밍은 욕 나오게 하는 환경이었죠-_- 대부분 해내긴 했지만 졸라 힘들었다는 반응이었구요.

일단 컴공이냐 전기공이냐, 대상이 몇 학년이냐에 따라 달라질 것 같습니다만 제 생각을 말하라면 일단 임베디드보다 리눅스를 먼저 배우는 게 좋을 것 같습니다. 리눅스에 좀 익숙해진 상태여야 임베디드 리눅스 상의 프로젝트를 제대로 수행할 수 있습니다. 그래서 리눅스 강좌를 먼저 한다고 본다면..

커널의 구조나 소스를 공부할 필요는 없는 것 같습니다. 그냥 5분 정도 커널 소스 트리 구조만 간단히 설명해주면 될 것 같습니다. 리눅스의 커널 이해가 목적이 아닌 이상 이걸 깊이 파는 것은 시간 낭비가 될 가능성이 큽니다. 그보다 리눅스상의 개발 환경에 충분히 익숙해질 수 있도록 다양한 툴을 소개해주고 스스로 선택해서 익숙해질 수 있도록 적당한 프로그래밍 과제를 두어 번 내주는 게 필요합니다. 부트로더 역시 중요한 부분은 아니라고 생각합니다. 그리고 디바이스 드라이버의 동작 구조를 강의하고 나서 PC용 디바이스 드라이버를 만들어보는 프로젝트를 내주면 한 학기 마무리로 괜찮을 것입니다. 강좌명은 리눅스 프로그래밍 정도?

임베디드 강좌는 ARM만을 타겟으로 삼는다면 임베디드 시스템의 많은 이론들은 설명할 필요가 없을 테니 생략한 판단은 좋은 것 같습니다. 대체적으로 차근차근 따라하기 괜찮은 과정인 듯 싶습니다. 다만 ARM 어셈블리는 그냥 Instruction Set을 소개한다는 의미로 간단히 하고 실습은 무의미할 것 같습니다. 마지막 프로젝트를 ARM 상에서 디바이스 드라이버를 이용한 간단한 프로젝트로 생각하고 그 앞에 세네 번 정도의 작은 프로젝트를 내주면 될 것 같습니다

바로 임베디드 리눅스로 넘어가는 것은, 리눅스에 관심있는 학생들의 등을 밀어 진입장벽이란 이름의 언덕을 넘도록은 해주겠지만,

리눅스에 관심없는 학생들은 되려 언덕에 발이 걸려 넘어져, 오히려 리눅스를 '어렵고 재미없는 것'이라 생각하도록 하지 않을까, 두렵습니다.


바로 리눅스에 관심갖게 하는것 보다, 차근차근 단계별로 접근시키는 쪽이 훨씬 수월하다고 생각합니다.

오픈소스 프로그램을 하나 써보도록 하고, 거기에서 '마음에 안든다'는 점을 수정토록 하면, 스스로 '오픈 소스의 장점'을 깨닫게 되겠지요. 소스 수정이 아니라, 웹사이트 버그트래킹 페이지에 버그를 올려, 자신이 보고한 버그가 바로 수정되는 것을 시작으로 삼을 수도 있을 겁니다.

그리고 난 후에야, 커널 소스가 공개된 리눅스의 장점을 알아가겠지요.



라고는 하시지만 석사 과정이 아니고 학부 과정이라면 강의의 목적을 공지한다고 해서 그 수업을 듣는 모든 학생의 의도와 맞아떨어지지는 않을 것입니다. (사실... 석사 과정이 더하죠...)

어ㅤㅉㅐㅎ든, 제 의견은 듣는 학생들에게 좀 더 재미를 줄 수 있는 내용이 되어야 하지 않겠느냐 하는 겁니다. 사실 나열한 수업 내용으로 재미가 있기에는 좀 쉽지 않을듯 싶습니다. 응용 프로그램 레벨을 다루지 않는다고 하셨으니 초보자는 더더욱 재미있을 내용도 없을 것 같구요. 더구나 최초 커널 빌드가 수업 시작후 8주나 지나서라는 것(커널 연습)은 심각한 문제가 있을것 같습니다. 마지막 수업에 이르러서야 완전한 커널을 만들어볼 수 있다니..., 그렇다면 한학기 수업을 들어서 만든 커널을 써볼 수도 없다는 얘기가 아닌가요...

제 생각에는 "Hello, World"처럼 첫주부터 커널 빌드를 하는 것이 어떨까 하네요. 예를 들면 이런 식이죠. 시작 첫주에 구매한 보드에서 그럭저럭 쓸만할 정도의 리눅스가 올라가서 돌아갑니다. 사용자(학생)은 거기서 허름하지만 응용 프로그램을 돌려볼 수 있습니다. 그 다음 몇시간동안 몇개의 자잘한 패치(디바이스 드라이버?)로 X가 뜨는 것을 본다던가, 사운드가 나오는 것을 듣는다던가 하는 기쁨을 느낍니다. 수업의 마지막 과제에 이르러 새 커널부터 포팅을 해봅니다.

학생 입장에서 수업은 꼭 들어야 하는 것이지만, 문제는 그것이 "꼭 들어야만" 하는 것이라는 겁니다. 강의하실 때에는 학생들이 "그저" 듣기만 할 뿐이라는 것을 생각해주세요. 그렇게 안하려면 강의하시는 분이 많은 신경을 쓰셔야 합니다.

제 의견도 그냥 제 생각일 뿐이구요... 가장 확실한 것은 내년에 당장 수업을 들어야 하는 3학년이나, 올해 비슷한 수업을 들었던 졸업생한테 물어보는 게 아닐까 싶네요. 가능한 한 많은 사람들에게. _________________ 재미없는 일은 하지 말자는 인간 쓰레기. -.-;



좋은 의견들 감사드립니다. 계속 의견 올려주시면 다음 주 초에 종합해서 수정된 강의 계획을 만들겠습니다. 정말 감사합니다.



sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-01-20 10:28:42
Processing time 0.0118 sec