임베디드 소프트웨어 개발자가되는 방법?


22

좋은 임베디드 소프트웨어 개발자가되고 싶거나이 분야에서 개선하고 싶은 사람들을위한 몇 가지 팁을 원합니다.

하드웨어, 소프트웨어에 대해 무엇을 배워야합니까?

어떤 책이 가장 권장됩니까? 블로그?

결국 초보자 애호가에서 훌륭한 전문가로 어떻게 갈 수 있습니까?

답변:


39

모든 대답은 지금까지는 좋았지 만 2 센트를 넣겠습니다.

다음은 약간의 팁과 추가 팁이 있습니다.

  • C : 여전히 이식 가능한 하드웨어의 기본 언어 (어느 정도)를 배우십시오. 배우는 것뿐만 아니라 휘발성과 같은 모든 기능과 장치 드라이버 작성에 왜 중요한지 전문가가 되십시오.
  • Arduino와 같은 좋은 개발 키트로 시작하십시오.하지만 앞서 말했듯이 다른 아키텍처를 배우면 좋은 느낌을 얻습니다. 운 좋게도 다른 프로세서로 제작 된 Arduino 호환 보드가 있으므로 다른 uC에서 동일한 디자인을 다시 작성하여 새로운 디자인을 느끼면서 전체 디자인을 망칠 수는 없습니다.
  • 학습 단계에서는 장치 드라이버 또는 다른 코드에서 휠을 다시 발명하십시오. 다른 사람의 드라이버 코드를 내려 놓지 마십시오. 학습 할 때 바퀴를 다시 발명하는 데 가치가 있습니다.
  • 속도와 메모리 사용량 측면에서 코드를보다 효율적으로 다시 작성해야합니다.
  • 다양한 스타일의 임베디드 시스템 소프트웨어 아키텍처에 익숙해 짐. 기본 인터럽트 구동 / 백그라운드 루프 처리로 시작한 다음 백그라운드 스케줄러로 이동 한 다음 실시간 운영 체제로 이동하십시오.
  • 좋은 소스 컨트롤을 얻으십시오! 나는 Mercurial을 선호합니다 .
  • Sourceforge.net 또는 Bitbucket.org 와 같은 무료 소스 제어 호스팅 사이트에 가입 하여 프로젝트를 진행하는 유일한 사람 일지라도 프로젝트를 호스팅하십시오. 코드를 백업하므로 하드 드라이브 충돌로 인해 모든 것이 망가질 염려가 없습니다! 분산 VCS를 사용하면 편리합니다. 준비가되면 하드 드라이브의 변경 사항을 체크인 한 다음 호스트 사이트에 업로드 할 수 있기 때문입니다.
  • 작업중인 칩에 맞게 도구를 익히십시오! 컴파일러가 어셈블리를 작성하는 방법을 아는 것이 중요합니다. 어셈블리에서 다시 작성해야 할 수 있으므로 코드의 효율성에 대해 알아야합니다. 링커 파일을 사용하는 방법을 알고 메모리 맵 출력을 해석하는 것도 필수적입니다! 방금 작성한 루틴이 너무 많은 ROM / 플래시를 차지하는 원인인지 어떻게 알 수 있습니까?
  • 새로운 기술을 배우고 디자인에서 실험 해보십시오!
  • 디버깅 할 때 아무 것도 가정하지 마십시오. 그것을 확인하십시오!
  • 오류를 포착하고 가정을 확인하기 위해 방어 적으로 프로그래밍하는 방법 알아보기 (예 : assert 사용)
  • 메모리 소비를 출력하거나 타이머를 사용하여 코드를 프로파일 링하거나 uC에서 예비 핀을 사용하여 O- 스코프에서 인터럽트 대기 시간을 토글하고 측정하는 등 디버깅 정보를 코드에 빌드하십시오.

여기 몇 권의 책이 있습니다.

다음은 일부 웹 사이트입니다.

  • 임베디드 전문가
  • Ganssle Group Jack Ganssle은 훌륭한 역사적 이야기를합니다. 기사를 읽으십시오. 그는 몇 가지 일에 대해 조금 설교합니다.
  • Embedded.com Ganssle, 바, 및 기타 업계 전문가의 최신 기술과 팁에 대한 좋은 정보.

1
@Adam : 나는 그 책을 좋아한다! 실용 프로그래머! 나는 그것을 잊었다 믿을 수 없다!
Jay Atkinson

1
Mercurial의 경우 +1 나는 그것을 좋아하지만 git의 숙련도가 더 가치가 있다고 생각합니다. 다른 프로젝트에 기여하거나 다른 프로젝트에서 사용하려는 경우 SVN을 사용하여 기본 사항을 파악하는 것이 매우 중요합니다.
tyblu

17
  • "은 총알이 없다"는 것을 기억하십시오. 모든 문제를 해결할 수있는 하나의 도구, 방법론, 언어 또는 시스템이 있다고 믿는 함정에 빠지지 마십시오.
  • C의 전문가가 되십시오
    • malloc () 및 POSIX없이 얻는 방법 배우기
  • 하나의 아키텍처에 매달리지 마십시오. 우연히 PIC, AVR 또는 ARM 팬보이가되기 쉽습니다.
  • 물건을 만들고 디버깅하고 작동시킵니다. 연습은 완벽합니다
  • 최소한 하나의 소스 제어 시스템 (SVN / git / etc)을 배우고 사용하십시오
  • 항상 가정을 테스트 할 준비를하십시오. 버그는 일반적으로 작동한다고 가정하는 것입니다.
  • 디버거에 너무 의존하지 않고 모든 시스템과 안정성이 다릅니다.
  • 검소하게 생각하십시오. 문제 해결시 코드 풋 프린트, RAM 풋 프린트 및 하드웨어 비용에 대해 생각하십시오

책의 경우 역사를 파는 것이 좋습니다. 오늘날 임베디드 소프트웨어 기술의 대부분은 전년도의 최첨단에서 비롯됩니다.

무엇이든 매일 연습하십시오.


5
내가 배운 모든 것 중에서, 버전 제어 (현재는 subversion을 사용하고 있음)가 생산성에 가장 중요한 것입니다. 우리는 여기서 시작할 때 Microsoft의 소스 안전을 가지고 있었으므로 나쁜 솔루션을 사용하고 좋은 것을 사용했습니다.
Kortuk

소스 제어 시스템이 없으면 내 인생을 상상할 수 없습니다. 현재 SVN도 사용하고 있습니다. SVN을 알기 전에 어떻게 작동하는지 모르겠습니다.
Daniel Grillo

1
"버그는 일반적으로 효과가 있다고 가정하는 것"에 +1
JustJeff

"malloc없이 배우는 법"-왜? 스택 / 힙 충돌의 위험을 최소화하려면?
rzetterberg

@rzetterberg 많은 임베디드 시스템은 동적 메모리 할당의 사용을 피하여 힙 조각화 및 비결 정성을 초래할 수 있습니다.
Toby Jaffey

8

다른 답변은 훌륭하지만, 취미와 전문가의 가장 큰 차이점은 품질에 대한 사고 방식이어야합니다. 따라서 프로젝트를 끝까지 진행하십시오. 프로젝트를 80 % 완료했을 때 멈추지 마십시오. 끝까지 가져가 작동하는지 확인하고 올바르게 문서화하십시오.

코드를 읽고 유지 관리 할 수 ​​있는지 확인하십시오.

그리고 재미있게도 잊지 마세요 :)


7

C를 배우고 개발자 보드로 시작하는 것과 같은 명백한 것 외에도 마이크로 컨트롤러 데이터 시트읽는 법을 배우고 싶을 것 입니다.
제조업체는 점점 더 많은 기능을 마이크로 컨트롤러에 추가하므로 점점 더 복잡해지고 있습니다. 데이터 시트는 전기적 특성 (소프트웨어 개발자보다 전자 엔지니어에게 더 흥미로운)을 제공 할뿐만 아니라 레지스터, 메모리 맵 등에 대한 자세한 설명도 제공
합니다. 디버깅 단계에서 더 심한 두통을 유발할 수 있습니다.


3

'내장'은로드 된 용어입니다.

어떤면에서 제어 할 하드웨어가있는 한 단일 응용 프로그램을 실행하는 데 사용되는 모든 시스템을 내장 시스템이라고 할 수 있습니다. 로컬 I / O 모듈을 통해 프로세스를 제어하는 ​​경우 임베디드 시스템의 Linux에서 Java 애플리케이션을 실행하는 2GB의 RAM으로 400MHz PPC604를 호출 할 수 있습니다. 반면, 일종의 최소 네트워크 응용 프로그램을 실행하는 arduino는 임베디드 시스템이 아닙니다. 그러나 아마도 '임베디드 (embedded)'는 대부분의 사람들이 단지 수백 바이트의 RAM, 운영 체제가없고, 수많은 온칩 주변 장치를 갖춘 플래시 기반 컨트롤러를 생각하게한다.

즉, 임베디드 임베디드 시스템을 학습하는 두 가지 가장 큰 장애물이 아닌 임베디드 프로그래머는 일반적으로 I / O 레지스터 및 인터럽트입니다.

동시성 및 이벤트 중심 프로그래밍의 주요 문제는 종종 주류 응용 프로그램에서 종종 발생하기 때문에 비 내장형 프로그래머에게는 두 가지 개념 중 인터럽트가 실제로 처리하기가 더 쉬울 수 있습니다. 인터럽트를 고통스럽게 만드는 것은 인터럽트 처리 품질에 대한 시스템의 극도의 민감도와 인터럽트 조건을 지우고 다음 설정을 위해 하드웨어를 다루는 복잡한 점을 깨닫는 것입니다. GUI를 사용하면 교착 상태가 응용 프로그램 만 종료합니다. 인터럽트 핸들러를 사용하면 교착 상태로 인해 전체 시스템이 잠 깁니다.

I / O 장치가 가장 어려운 영역 인 것 같습니다. 미숙를 들어,이 레지스터를 읽는 것을 발견하는 것은 매우 놀라운 일이 될 수 있습니다 여기 것은 그 레지스터에 영향이 거기를 . 비트를 지우려면 1을 씁니다. 데이터 레지스터 등을 읽을 때 스스로 지워지는 상태 비트. I / O 하드웨어에는 장치 데이터 시트를 찾고 해석하는 방법을 배우는 것 외에는 처리 할 일반적인 규칙이 없기 때문에 많은 가능성이 있습니다. 직렬 포트 용 장치 드라이버를 작성하면 저수준 I / O 프로그래밍에 대해 많은 정보를 얻을 수 있습니다.

소매를 펴거나 베어 메탈에 간단한 C 및 / 또는 어셈블리 언어를 프로그래밍하는 것보다 이러한 것들을 배우는 것의 대안은 없습니다. 위에서 언급 한 자바 기반 임베디드 시스템조차도 결국 I / O를위한 장치 드라이버가 필요하며 이는 궁극적으로 일부 C를 다루는 것을 의미합니다. 경험은 최고의 교사입니다. MSP430, TMS320, AVR, ARM, PIC, 68HC11 등 마이크로 컨트롤러를 선택하고 평가 키트를 찾고 일부 시스템을 구축하십시오.


3

$50영형$그러나 당신은 직업적인 소형을 위해 납땜해야합니다. 나는 PIC 가족의 팬이 아니지만 당신은 역사 수업으로 무언가를 얻고 싶을 수도 있습니다. ARM과 Thumb, 아마도 MIPS (이전의 원본 PIC 아키텍처와 혼동하지 않는 pic-32)를 절대적으로 배우십시오. 스텔라리스도 가능하지만 ARMmite Pro는 훌륭한 보급형 ARM 보드입니다.

여기서 배우고 싶은 것은 다양한 플랫폼을위한 어셈블러입니다. C. C와 어셈블러 상호 작용 다른 도구 GCC 및 비 GCC 데이터 시트 / 프로그래머 참조를 읽는 방법 (그리고 모두 오류가 있거나 오해의 소지가 있음을 인식하고 절대로 믿지 말고 하드웨어가 문서보다 우선합니다) 및 회로도를 읽거나 사용하는 방법. 이들은 일반적으로 복잡한 회로도는 아닙니다. 많은 보드는 프로젝트에서 인터페이스하기에 좋습니다. 즉, 보드에 쓰레기가 없어 I / O 핀에 직접 액세스 할 수 있습니다. 그러나 그것은 학습에 가장 적합하지 않습니다. 스텔라리스 같은 것프로젝트에 고통스러운 보드는 임베디드 학습 및 드라이버 빌리기 / 사용하기 또는 데이터 시트에서 자신의 글쓰기를 배우기위한 많은 재미있는 것들을 가지고 있습니다. Atmel AVR 버터 플라이는 여전히 사용 가능한 경우 좋은 보드입니다. 직렬 포트를 납땜하여 프로그래밍하거나 구멍에 전선을 끼울 필요가 있습니다. 그것이 제공하는 것은 프로그래밍하는 법을 배울 수있는 몇 가지 주변 장치입니다.

Linux 또는 RTOS에서 SDK 또는 API 호출을 사용하여 응용 프로그램을 작성하는 작업 (하드웨어를 만지거나 데이터 시트를 읽지 않음)을 포함하는 임베디드 작업을 끝내더라도 위의 지식은 여전히 ​​나머지보다 앞서 있습니다.


3

이 기사 (포르투갈어에서 영어로 자동 번역됨)에는 임베디드 소프트웨어 개발자로서의 경력 개발에 대한 좋은 개요가 있습니다. 참고 : 원본은 여기에 있습니다 .

그것은 당신이 발전시켜야 할 지식의 영역을 개괄하는 것으로 시작합니다 :

  1. 지식 : 임베디드 시스템과 관련된 이론을 알아야합니다. 이것은 하드웨어와 소프트웨어를 의미합니다. 작동하는 하드웨어 아키텍처를 알지 못하면 임베디드 소프트웨어의 유능한 개발자가 될 수 없습니다.

  2. 특기 :이 지역에서 경험을 쌓아야합니다. 연습이 필요합니다. 모든 PIC 어셈블러 니모닉을 장식 할 수 있지만이 지식으로 LED를 구동 할 수없는 경우에는 사용되지 않습니다.

  3. 태도 : 무엇보다도이 분야에서 성장할 수있는 태도가 필요합니다. 빈번한 변경 및 개발로 매우 역동적입니다. 당신은 항상 동기를 부여 받아야합니다. 그러한 태도가 없으면 곧 당신을 줄 것입니다. 이 영역은 매우 강력해야합니다.

그런 다음 이러한 영역을 마스터하기위한 다음 팁을 제공합니다 (추가 텍스트로 개발하면 제목 일뿐입니다).

  1. 하드웨어를 배우기 위해 필요한 것 (적어도)
  2. 소프트웨어를 배우기 위해 필요한 것 (적어도)
  3. 또한 연구 운영 체제
  4. 훈련이 필요합니다
  5. 멈추지 말고 계속 배우고 네트워킹을 개발하십시오!

1
링크 주셔서 감사합니다! Google 번역은이 질문에 완벽하게 맞는 것으로 보입니다. 그러나, 우리는 (우리가있어 텍스트가 영어로되어 있습니다 (1) 그 원합니다 영어 커뮤니티 대답이 포함되어 있습니다 (2)에있는 경우에만 자동 번역 - 우리 중 많은 사람들이 이중 언어가 적어도, 비록) 링크가 중단 된 경우 기사 요약. 이 가이드 라인을 준수하도록 게시물을 수정했으며 이에 대한 의견을 제시했습니다.
Kevin Vermeer

2

임베디드 소프트웨어 엔지니어가되기 전에 두 번 생각하십시오. 나는 내 경력에 단계가있었습니다. 판매 / 마케팅으로 이전하는 것보다 처음 5 년 동안 소프트웨어를 개발했으며 15 년 동안 100 + M $ 비즈니스를 관리했으며 이제는 소프트웨어로 돌아 왔습니다.

15 년 후에 소프트웨어로 돌아 왔을 때, 내가 왜 처음에 떠 났는지 기억합니다. 그것은 어렵다. 집중력, 수백 줄의 코드가 서로 닿아 야하며 모두 메모리에 보관해야합니다. 임베디드는 특히 어렵다.

또한 자신을 이해해야합니다. 당신이 일반적으로 똑똑한 사람, 세심하고 인내심이 있다면 훌륭한 엔지니어가 될 것입니다. 당신이 그 중 하나를 누락하면 최고 평균입니다. 생각 해봐 당신이 매우 똑똑하고 인내심이 없다면 아무리 똑똑해도 훌륭한 엔지니어링은 인내심과 세부 사항에주의를 기울이기 때문에 가치가 없습니다.

또한 대화하지 않고 한 번에 코드 시간을 편안하게 볼 수 있어야합니다. 나는 훌륭한 사회적 기술을 가진 사람들이 이것을 견딜 수 없다는 것을 알게되었습니다.

이 모든 것이 체크 아웃되면 그 위대한 책을 모두 읽는 것보다 연습을하면 훌륭한 엔지니어가 될 것입니다.


1

다른 사람들은 모두 위대한 말을합니다. 따라서 일반적인 조언을 드리겠습니다 : 읽기 읽기 읽기 읽기 읽기 읽기 읽기 읽기!

http://embeddedgurus.com의 모든 기사를 읽으십시오 . 이해가되지 않는 경우 조사하십시오. 그러한 것들에 대한 설명에서 당신이 이해하지 못하는 것을 발견하면, 좀 더 읽으십시오. 임베디드 소프트웨어 직책을 맡을 예정이며 지난 몇 년 동안 소수의 전문 프로젝트와 많은 독서 경험을 쌓았습니다. 경험을 통해 시험해 볼 수 있지만 읽기는 시도한 내용이 이전보다 더 나은지 알 수 있습니다. 어떤 상황에서도 작업 할 수있는 개념을 소개합니다.

그냥 읽어보세요!


0

C 이해 타이머 및 직렬 통신 전문가가 되십시오. 손이 더러워 져야합니다. RF 프로토콜을 이해하고 요구 사항에 맞게 조정하십시오. 디버깅하는 동안 코드 조합을 맹목적으로 시도하지 마십시오. 코드는 사용자가 지시 한대로 정확하게 수행합니다. 사용 설명서와 데이터 시트를 읽고 작동하지 않으면 변경하십시오. 말과 행동 모두 전문가가되는 유일한 방법은 연습하는 것입니다. 응용 프로그램을 계속 구축하십시오. 곧, 그것은 두 번째 본성이 될 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.