이노므 임베디드.. 어렵습니다.

얍삽하게한방의 이미지

안녕하세요. 답답해서 글을 올려봅니다.

처음 사회에 나와서 윈도우용 어플리케이션을 개발하였었고 3개정도.. 2년 반 정도 걸렸습니다. C++ 이용.

그러다가 리눅스용 어플을 개발하였고..2개정도.. 현재 3.5년 정도 경력이 있습니다.

거기까지도 할만 했습니다. 비주얼 스튜디오가 정말 잘만들었고 그 때 느꼈었죠.

윈도우나 리눅스에서 돌아가는 어플리케이션이야 가상 메모리를 쓰니까 그냥 필요할 때 new로 할당하고 쓰고 반환하고..

별 어려움이 없었는데.. 그냥 함수 인터페이스만 알면되고 하드웨어쪽을 고려하는 것은 메모리 용량이나 CPU, GPU 스펙 정도?

문제는 PowerPC라는 놈을 접하게 되면서 부터 시작하게 됩니다. OS는 VxWorks 로 일단 하고 나중에 다른 회사에서 OS를 만들면 거기에서

돌아가는 프로그램을 만들어야 하는데요. 지식이 전무하다 보니까 뭘 어떻게 해야할 지 모르겠네요. 대충 보니까 가상메모리를 못쓰는것

같더라고요. 지정된 메모리 주소에 데이터를 쓰고 읽어야 하는것 같고 UART로 통신해야 하는데 레지스터 설정 같은것은 어떻게 해야하는것인지

일단 MPC8349로 하드웨어가 되어있어서 데이터시트를 다운받아서 봤는데 어떤 부분을 봐야하는것인지도 잘 모르겠습니다. 하드웨어는 꽝이라

서요.. 간단한 소스라도 있으면 좋겠는데 어디서 자료를 찾아봐야 하는지도 모르겠습니다. 데이터시트는 어느부분을 봐야하고 그것을 보고

소스에서는 어떤식으로 설정을 해야하는지.. 예전에 학교 다닐때 마이크로프로세서 공부할 때는 그런 설정을 개발 툴에서 했던거 같은데..

생각이 안나네요. 그로인해 지금은 지금은 패닉상태입니다. -0-;;

저 나름대로 소프트웨어 엔지니어로서 프로그래밍에 자신이 있었는데 분야가 조금 바뀌니까 바보가 되는군요. ㅜ.ㅜ;;

일이 없을때도 소프트웨어 아키텍처나 다른 여러가지 공부 하면서 밤도 새고.. 열심히 했는데 말이죠

요즘처럼 자신이 무능력하게 느껴진적이 없었는데 제 자신이 너무 초라해 보이네요.

이 난관을 어떻게 해결해야 할 지.. 시스템 엔지니어분이나 이런쪽 경험이 있으신 분이나 잘 아시는분 조언좀 부탁 드립니다

NN의 이미지

무슨 결심을 하셨는지 몰라도 일반 application개발에서 임베디드쪽으로 분야 전향하는거 쉽지 않습니다.

거의 모든걸 새로 공부하셔야 한다고 봐야합니다. 개인적으로 난이도 면에서 "어플리케이션 개발 < 임베디드 개발" 이렇다는것엔 의문이 있지만, 많은 분들이 여기에 공감하고 계시죠.

하지만 어플리케이션 하다가 오신분들이 정말 힘들어 하시는게 뭐냐면..난이도 문제가 아니거든요. 구사하는 프로그래밍 테크닉도 오히려 어플리케이션쪽이 현란하지, 임베디드쪽은 굉장히 소박한 편입니다. 객체지향이니 뭐니 하면서 factory pattern쓰고, 간접 호출의 길다란 연쇄를 이용하거나 이러지는 않거든요. 제 생각엔 현란함으로 따지자면 어플리케이션 개발 분야가 더 나아요. 특히 뭣도 모르고 커널쪽에서 현란함 구사하다가 한방에 훅 가는 수가 있죠..

생각해보니 어플리케이션 개발하다 임베디드쪽으로 오신분들이 정말 힘들어 하는거 딱 두가지가 있네요.

우선 개발 환경이 일단 무지하게 복잡하다는거.. 이 분야에선 IDE툴로 모든걸 한방에 개발하는 경우는 없다고 봐도 되거든요. 빌드시스템과 타겟머신이 다르죠. 타겟머신은 또 자원이 제약된 시스템이기 때문에 많은 경우 시리얼 통신으로 디버깅작업 해야 하고요.. (디버깅도 어플리케이션 개발처럼 그렇게 앉아서 편하게 할 수 있는게 아닙니다.) 임베디드 잘 하시려면 이런저런 툴을 잡다하게 익혀두셔야 합니다. 하드웨어랑 연계시킨 생소한 툴도 많아요. 이게 의외로 어플리케이션 개발하다 임베디드쪽으로 넘어온 사람들에게 큰 걸림돌로 작용합니다.

그 다음 큰 산은 회로도 + 데이타 쉬트 읽는 법 + 하드웨어 자체에 대한 이해도 .. 이거는 방법이 없습니다. 초보자 입장에선 공부 + 잘 하는 사람에게 묻기 이렇게 할 수 밖에 없어요. 경력으로 커버해 나가려면 임베디드 생 초짜에서 적어도 2년 이상은 하셔야 합니다. 그래야 뭔가 감이 잡힌다..정도가 되고요. 이건 상대적으로 전기/전자 전공하신 분들이 유리하다 할 수 있습니다. 다이오드, 커패시터, 트랜지스터등등의 여러 소자들의 기능이나 전자공학적 이해가 어느정도는 뒷받침 되어야 하거든요. (굳이 다이오드, 커패시터까지 알 필요가 있는가? 싶겠지만, 회로도를 읽으려면 알아야 합니다. 그건 직접 해 보시면 압니다.)

마지막으로 한가지 조언 드리자면요...이 분야에선 소프트웨어 엔지니어 마인드를 살짝쿵 버리시는게 좋다는 말씀드리고 싶습니다. 그거 임베디드에서 별 도움 안됩니다. 일단 하드웨어랑 맞닿는 부분과 그 바로 위쪽 device dependant한 드라이버쪽까지는 SW라고 생각하시지 마시고 HW업체가 정해놓은 규약에 코드를 setting한다는 마인드를 가지셔야 합니다. 어플리케이션 개발하다가 임베디드쪽으로 넘어오신 분들이 여기서 좀 개념을 헷갈려 하시더라고요.. 그보다 위쪽에선 sw테크닉 맘껏(시스템 자원이 허용하는 한도 내에서) 구사하셔도 됩니다.

어쩌다 임베디드쪽으로 전향하셨는지 모르겠는데...이 분야 생초짜시라면 몇년 정도는 고생할 각오하셔야 합니다.

어떻게 아냐구요? 제가 그랬거든요... --;;

얍삽하게한방의 이미지

제가 전향한게 아닙니다. 회사에서 사업분야를 넓히려고 하는거 같은데.. 어쩌다 제가 들어가게 되었네요.

회사가 소프트웨어만 하는 회사라 하드웨어를 아는사람이 없습니다. 윈도용 어플리케이션 개발 --> 리눅스용 어플리케이션 개발-> 최근에는 임베디드로 손대는거 같네요

물론 전부 그 분야에서 하는것은 아닙니다. 저희팀만 합니다. 팀장님도 짜증냅니다 ㅋ. 회사에서 사업 분야를 나누는거 같은데..

그렇다고 그냥 나는 못한다고 하고 포기하자니 그건 또 아닌것 같고, 회사에서 도움을 주는것도 아니고, 경력자 뽑기도 쉽지 않은거 같아요.

NN님 말씀을 들으니 앞으로의 삽질 및 야근야근 모드가 눈에 보이는군요 ㅡ.ㅡ;;

ipes4579의 이미지

좋은 글, 좋은 답변입니다. 감사합니다 ^^

익명 사용자의 이미지

이 분 말씀이 맞습니다
답변을 읽어보니 피부 감촉 끝까지 직접 느껴보고 쓰신 글이네요

SoftOn의 이미지

지금 하실려는게 임베디드라고 예기하시지만 다른 회사에서 제공하는 OS 위에서 코딩하시는 것 같은데요.

그럼 특별히 H/W 공부 안 하셔되 될 것 같습니다.

VxWorks의 경우 BSP(Board Support Package)가 있는데요.

이것이 H/W랑 VxWorks 사이에 있습니다. 보통 보드 만드는 회사가 만들어서 같이 판매하죠.

그리고 프로그래머는 사실상 VxWorks OS에서 지원하는 API로 코딩하면 되고요.

예를 들어서 UART의 경우

VxWorks 같은 경우 터미널에서 devs 치시면 등록된 디바이스가 있는데

대부분 /tyCo/0에 UART가 물려 있습니다.

파라미터는 정확히 기억 안나고 대충.. 일반적인 파일 쓰기랑 비슷하게 UART에 쓰거나 읽을 수 있습니다.

대충 아래와 비슷하게...

fd = open("/tyCo/0", 2);
if(fd != NULL) {
   write(fd, buf, 100);
 
   close(fd);
}

VxWorks 관련된 것을 알고 싶으시면 VxWorks 툴(Tonado나 Workbench)를 설치하면 같이 오는

문서들을 보시면 될 것 같습니다.(Programming 어쩌구 저쩌구 있음)

<== 결론은 결국 돈 주고 개발툴 사시면 됩니다....
VxWorks OS 라이센스(Tornado, WorkBench), Probe, ICE2, 1년 지원 사닌깐 대충 8천만원 들었습니다..

그 후 딸려 오는 개발 문서 다 읽어 보시고.. 국내에 VxWorks 교육 기관 가셔서 교육 한번 들어 보시면
대충 어떻게 굴러가는 것인지 알 수 있을 겁니다.

그리고 다른 OS에도 올릴 수 있다고 하시니..

참고로 VxWorks가 POSIX는 지원합니다. 다른 OS도 POSIX를 지원하면 POSIX에 맞게 설계 & 구현 하시면

포팅쪽은 좀 쉬울듯하네요..

단. 특정 Device를 BSP에서 지원하지 않는 다면.. H/W 공부하셔서 Device Driver를 작성하셔야 됩니다 - -;;;

익명 사용자의 이미지

VxWorks쓰시고, 게다가 PowerPC면 거진 BSP딸려 나올텐데요...
SoftOn님 말씀처럼 VxWorks/Workbench인스톨하면 딸려 나오는 Doc 열심히 보시고,
WIN/Linux처럼 APP 개발만 하시면 됩니다.
어떻게 아냐구요? 제가 요거 만드는 회사에 근무했었습니다. --;;

임베디드쪽에 오셨으면, H/W개발자들 한테 무시당할 각오하시고....
자기의 본래 영역인 S/W영역 + 기본적인 H/W를 넓혀 가시면 상당히 재미있는
분야입니다. 화이팅입니다. (그래서, 제가 반도체 회사로 옮겼습니다.)

kalstein의 이미지

저같은 경우는 그냥 뭐... IDE 툴로 다 잘되어있던데요?;;
TI랑 Freescale dsp씁니다.

문제는...이쪽은 정말 실제 코딩 + Peripheral 과의 싸움입니다 ㅡ,.ㅡ;;;
실제코딩들도 FILE 같은게 없기땜시... 로그 남기고 하기도 상당히 거시기하구요.
(모든 로그는 UART로만! ㅋㅋㅋㅋ. 간단한 shell을 만들어서 사용중)

peripheral들... 즉 UART, SRIO, Ethernet, I2C, 이런것들을 직접 레지스터들 세팅해주면서
콘트롤 해야되는데... 그거 예제가 좀 부실하거나, 내가 하고싶은 방향과 다르거나 하면
개고생하게됩니다. ㅎㅎㅎ

뭐 실제 코딩쪽은 C로 많이 제약된다는거? C++이 STL도 안되고, 그래서 좀 쓰기 힘들다는거?
정도요... 이식성 때문에라도 C++이 조금 힘든감이 있어요...IDE에서 기본세팅도 C++이 제대로 지원안될때도 있고요.


------------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/

세벌의 이미지

제목 (이노무...) 보고 순간 일본말인줄 알았스므니다 -.-

kohyc의 이미지

임베디드 분야에서 hw 엔지니어에게 무시당하면 그걸로 끝입니디다.
더이상 vision이 없으니 임베디드 포기하세요..

sw엔지니어나 firmware engineer는 무조건 처음부터 hw엔지니어 무시해야 합니다.
hw 엔지니어가 아무리 하드웨어를 reference board대로 잘 설계했더라도, 그걸 검증하는것은 fw 엔지니어 몫입니다.
특정 기능이 정상적으로 동작하면 그걸 검증한 fw엔지니어가 잘한것이고, hw엔지니어는 그냥 자기 할일 한것일 뿐입니다.

특정 기능이 정상적으로 동작하지 않는다면, 그게 정상적이지 않다는것의 증명은 fw엔지니어 몫입니다.
이걸 증명하면 fw엔지니어는 그냥 자기 할일 한것일뿐이고, hw엔지니어가 잘못한것입니다.
이걸 증명하지 못하면 fw엔지니어와 hw엔지니어 둘다에게 오동작에 대한 책임이 있습니다.

보드가 정상적으로 동작하지 않는다구요?
이럴때는 fw엔지니어가 hardware에 결함이 있다는것을 증명해야 합니다.
hw엔지니어는 보드가 완벽하다거나, 불안정하다는것을 절대로 증명할수 없습니다.
fw엔지니어가 hardware에 결함이 있다는것을 증명못하면 어떻게 되는지 아세요?
그 프로젝트 이제 망한겁니다.

reference board가 없는 board는 어떻게 할까요?
이런 보드는 hw 엔지니어가 절대로 설계 못합니다.
sw 엔지니어 혹은 fw엔지니어가 설계해야 됩니다.
hw엔지니어가 혼자서 독자적으로 reference board를 설계했다고 하면,
그 보드 설계한 hw엔지니어한테 살려내라고 해야합니다.
괜히 이런 board 잡고 시간낭비하면 않됩니다.
열심히 해서 board가 살아나면 그나마 다행이고, 그동안 투입한 시간에 대해서 조금이나마 성과를 건질수 있겠지만,
board가 살아나지 않으면, 그동안 투입한 시간은 그냥 낭비한 겁니다.

임베디드 하는데, 그 보드 설계한 hw엔지니어가 같은회사 소속이 아니고, 가까운 거리에 없다구요?
그럼 그 프로젝트도 이미 망한겁니다.

Anti-Lock의 이미지

정말 공감되는 말씀입니다.
sw/fw 엔지니어는 하드웨어 결함을 재빨리 증명해야 합니다.
안그러면, 실패의 책임이 자신에게 돌아옵니다...
자신이 잘못한건지, 보드가 이상한건지... 수많은 고민을하면서..

kalstein의 이미지

진짜... H/W와의 싸움이 많죠.
이게 SW의 문제인지 HW의 문제인지... 분간하는게 참 거시기하죠.
걍 PC의 세상이 참으로 편합니다...;;


------------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/

park1book의 이미지

저는 개발자는 아니지만, 학부생인데, 리눅스도 모른상태에서 지금 임베디드 보드에서 tiny os를 만들어보고있습니다.^^;;;

제가 조금이나마 도움드리고 싶은부분은 데이터 시트보실때 수순을 이렇게라고 생각들며 이렇게 조언을 많이 받았었습니다.

1. UART (serial)

2. TIMER

3. CONTEXT SWITCH

저도 아직 많이 모르고 허접하지만, 조금이라도 도움드리고싶어서 이렇게 댓글남깁니다.^^;;;

제가 더 도움드릴만한 부분있으시면 메일주세요^^ park1book@naver.com 감사합니다

ylemyun의 이미지

개발직 20년이상 해보니... H/W , S/W 싸우지 말고... 자신의 실수일수도 있다는 가능성을 놓지 말고..
H/W 엔지니어랑 잘 협조해서 일하는 것이 제일 좋습니다... 가끔은 S/W 실수일때도 있습니다..
세상에 완벽한 것은 없습니다....
독불장군으로 살아가기 보다는 부드럽게... 살아가는 것이 좋아요...