지난 번에 이어서 또 나의 생각을 좀 풀어내 보고자 한다. 일단 뭐 매번 이야기 하는 내용과 중복이 될 수 있기는 한데...뭐 중복되면 어떤가.....그저 내 맘가는대로 내 생각대로 주저리주저리 해 보고자 한다.
항상 이야기 하지만 내 이야기가 정답은 아니며 각각의 상황과 개인적인 능력과 환경에 따라 많이 다를 수 있다.
일단 펌웨어에 대해 아는 척 좀 해봤었는데 음....누가 읽을까 싶었지만 생각보다 많은 사람들이 이런 글을 읽어주는구나 싶었다. 내 글이 대부분 어떤 이론 또는 팁 등에 대한 지식을 다루기 때문에 댓이 거의 없는 편인데 펌웨어 관련 글을 그저 내 생각을 정리하고자 하는 맘에 적었는데 꽤 많이 보는 듯 하다.
https://electric-lab.tistory.com/331#comment14490103
사실 뭐 그래봤자 엄청 많은 사람들이 보는 블로그도 아니니지만 그저 한사람의 생각을 이야기 한 것에 대해 반응이 있다는 것에 매우 놀랐다.
그래서 몇일전 다른 글에서 질문한 분에 대한 답변을 기준으로 펌웨어 업무에 대해 좀 이야기 해보겠다. 사실 뭐 별거 없다. 펌웨어란 그저 어떠한 기기에 하드웨어를 제어하는 프로그램이다. 당연히 하드웨어에 장입되고 하드웨어에 따라 언어, 사용법 등이 천차만별이다.
뭐 분류라고 하기는 그렇지만 일단 MCU, DSP로 크게 분류가 되고 FPGA도 이쪽 부류에 들어갈 경우도 있다고 할 수 있다. (FPGA에 MCU를 넣기도 하니...) 이런 프로세서들은 크기에 따라 기능에 따라 나누어지는 것이다. 쉽게 MCU, DSP의 개념은 연산 속도에 따라 분류가 된다고 생각하면 된다. 또한 기능에 대해 MCU는 대부분 IO 제어와 통신 정도를 수행하게 되고 DSP는 MCU의 기능에서 고속 정밀 연산을 한다고 보면 된다.
MCU는 예전에는 Z80, 8051 등이 대표적이었고 이후에는 뭐 다른 코어들도 많이 나왔었는데 현재는 내 생각이지만 ARM이 대세인 것 같다. 이 코어 들에 대해 뭐 특징들이 있긴 한데 그런 자세한건 잘 모르겠고 그저 요새는 ARM을 다뤄야겠구나 싶다. ARM의 대표적인 코어가 STM시리즈이다.
펌웨어를 하다보면 8비트 16비트, 32비트가 있는데 이건 데이터를 한번에 처리하는 라인 수로 연산의 정밀도와 속도 차이로 보면 되기 때문에 프로그램 상으로는 크게 다르지는 않다. 다만 8비트에서 16비트 연산을 한다거나 하면 잘못된 데이터가 나오게 된다. 뭐 방법이 있긴 한데 여튼 그러니 내가 사용하는 MCU가 8인지 16비트인지 32비트인지 알고 사용해야 한다.
사실 펌웨어를 하려면 STM 뿐 아니라 여러 펌웨어를 만질 수 있어야 한다. Atmega, C8051, PIC, STM 등등 많은 MCU에 대한 경험이 있어야 한다. 하나만 할 줄 알면 다 할 수 있지 않을까 싶은 말은 반은 맞고 반은 틀리다. 뭐 펌웨어 뿐 아니라 다른 언어도 마찬가지고 심지어는 우리가 말하는 언어도 마찬가지일 것이지만 펌웨어는 더욱 까다롭다. 펌웨어를 하려면 가장 까다로운게 환경설정이다. 매우 짜증나는 일이다. 소프트웨어 언어와 비교가 안된다고 생각한다.
펌웨어를 하려면 일단 하드웨어를 구성해야하고(뭐 EV보드를 사던지...) 다운로드를 하기 위한 디버거 또는 프로그래머를 파악해서 준비하고 컴파일러를 확인 및 설치하고 IDE 또한 확인해서 설치해야 비로소 준비가 된다. 또한 컴파일러에 따라 문법이 다르고 IDE도 가지 각색이라 더욱 힘들다. 누가 이 작업을 해주고 프로그램만 짜라고 하면 완전 이때부터는 커피 마시며 룰루랄라 하면서 프로그래밍을 할 것이다. 이 후 하드웨어 확인을 하면서 해야하기 때문에 계측기로 계측할 컨디션도 맞춰야 하고 테스트를 위한 환경도 맞춰야 하기 때문에 이 과정까지가 엄청 버겁다.
고로 가지각색인 컴파일러, 다운로더, IDE 등을 다 알고 있을 필요가 있긴하다. 이게 경우에 따라 선택을 해야하기 때문이다. 어떤 경우에는 C8051이 유리할 경우도 있고 PIC가 적합한 경우도 있고 STM이 적합한 경우도 있다.
예를 들면 현재 내가 하는 일 중에 블루투스를 간단하게 이용해야 하는 경우가 있는데 이 경우 Siliconlab의 칩이 가격이 저렴하고 기능도 적당하다. 다른 일은 배터리가 작아서 대기전력이 매우 작아야 하고 수량이 많아서 가격이 싸야 하는데 이 때는 PIC를 사용했었다. 테스트용 JIG를 개발할 경우는 뭐 아무거나 사용했는데 이때는 범용적으로 Atmega를 사용했었다. 이처럼 상황과 환경에 따라 다른 칩을 사용할 경우가 있다. 특히 커스터머가 요구를 할 경우가 있기 때문에 더욱 그러한 경우가 많이 있다.
여튼 그러다보니 많은 프로세서를 다뤄봐야 환경도 하드웨어도 갖추게 되어 소비자의 니즈에 맞출 수 있다. 의외로 이 하드웨어 환경 등이 돈이 좀 들기 때문에 일하면서 갖춰지지 않은 경우 많은 경험을 할 수 없다. 이 하드웨어 환경의 피곤함 때문에 왠만하면 썼던 프로세서를 만지게 되어 있기 때문이다.
그러나 그렇게 하다보면 한 프로세서에 매몰되고 시대가 변하여 현재 유행인 프로세서가 바뀌면 따라가기 힘들다. 하나를 너무 잘 알다보면 다른 것을 하려면 그만큼 더 반발심이 심해 익히기 힘들 수 있긴 하다. (케바케이긴 하다.) 많은 프로세서를 다루면서 그에 맞는 회로와 특성을 익히며 데이터베이스를 쌓아가는게 중요하다고 볼 수 있다.
특히 프로세서를 다룰 때 자신에게 좀 맞는 프로세서가 있을 수 있다. 그런 제품군을 종류마다 좀 구별해 놓을 필요도 있긴 하지만 뭐 일하다보면 다 익혀지는 과정이다.
언어에 대해서는 C언어가 기본이며 정석이라고 볼 수 있다. C++ 또는 파이썬 등으로도 가능한 프로세서가 있긴 하지만 많은 엔지니어들은 C로 프로그램을 한다. 개인적으로는 C++이 적절하다고 보지만 지원을 안하는 경우도 많기 때문에 그냥 속편히 C로 하는게 좋다.
C를 사용할 경우 당연히 장단점이 있는데 장점은 다른 어떤 언어보다 빠르고 간결하다. 이게 어떤 특징보다 매우 앞서기 때문에 아직도 프로세서는 C로 작업한다고 보면 된다. 물론 너무 예전 언어라서 편의성에서는 좀 그렇다. 예를 들어 C++에서는 문자열을 관리할 수 있는 CString을 제공해 문자열 관리가 편리하지만 C는 문자열을 관리하려면 배열을 사용해야 한다. 개인적으로는 파이썬을 사용해보니 엄청 편리하기는 했다. (파이썬은 문법만 쬐끔 배웠다.)
요즘 어셈블은 배울 필요성도 거의 없기 때문에 배울 필요는 없다. 어셈블이 C보다 강력하긴 하지만 정말 어렵다. 학교다닐 때 해봤는데 생각보다 재미있지만 어려운 프로그램은 엄두도 안나고 가독성도 없다고 봐도 무방할 정도라...
여튼 C를 기본만 잘해도 왠만해서 펌웨어 프로그램은 할 수 있다. 다만 기왕이면 포인터를 잘 다룰 수 있다면 매우 도움이 될 것이니 어렵더라도 포인터를 잘 다루게 연습을 하는게 좋다.
요즘의 프로세서는 매우 강력하기 때문에 굳이 코드 최적화를 할 필요가 없을 정도로 대충 짜도 되는 수준이 되었지만 펌웨어 프로그램의 가장 중요한 점은 간략하고 최적화된 프로그램을 짜는게 중요하다. 한정된 하드웨어에서 최고의 퍼포먼스를 내야하기 때문이다. 이 점의 중요성은 실제 상용 제품을 개발해보면 매우 중요해지는데 이게 코스트 즉, 돈에 관련이 있기 때문이다. 최대한 저렴하게 만들어야 경쟁력이 있기 때문에 적합하고 낭비없는 하드웨어를 만들어야 한다. DSP를 사용해야 하는 일을 최적화하고 방법을 고안해서 MCU로 바꾸면 엄청난 이득이 남는 것처럼 말이다. 이런 경우가 많지는 않지만 있긴 하다. 당연히 32비트 MCU를 사용하던 펌웨어를 8비트로 바꾸는 경우는 허다하다.
그런데 역설적인 이야기지만 꼭 성능이 좋다고 비싼건 아니고 성능이 안 좋다고 싼건 아니다. 세상은 시장 경제에 따라 움직이기 때문에 수요가 많은 제품이 공급이 많고 그만큼 저렴하니 대세의 프로세서를 선정해서 사용하는게 좋다. 그게 곧 가격 경쟁력이 되기 때문에 프로세서도 유행에 잘 따라야 하며 그러다보니 많은 프로세서를 다룰 수 있어야하고 그런 연습이 되어 있어야 처음 다루는 프로세서도 거부감 없이 부담없이 금방 적응 할 수 있다.
참고로 예전에는 컴파일러도 유료로 사용하는 경우도 많았는데 요즘은 대부분 제조사에서 제공하는 경우가 많기 때문에 예전에 배웠던 사람들도 새로 컴파일러에 적응하는 과정을 격을 경우가 많다. 당연히 회사에서나 혹은 개인적으로 컴파일러를 CodeVision, Keil, IAR 등을 사서 사용한다면 이걸로 많은 프로세서를 할 수 있긴 하지만 유료라 굳이....가격도 꽤 비싸다.
펌웨어 뿐 아니라 프로그램은 어느 정도 재능의 영역이라고 생각을 하는 부분이 있다. 성적이 좋고 학벌이 좋은 사람도 프로그램 못하는 사람을 허다하게 봤다. 그 반대인 경우도....물론 경험과 노력으로 극복이 가능하지만 그건 어느 영역도 마찬가지일터....일류가 되지만 않는다면 가능하다고 본다...그러나 경험과 노력만으로 안되는 부분도 있으니 자신의 재능이 없다면 과감히 인정하고 깊지 않고 넓은 지식을 가지도록 노력해보는게 좋을 것 같다.
'잡다한 이야기 > 생각' 카테고리의 다른 글
[HW] 하드웨어 엔지니어.....그리고 영어에 대해..... (2) | 2023.03.25 |
---|---|
[전자기초] 전자회로 공부에 대한 팁(?), 개인적인 전자 공부 썰... (3) | 2023.03.23 |
[펌웨어] 개인적인 전자 직종 관련 견해 - 첫번째 학벌 (0) | 2023.03.23 |
[전자기초] 공학에 대한 개인적인 견해...좀 쉽게 안되나? (6) | 2023.03.20 |