안녕하세요 임베디드에 입문한 4학년 대학생입니다. 리눅스 관련 질문이에요!

kkzzisung의 이미지

안녕하세요 현재 다음학기에 있을 졸업작품 때문에 avr을 공부하고 있습니다. Avr을 조금 만져본 경험이 있기 때문에 이번달까지 해볼 예정이고 6월부터는 cortex-M3를 아키텍처부터 새롭게 배울 예정입니다. 그런데 MCU를 다루는것도 정말 중요하지만 리눅스도 정말 중요하다는 글을 많이 봐왔습니다. 그래서 현재 2학년 과목인 리눅스 시스템을 통해 기본적인 것과 명령어를 익히고 “디버깅을 통해 배우는 리눅스 커널의 구조와 원리”라는 책을 독학해볼 예정입니다

즉 Avr>ARM과 리눅스>졸업작품(ARM+리눅스 꾸준히)라는 루트를 진행할거 같습니다.

저는 개인적으로 임베디드 리눅스에 관심이 생겨서 공부를 할 예정이지만 방향성이 뚜렷하지 않아 살짝 걱정되는 부분이 있습니다. 혹시 임베디드 리눅스 공부 방향성과 신입에게 필요한 지식 그리고 임베디드에게 있어서 리눅스가 무엇인지 궁금해서 현직인분들께 여쭤봅니다!

AustinKim의 이미지

시스템 소프트웨어 12년차 개발자인데요. 저의 짧은 소견을 말씀드리면;
임베디드 개발자로써 익혀야 하는 핵심 역량은 다음과 같다고 생각됩니다.

* CPU 프로세서: Arm 아키텍처
* 운영체제: 리눅스(커널, 드라이버, 시스템 프로그래밍)
* SoC: 라즈베리 파이의 bcm2835와 같은 MCU
* 유틸리티: 욕토, GIT
* 하이퍼바이저, 도커(알아두면 좋음)

최근에 떠오르는 전기 자동차(인포테인먼트)와 스마트 가전 그리고 로봇의 기반 제품은 대부분 'Arm 프로세서 + 리눅스'로 조합의 기술을 활용해 개발하고, 위에서 언급한 기술의 범위를 벗어나지 않습니다.

제가 쓴 “디버깅을 통해 배우는 리눅스 커널의 구조와 원리” 책도 보시면 좋지만, 더 좋은 책인 '임베디드 OS 개발 프로젝트 ARM 기반 펌웨어/RTOS의 원리와 구조'도 같이 보시면 많은 도움이 될 것입니다.

http://www.yes24.com/Product/Goods/84909414

추가로 임베디드 개발자로써 커리어나 개발 방향에 대해 궁금한 점이 있으면 '[오제이 튜브]OJ Tube' 채널 라이브 방송에서 질문하셔도 좋습니다. 매주 토요일 밤 9시에 실시간 라이브 방송을 진행하거든요.

https://www.youtube.com/c/%EC%98%A4%EC%A0%9C%EC%9D%B4%ED%8A%9C%EB%B8%8COJTube

그럼 건승을 빕니다.

(개인블로그)
http://rousalome.egloos.com

kkzzisung의 이미지

좋은 정말 말씀 감사합니다!
이번 학기 C언어와 리눅스 시스템(커맨드 라인, gdb 등 기본적인것들)이 마무리 된다면 여름방학에는 ARM을 공부할거 같아요. 현재 리눅스를 배우고는 있지만 아직 왜 배워야하는지 이유와 방향성을 못잡고 있습니다. 리눅스에도 커널, 드라이버 등 다양한 분야가 있는데 어떤걸 먼저 터득해야할지 잘 모르겠습니다. 라즈베리파이 하나 사서 커널을 공부해볼까 했는데 생각보다 막상 회사들어가면 커널을 안다룬다고도 하고...제가 가고있는 방향이 맞나 싶습니다. 임베디드를 하고 싶어서 시작했지만 커뮤니티&책이 전부라서 직접적인 질문을 하기가 생각보다 힘드네요. 죄송하지만 몇 가지만 더 질문하겠습니다!

Q1: ARM CORTEX M3에서 SPI, UART, PWM 등 데이터시트를 보고 다룬 다음에 토이 프로젝트를 하지 않고 ARM CORTEX A시리즈로 넘어가 리눅스 포팅을 해보는것도 괜찮을까요?(프로젝트 경험은 AVR 뿐입니다.)
Q2: 리눅스 시스템을 배웠다면 드라이버나 커널쪽을 공부하는것도 괜찮을까요?
Q3: 저만의 공부 스토리가 없는거 같아서 방향을 잡기가 힘든거 같습니다. 약간의 방향성만 제시해주신다면 정말 큰 도움이 될거 같습니다. 감사합니다!

AustinKim의 이미지

질문에 답을 드리겠습니다.

Q1: 'ARM CORTEX M3'을 주로 소형 디바이스에 주로 활용됩니다. 'ARM CORTEX M3 + RTOS(베어 베탈)' 조합이죠. 'ARM CORTEX M3'와 관련된 실습을 하시고 'ARM CORTEX A시리즈' 프로세서를 접하셔도 좋습니다.

Q2: 우선 간단한 리눅스 드라이버를 시작으로 범위를 넓혀가시는 걸 추천합니다. 처음 리눅스 커널을 목표로 시작하면 도중에 포기하는 경우가 많습니다(제가 그랬어요.)

아래 사이트에 라즈베리 파이에서 실습할 수 있는 유익한 리눅스 커널 드라이버 샘플 코드가 있으니 참고하셔도 좋습니다.

https://embetronicx.com/tutorials/linux/device-drivers/workqueue-in-linux-dynamic-creation/

Q3: 위에 소개한 드라이버 코드를 실행하시고 조금 씩 개선해보시는 건 어떨까요? 달성하기 어려운 높은 목표를 잡는 것 보다는 조금 씩 흥미를 잃지 않으면서 꾸준히 할 수 있는 아이템을 잡으시는게 좋은 것 같습니다.(개인적으로 제가 이런 방식을 선호합니다)

(개인블로그)
http://rousalome.egloos.com

owlet의 이미지

1: 리눅스상에서의 외부 인터페이스 사용은 bare metal이나 rtos와 접근방법이 다릅니다. 저는 avr이나 cortex m3에서의 프로젝트는 물리적인 동작을 이해하는 이상의 의미는 없다고 보며 임베디드 리눅스를 위해서라면 추천하지 않습니다.

2: 요즘은 임베디드에서도 device tree만 잘 맞춰주면 되는 경우가 많습니다. 하지만 device tree 설정을 고치려해도 문서가 없는 경우가 많아 드라이버 소스를 봐야하는 경우는 많습니다.
그리고 하드웨어 문제인지 소프트웨어 문제인지 불명확할때도 커널쪽을 알면 도움이 됩니다.
이외에도 커널 내부를 알면 도움되는 경우가 많습니다.

3. 임베디드라고하면 arm만 생각하는 경우가 많습니다만 사실 cpu가 무엇인가는 중요하지 않은 경우가 많습니다. 시스템 전체의 구성이 어떻게 되는지 필수 프로그램들이 어떻게 동작하는지 전체적으로 한번 보시면 좋을것 같습니다. 개발보드가 없어도 virtualbox등의 환경에서 x86기반으로 시스템을 한번 구성해보시는것도 좋을것 같습니다. yocto나 buildroot등의 개발환경에서 타겟을 x86으로 잡고 빌드 후 가상환경에서 실행해보시면 됩니다.

라스코니의 이미지

Q1: 아키텍쳐는 중요하지 않습니다. 대중적으로 많이 사용하는 CPU에 대한 경험은 도움이 되는 것이 적지는 않겠지만 CPU를 설계하거나 CPU 포팅을 하지 않는 이상 큰 장점이 없습니다. 더군다나 이분야 공부 초반에 이 부분에 대해서 적극 투자할 필요는 없다고 봅니다.

Q2: 리눅스는 단순 유저가 아닌 개발 플랫폼으로 상당히 좋습니다. 소스가 공개되어 있고 관련 프로젝트도 많아서 그렇구요, 공부에 참조할 자료나 커뮤니티가 다른 것에 비해서 풍부하죠. 그래서 많은 CPU에 포팅도 많이 되어 있습니다. 문제는 너무 복잡하다는 것인데 간단한 드라이버 예제를 돌리면서 어떻게 커널과 연결되는지 그 calling convention과 구조체 설계 코드 쪽을 보세요. 함수 자체를 이해하는 것보다(이해하기도 어렵고) 코딩 규칙 같은 것을 익혀 보세요.

Q3: 작지만 본인이 직접 많은 것을 해볼 수 있는 프로젝트 예제를 찾아보시고 그것을 참고해서 scratch 부터 시작해서 끝까지 직접 만들어 보세요. 결국에는 data structures and algorithms 이런 부분으로 귀결됩니다. CPU 자체는 중요하지 않습니다. 끝에는 라이브러리를 작성하는 알고리즘 능력, 라이브러리를 운용하는 깔끔한 인터페이스 이런 것들이 중요합니다. 가상환경에서 QEMU나 또는 실제 AVR, Atmel, 에디슨 보드 등을 이용해서 시작해 보세요. 디버깅 환경이 잘 지원되는 시스템을 사용해서 숱하게 발생하는 crash도 원격으로 잡아보고 해 보세요.