본문 바로가기

* DevSecOps/* System

뻔뻔하게 배우는 임베디드 리눅스 도서 (임베디드 프로그래밍) 유명환


임베디드 프로그래밍 무작정 따라하기 책을 도서관에서 빌려서 다 읽었다..
읽다보면 이해 안되는 부분이 많다.. 그래도 흥미가 있어서 읽기 시작했다.

임베디드란? 실제 전기를 사용하는 제품 가운데 연산이나 특별한 처리가 필요한 제품을 임베디드라고 한다.
임베디드 시스템이란? Embedded 라는 단어에서 알 수 있듯이 임베디드 시스템은 제품 내부에 포함되어 있는 개념이다.
임베디드 시스템에서 가장 중요한 사항은 안정성이다.
임베디드 소프트웨어는 전원을 켰을 때의 초기 동작에 필요한 사항이나 어떤 정보를 처리하기 위해 실행되는 소프트 웨어의 저장 위치 등이 자세하게 저장되어 있는 것이다.

HDL과 ASIC 에 대해 좀 더 자세히 말을 해보자.
HDL? 컨트롤러나 칩을 설계할 떄 하드웨어 기술을 이용해서 만들 경우 제작이 너무 복잡하므로, 프로그래밍 언어를 이용해서 칩을 만들자는 미국 국방부의 발상에 의해 개발된 언어이다.
ASIC? 주문형 반도체를 일컫는 말로 에이직이라고 한다.

컴퓨터와 임베디드 시스템의 차이점
굳이 컴퓨터와 임베디드 시스템의 차이를 구분한다면 컴퓨터는 특정 목적이 아닌 범용의 사용자를 위한 시스템이고, 임베디드 시스템은 특별한 기능이나 목적을 수행하기 위한 시스템이다.

컴퓨터에서 몇 년 전에 주로 사용하는 펜티엄4나 최근 유명해진 센트리노(Centrino)와 같은 CPU를 왜 핸드폰과 같은 제품에서는 사용하지 않는가?
핸드폰도 점점 더 고성능화가 되고 있는 것은 사실이다. 핸드폰에도 CPU가 있지만 컴퓨터와는 다르다.
왜 컴퓨터CPU를 핸드폰에 사용하지 않느냐면 4가지 이유가 있다.

-가격이 비싸다.
펜티엄4-3.2Ghz CPU가 꽤나 가격 높게 팔린다면 이것으로 핸드폰으로 만들면 10배 더 비싸게 나올 수도 있다.

-CPU의 크기가 크다.
컴퓨터 CPU와 노트북 CPU와는 다르게 핸드폰 CPU는 더욱 작다.

-발열량
컴퓨터 CPU는 고밀도 집적된 부품이기 때문에 그 만큼 열도 많이 발생한다.
컴퓨터는 CPU전용 쿨러를 설치하면 열이 발생되는 문제를 해결할 수 있지만 핸드폰에 쿨러까지 내장한다면 핸드폰 전원을 켤 때마다 컴퓨터 부팅처럼 웅~ 소리가 시끄럽게 날 것이다.

-전원
배터리 기술이 많이 발전한 것은 사실이지만 컴퓨터 CPU를 핸드폰에 내장하면 그 만큼 통화시간이 줄고 자주 갈아주는 불편을 감수해야한다.

페이지 유닛은 어떤 역할을 하는가?
사용자의 프로그램을 일정한 크기의 페이지라는 덩어리로 나누는 데 사용하는 장치이다.
메모리 전체를 하나의 메모리로 사용하지 않고 좀더 효율적으로 메모리를 사용하기 위해서 세그먼트 단위로 나누듯이 사용자의 프로그램도 무조건 하나의 크기로 사용하지 않고 페이지 단위로 나누어서 사용한다.

MMU의 세그먼트 유닛
MMU는 메모리를 관리하는 장치를 의미한다. 메모리 관리장치에서 메모리의 어드레스를 세그먼트 단위로 나누는 데 사용한다.

어드레스 버스
CPU와 주메모리, 입출력 인터페이스와의 사이에 데이터를 주고받는 신호선을 버스라고 한다. 어드레스 버스는 CPU가 필요한 명령어 데이터나 정보의 위치를 주 메모리에 지시할 때 사용하는 신호선이다.

RISC CPU와 CISC CPU는 무엇인가?
RISC? 간단하면서도 길이가 고정된 명령어 집합을 제공함으로써 CPU의 크기를 줄이고 실행 속도를 높일 수 있도록 소프트웨어로 하여금 복잡한 처리를 할 수 있도록 하는 CPU이다.
CISC? 복잡하고 길이가 가변적인 명령어 집합으로 제공함으로써 어셈블리어로도 고차원의 프로그래밍을 할 수 있도록 설계한 CPU로, 컴파일러 작성을 보다 쉽게 하기 위해서 하드웨어화할 수 있는 것을 모두 하드웨어에게 맡긴다는 원칙으로 설계되었다.

MMU와 FPU
MMU는 가상주소를 물리주소로 매핑하기 위해 꼭 필요한 요소이다. MMU가 없으면 가상 메모리를 사용할 수 없으므로 프로세스가 메모리를 선형으로 보고 접근할 수가 없다. 따라서 다중사용자와 다중프로세스시스템에는 필수이다.
FPU는 부동 소수점연상을 빠르게 할 수 있도록 하드웨어적으로 만든 보조 프로세스를 의미한다.
센서에서 들어오는 데이터를 해석하거나 컨트롤러에 명령을 내리기 위해 복잡한 수학 연상을 수행할 경우에 꼭 필요하다.
CPU 주파수가 충분히 높다면 FPU 없이 라이브러리만으로 처리할 수 있지만, 반응 속도가 조금 떨어진다는 단점이있다.
 
병렬포트와 같은 경우는 실제 개발에서 많이 사용된다는 데, 어떤 방법으로 데이터 정보를 교환하는가?
실제 시스템용 프로그램을 구현한 후 크로스 컴파일러를 이용하여 시스템 환경에 적합한 파일로 컴파일하고 소스를 탑재하는 과정을 거치게 되는데 이런 작업을 포팅을 한다고 한다.
포팅이란? 하나의 플랫폼에서 개발되어 사용하는 프로그램을 다른 플랫폼에서 사용할 수 있도록 프로그램을 수정하는 작업을 의마한다.
병렬포트는 다른 장치와의 인터페이스장치로서의 기능을 할 수도 있지만 여기서 말하고 싶은 내용은 디버깅 도구나 시스템 소스데이터 전송의 기능으로 사용된다는 것이다.
출력핀 2~9번
입력 핀 10~ 15번
입출력 핀 1,14,16,17번
접지 핀 18~25번

포인터란?
한마디로 메모리 어드레스를 의미한다. 

스택이란? 스택은 자료구조의 한 종류이다. 데이터의 입출력을 어떤 형태로 할 것인지 미리 정의해 놓은 것이다.
스택은 처음입력한 데이터가 나중에 나오는 구조로 선입후출(FILO)이다.

플랫폼이란? 응용 프로그램이 실행될 수 있는 기초를 이루고 있는 컴퓨터 시스템을 의미한다.

디버깅이란? 임베디드 시스템에 다운로드된 프로그램을 수정하기 위한 목적으로 사용하는 것이므로 프로그램을 완성하기 위해서는 꼭 필요한 것이다.
논리적인 에러는 프로그램전체에 대해서 이해해야 하고, 프로그램 코드가 한 줄씩 진행하는 내용을 머리속에 넣고 있어야 원인을 발견할 수 있다.

매핑이란? 컴파파일된 파일을 텍스트 에디터로 열면 각 명령어 코드와 데이터에 대한 주소가 할당되어 있습니다.
주소는 프로세스에 그대로 적용되지 않으며, 프로세스가 만들어질 때 할당받은 주소와 연관되도록 변환되고, 프로세서가 명령어 코드를 실제 물리 메모리에서 가져오려면 물리 메모리에 접근할 수 있는 주소로 다시 변환되어야 하는데 이와 같은 변환 과정을 매핑이라고 한다. 즉, 매핑은 논리적인 주소를 물리적인 주소로 변환하는 작업이라고 이해하면 된다.
 
GDB란?
디버그의 사전적인 의미는 "벌레를 잡다"이다. 즉, 프로그램을 실행하면서 벌레와 같은 에러를 잡는다는 의미를 갖는다.
디버거는 프로그램을 실행할 때 어떤 문제가 발생하여 프로그램 실행에 문제를 일으키는 지 알수있는 도구이다.
GDB는 프로그램을 시작한 후, 브레이크 포인트를 지정함으로써 원하는 부분의 값을 확인할 수 있으며, 프로그램의 동작을 멈추게 하거나 방해하는 요소를 알아내고, 오류가 발생한 부분을 수정하여 정확하게 동작하도록 할 수 있다.
GDB는 C나 C++,유닉스,리눅스에 많이 사용하는 개발도구이며, 요즘에는 모니터링 프로그램에 GDB기능을 포함하여 사용하는 경우가 많다. 

브레이크 포인터란?
간단히 말하자면 프로그램 실행을 잠시 멈추는 것이라고 생각하면 된다.

Makefile이란?
Makefile은 "파일을 만들다"는 의미이다. 파일의 의미는 임베디드 프로그램과 같은 시스템에서 사용할 수 있는 파일을 말한다.
즉, 비주얼 C++를 이용해서 exe파일을 만드는 것과 같이 임베디드 시스템에서 이용할 수 있는 바이너리 파일을 만드는 것이다.a.c나 a.h와 같은 소스 파일,헤더 파일은 바이너리 데이터를 만드는 데 필요한 것으로, 바이너리 데이터는 여러 개의 헤더 파일과 소스 파일을 일정한 규칙에 의해 컴파일하고 링크하여 만들어지며,이와 같은 규칙을 제공하고 실행하는 것이 Makefile이다.
 
상위 부팅으로 설정한다는 의미는? 
앞에서 메모리 맵에 "FLASH(BootCS)"라고 표시된 부분이 있는데, 표시된 부분의 메모리 어드레스는 전체 메모리에서 가장 큰 어드레스 값을 갖는다. 결국 메모리 어드레스가 가장 큰 것부터 설정함으로써 부팅하는 "상위부팅"으로 설정된 것을 확인할 수 있다.

Cygwin란?
Cygwin은 윈도우 환경에서 실행하는 리눅스이다. 보통 리눅스 사용자는 대부분 윈도우와 리눅스를 부트로더(LILO)로 선택하면서 부팅하는데, 윈도우를 사용하다 보면 리눅스가 필요할 때가 있고 리눅스를 사용하다 보면 윈도우가 필요할 때가 있으므로 재부팅 과정에 번거로움이 있다. 그래서 이 같은 불편을 해소한 것이 바로 Cygwin이다.

Endian / BootCS 란?
Endian은 메모리에 저장되는 바이트들의 순서를 나타낸다. Endian에는 Big Endian과 Little Endian 이 있는데, Big Endian은 큰 쪽을 먼저 저장하고 Little Endian은 작은 쪽을 먼저 저장합니다.
즉, "0x1234"를 메모리에 저장할 때 Big Endian은 "1234" 로 저장하고 Little Endian은 "3412"와 같이 저장한다.

 
BootCS는 Boot Chip Select 의 약어로, 시스템에서 전원이 켜지거나 리셋이 실행되어 전체시스템을 새롭게 시작하는 경우에 선택된다. BootCS가 선택되면 CPU마다 BootCS의 값을 LOW로 할지 HIGH로 할지에 대해서 다르게 설정할 수 있다.

보레이트와 bps는 어떻게 다른가?
bps는 bit per second의 약어로 초당 bit 전송률을 나타내며 9600bps는 1초에 9600bit를 전송한다는 의미이다.
보레이트의 B의 Baud 통신단위를 말한다. 즉, 보레이트가 9600이라는 것은 1초에 9600개의 패킷을 보낸다는 의미이다.
만약 1패킷이 2bit로 구성되어 있다면 9600*2=19200bps가 된다.
하지만 RS-232C통신 방식에서는 패킷 단위의 전송이 아니라 bit 단위로 전송하기 때문에 특별히 bps와 보레이트를 구별하지 않아도 된다. 

이 정도 정리로 마무리를 짓겠다.
많은 부분을 타이핑하지는 못했으나 임베디드쪽으로 가려면 결국 리눅스 명령어를 확실히 알아두며, 어셈블리어를 많이 배워야한다라는 느낌이다. 그리고 C와 C++은 기본이며 Turbo-C를 사용하기도 하며 JTAG,ARM과 MIPS를 이용한 임베디드 프로그래밍중 모바일 강자 ARM과 임베디드 최고의 프로세스 MIPS 모니터링프로그램,YAMON이해,크로스컴파일등등.. 많이 배워야할것같다..
정말로 기본기를 탄탄히 하는 내가 되었으면 좋겠다. 

YES24 = 뻔뻔하게 배우는 임베디드 리눅스

 

책:시스템제어 개발 전문가 5인이 알려주는 임베디드프로그래밍 무작정따라하기 에서 참조하였습니다.
출판사:길벗