336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

라즈베리로 드론을 만들어 볼까해서 알아보는 중

 

이런 녀석을 팔고 있었다

 

이름하여 PXFmini(링크)

 

 

 

아두이노로 치면 쉴드같은 녀석으로

 

필요한 센서는 다 달려있고 Power나 확장 포트도 커넥터로 되어 있어

 

추가로 뭔가 달기도 좋을것같다.

 

 

바디는 알리에서 흔하게 팔고 있어

 

H/W구성은 쉽게 할수 있을듯 하니

 

일단 좀더 알아보고 조만간 시작할듯

 

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

##flex cross-compile

1. ./configure --host=arm-linux --prefix=[prefix 경로] CC=arm-linux-gcc

 

2. config.h 파일에서 다음부분 주석처리

186 : #define malloc rpl_malloc

192 : #define realloc rpl_realloc

 

3. make && make install

 

##dhcpv6

1. echo "ac_cv_func_setpgrp_void=yes" > config.cache

 

2. ./configure --host=arm-linux CC=arm-linux-gcc --prefix=[prefix 경로] LDFLAGS="-L[libfl가 존재하는 경로]" --config-cache

 

3. Makefile에서 LIBS -lfl추가

 

4. LINE_MAX 수정

 

5. make

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

요녀석은 데스크탑용(2008 공개 SW 공모대전 출품)


이녀석은 PXA270보드에 포팅한녀석(제6회 대한민국 임베디드 소프트웨어 공모대전 모바일부분 출품)


ARToolKit과 openGL 그리고 SDL을 이용한 프로젝트

내가 주로 한일은 보드관련해서 거의 포팅에 관한 일이었다

ARToolKit, Mesa Lib(OpenGL), GLUT 등을 컴파일및 최적화하는일과

최초에 데스크탑용으로 완성된 소스를 보드로 이식하는 일이었다

보드에 붙어있는 3D가속칩 드라이버가 제공되지 않는 관계로

데스탑에서 실행시키는 것 만큼의 퍼포먼스가 나오지 않는건 당연지사

때문에 영상처리 부분을 배재하고 터치스크린과 가속도센서로 대체하여

퍼포먼스를 끌어올림과 동시에 핸드헬드기기에서의 편의성을 상승시켰음
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
 
LN2440SBC 보드에 포팅한 ARToolKit!!

WM이 아닌 linux상에서 올렸다는게 나자신도 신기할 따름

하지만....

ARM은 FPU가 없기 때문에 플로팅 연산이 뷁스럽고 결과는 이러하다



그래서

이번 임베디드 공모대전 보드지원에서 모바일 과제로 전향하며 얻은

PXA270칩을 사용하고 3D연산 모듈도 달려 있는 녀석!!

사용자 삽입 이미지

바로 이녀석!!!

3D모듈이 openGL이 아닌 openGL ES를 지원하고

PXA칩 아키텍쳐를 잘 모르기에 과연 ARToolKit이 잘 돌아갈지는 미지수 이지만

기대를 걸어본다
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
openGL을 보드로 포팅시
TinyX, MESA, GLUT 최소한 이렇게 세가지를 컴파일 해줘야 한다

TinyX같은경우 검색해보면 쉽게 포팅관련 문서를 구할 수 있고
MESA의 경우도 어렵지 않기에 생략하고 GLUT만 설명하겠다

http://www.opengl.org/resources/libraries/glut/glut_downloads.php
여기서 GLUT-3.7을 다운받아 적당한곳에 압축을 푼다

참고로 GLUT포팅하면서 얻어야 할것은 공유 라이브러리 libglut.so.3.7이다

$GLUT_HOME/linux 디렉토리의 README파일을 열어보면
$GLUT_HOME/lib/glut/ 디렉토리에 $GLUT_HOME/linux/Makefile을
복사해 넣으라고 한다

복사후 $GLUT_HOME/lib/glut/Makefile을 열어보자

....
#-----------------------------------------------------------------------
# start of Imakefile
# $XConsortium: Library.tmpl,v 1.34 95/06/16 17:44:51 gildea Exp $
# $XFree86: xc/config/cf/Library.tmpl,v 3.3 1995/07/08 10:21:44 dawes Exp $

         CC = arm-linux-gcc


  CCOPTIONS = -ansi -fPIC


STD_DEFINES = -Dlinux -D__i386__ -D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE -DX_LOCALE
CDEBUGFLAGS = -O2 -msoft-float #-m486

# Copyright (c) Mark J. Kilgard, 1994.
# Glut.cf - GLUT distribution Imakefile configuration info

EXTRA_INCLUDES = -I$(TOP)/include -I$(TOP)

GLUT_DEPLIBS = $(DEPGLUT) $(DEPXMULIB) $(DEPXLIB)
GLUT_LIBS = $(GLUT) $(GLU) $(OPENGL) $(XMULIB) $(XLIB) -lm
OPENGL = $(TOP)/../lib/libMesaGL.so
GLU = $(TOP)/../lib/libMesaGLU.so
INVENTOR = -lInventor
GLUT_DEPLIBS = $(DEPGLUT) $(DEPXMULIB) $(DEPXILIB) $(DEPXLIB)
GLUT_LIBS = $(GLUT) $(GLU) $(OPENGL) $(XMULIB) $(XILIB) $(XLIB) -lm
....

이부분이 GLUT라이브러리 컴파일 할때 사용되는 부분이다

빨간색으로 표시된 부분만 수정해주고 gl.h, glu.h경로만 잘 설정해 주고
$GLUT_HOME/lib/glut/ 경로에서 make를 하면 문제없이 컴파일이 될것이고

그 폴더에 libglut.so.3.7파일이 생성돼 있을 것이다

혹시라도 -msoft-float 옵션에 대해 알고싶으면 밑에글
gcc 컴파일 옵션.(에서 붉은색 부분)을 읽어 볼것을 권장한다.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

이제 할일은 문제의 ./util 과 ./examples 이다!!
일단 ./util/grapicsTest디렉토리로 이동해 make를 해보자

[root@localhost graphicsTest]# make
arm-linux-gcc -c -O -I/usr/src/kernels/2.6.25.6-27.fc8-i686/include/ -I../../include graphicsTest.c
graphicsTest.c:7:21: GL/gl.h: 그런 파일이나 디렉토리가 없음
graphicsTest.c:8:23: GL/glut.h: 그런 파일이나 디렉토리가 없음
graphicsTest.c: In function `draw':
graphicsTest.c:101: error: `GLfloat' undeclared (first use in this function)
graphicsTest.c:101: error: (Each undeclared identifier is reported only once
graphicsTest.c:101: error: for each function it appears in.)

                        ....생략....

graphicsTest.c:130: warning: data definition has no type or storage class
graphicsTest.c:132: warning: parameter names (without types) in function declaration
graphicsTest.c:132: warning: data definition has no type or storage class
graphicsTest.c:133: error: parse error before '}' token
make: *** [graphicsTest.o] 오류 1
[root@localhost graphicsTest]#
아마도 요런 에러가 날것임(오류가 완전 틀리다면 make clean후 make)
뭐 경우에따라 완전 똑같은 오류가 나지는 않을것이다

이경우 처음부터 살펴보면
         ▷ graphicsTest.c:7:21: GL/gl.h: 그런 파일이나 디렉토리가 없음
             graphicsTest.c:8:23: GL/glut.h: 그런 파일이나 디렉토리가 없음
요런 에러가 보이는데 간단하다!! 경로를 못찾아서 그런것이라 Makefile에서
경로를 맞춰주던지 귀찮음 디렉토리 내에 헤더파일들을 때려박고
#include "gl.h" 요런식으로 주면 된다.
한가지 주의할 점은 헤더파일을 디렉토리내에 복사할경우 의존적인 헤더들까지 같이 복사해 주어야 한다는 사실이다!!

------------------  미완된 글입니다 ------------------
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

아래 사이트에서 Linux용 ARToolKit을 다운 받는다http://www.hitl.washington.edu/artoolkit/documentation/usersetup.htm
※참고로 호스트에서 컴파일할경우 위 링크의 설명대로 컴파일 하면 간단히 된다

다운받은후 압축을 푼다

파일중 Configure파일이 있는데 바로 실행하지 말고 에디터를 이용하여
파일을 열어보면 다음과 같다.


   ...

    echo "Select a video capture driver."
    echo "  1: Video4Linux"
    echo "  2: Video4Linux+JPEG Decompression (EyeToy)"
    echo "  3: Digital Video Camcoder through IEEE 1394 (DV Format)"
    echo "  4: Digital Video Camera through IEEE 1394 (VGA NONCOMPRESSED Image Format)"
    echo "  5: GStreamer Media Framework"
    echo -n "Enter : "
    read ANS
    if [ "$ANS" = "1" ]
    then
                echo
                echo "Color conversion should use x86 assembly (choose 'n' for 64bit systems)?"
                echo -n "Enter : "
                read ANS
                if [ "$ANS" = "y" ]
                then
                        CCVT_OBJ="ccvt_i386.o"
                elif [ "$ANS" = "n" ]
                then
                        CCVT_OBJ="ccvt_c.o"
                else
                        echo "Please enter y or n."
                        exit 0
                fi
        VIDEO_DRIVER="VideoLinuxV4L"
        #CFLAG="-O -I/usr/X11R6/include"
        CFLAG="-O -I/root/work/kernel/rebis2.6/include/"
        LDFLAG="-L/usr/X11R6/lib"
        ARFLAG="rs"
        RANLIB=""

        LIBS="-lglut -lGLU -lGL -lXi -lXmu -lX11 -lm"
        CONFIG="AR_INPUT_V4L"
   ...
1: Video4Linux"
2: Video4Linux+JPEG Decompression (EyeToy)"
3: Digital Video Camcoder through IEEE 1394 (DV Format)"
4: Digital Video Camera through IEEE 1394 (VGA NONCOMPRESSED Image Format)
이렇게 네개의 메뉴가 있고 선택에 따라 생성되는 Makefile 이 달라진다
때문에 자시가 사용할 모드(아마도 주로 1번을 사용하게 될 것이다)의 부분을 찾아
위의 예(빨간부분) 처럼 수정을 해야 한다

물론 CFLAG외에도 LIBS관련된 옵션들도 수정을 해야하는데 후에 이야기를 하겠다

자!! 일단 ./Configure를 실행해보자!!
그럼 각각 폴더에 Makefile이 생길 것이다
일단 해야 할일은 Makefile을 추적하여 컴파일 해야할부분을
arm-linux-gcc로 바꿔줘야 한다.

   ./lib 경로 의 Makefile들은 CC=arm-linux-gcc로 바꿔주기만하면 쉽게 컴파일 될것이고
   ./util 과 examples 경로는 cc를 $(cc) 로바꾸고 cc=arm-linux-gcc를 추가해주면 끝!

이제 make를 실행해보자!!
제일 상위의 Makefile 경로대로 일단 ./lib 경로의 폴더들 부터 하나하나 make 를 해보자
정확한 기억은 아니지만 ./lib폴더는 문제없이 쉽게 크로스 컴파일이 될것이다.

삽질의 시작은 여기부터 이다!! 이제 ./util디렉토리와 ./examples폼더를 컴파일 해야한다!!

....그런데

좀 길어 질것 같은 관계로 일단 여기서 1부끝!!!
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
4. gcc의 짝꿍들

gcc 는 컴파일러입니다. 당연히 소스를 컴파일 할수 있읍니다.
그런데 gcc만 가지고 있어서는 아무런 일도 못합니다.

왜냐구요?

그이유를 알고 싶으시다면 kelp/임베디드강좌/초보 에
holelee 님이 쓰신 gcc 이야기 시리즈를 읽어 보시기 바랍니다.
( 개인적으로 많은 깨달음을 얻게 해준 내용 입니다 )

그래서 gcc 이외에 필요한 프로그램과 데이타(?)들이 있읍니다.
이런 것을 모두 모은 것을 크로스 컴파일러 툴 체인이라고 합니다.

컴파일러 툴이라면 될 텐데 굳이 체인이라고 붙인 이유는
제 개인적인 생각으로는 각 패케지간에 서로 의존적이기 때문일것으로
추측합니다.

이 툴 체인의 목록은 다음과 같습니다 .

binutils - 어셈블러, 링커 그리고 라이브러리 관련 실행 화일들 모음
kernel - 리눅스 커널 ( 헤더 파일 때문에 필요함 )
gcc - 컴파일러
glibc - 라이브러리 및 헤더화일

추가적으로

gdb - 디버거 ( 이놈은 그냥 옵션으로 생각하시면 됩니다. ^^ )

가 있읍니다.

4.1 gcc의 3.0 대의 속설(?)

많은 분들은 gcc의 3.0 대에 문제가 있다고 알고 있어서
이 버전을 회피하시면서 예전 버전을 고집하시는 경향이 있읍니다.

그런데 이 부분은 오해랍니다.

문제가 되는 버전은 gcc 3.0 입니다.
당연히 문제가 발생했으니 해당 버전을 고쳤겠지요

그래서 3.1 대 이후라면 별 문제는 없읍니다

크로스 컴파일을 하시는 분이라면 최근 프로세스를 쓰기 위해서는
예전 버전으로는 한계가 있읍니다.

최신 버전을 쓰셔야 지원되는 프로세스가 있읍니다.

넘 겁먹지 마시고 3.0대를 쓰시기 바랍니다.

4.2 binutils

바이너리 유틸이라고 합니다.
포함되는 내용은 다음과 같죠...

addr2line - 실행화일의 어드레스에 대한 소스화일명과 라인 넘버를 표현해주는 프로그램입니다.
ar - 라이브러리를 관리하는 프로그램입니다.
as - 어셈블러 입니다.
c++filt - 잘 모르겠읍니다. ^^
gasp - 어셈블러 매크로 해석기 입니다.
ld - 링커 입니다.
nm - 오브젝트안의 심볼릭을 표시해 주는 프로그램입니다.
objcopy - 오브젝트 화일을 컨버팅 해주는 프로그램입니다.
objdump - 오브젝트 화일의 정보를 표시해 줍니다.
ranlib - 라이브러리의 인덱스 화일을 생성합니다.
readelf - elf 포맷의 화일 헤더 정보를 해석해 줍니다.
size - 오브젝트 화일의 섹션 크기와 포함된 오브젝트의 총 크기를 표시해 줍니다.
strings - 프로그램 내부에 사용되는 초기화 문자열들을 골라 표시해 줍니다.
strip - 오브젝트나 실행화일의 정보를 선택적으로 제거해 줍니다.

4.3 kernel

크로스 컴파일러를 만들때 사용되는 데이타 타입이나 시스템 콜을 참조하기 위해서
필요한 헤더화일을 참조하기 때문에 툴체인에 들어 갑니다.

엄밀히 말하면 kernel의 헤더화일만 필요합니다.

4.4 gcc

패케지가 일반적으로 지원하는 것은 각 언어별로 지원합니다.
다음은 크로스 컴파일러로 쓰는 대표적인 것 들입니다.

gcc,cpp,g++,c++,gccbug,gcov

설명을 굳이 달지 않는 이유는 저는 gcc 이외에는 거의 쓰지 않기 때문에
뭐하는 놈들인지 잘 몰라서 입니다. 이해해 주세요...

4.5 glibc

커널을 컴파일하거나 부트로더를 컴파일 할때는 필요 없읍니다.

하지만 응용프로그램을 사용한다면 당연히 이것이 있어야 합니다.

여러분들 중에서 glibc와 newlib 를 혼동하시는 분들이 있읍니다.

glibc 는 GNU 라이브러리 입니다. 크기가 매우 커집니다.
newlib는 glibc가 매우 크기 때문에 꼭 필요한 놈들만 골라서 추려놓은 것이죠
그래서 크기가 매우 작습니다.

특별한 경우가 아니라면 저는 newlib를 별로 추천하지 않습니다.
가끔 리눅스용 프로그램을 임베디드 제품에 포팅하다보면 없는 함수가 있어서
곤란을 겪기 때문입니다.

램이나 플래쉬 시스템이 16M 이상이고 여유가 있다면 가급적 glibc를 쓰시기를
권유합니다.

4.6 gdb

이놈은 디버거죠..

즉 프로그램을 디버깅 할때 유용한 도구 입니다.
하지만 윈도우 디버거를 사용하시던 분이라면 매우 불편함을 느끼실 겁니다.

하지만 없는 것 보다는 있는 것이 좋습니다.
printf 만 가지고 디버깅 하시면 매우 힘들끼 때문입니다.

더구나 익숙해지면 의외로 막강한 기능에 놀라시게 됩니다.

이 놈을 굳이 툴체인에 포함시키지 않는 것은 상호 연관관계가 별로 없어서
입니다.

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
초보자 아닌 분은 보지 마십시오...

1. 글을 시작 하며

이글은 임베디드 리눅스의 초보자를 위한 글입니다.
(이미 알고 계신분은 물러 가십시오... ^^ )

이글의 내용 중 일부는 저의 잘못된 경험에 의해서 오류가 있을 수
있읍니다.

오류를 발견하시면 바로 지적을 부탁 드립니다.

이글은 임베디드 시스템에 리눅스를 사용하기 위해서 사용되는
크로스 컴파일 환경에 대한 간단한 소개 글이지 설치 방법에
대한 글이 아님을 미리 말씀 드립니다.

2. 크로스 컴파일러란?

대부분의 프로그래머들은 PC 라는 동일한 환경에서 프로그램을
작성하실 겁니다.

PC에서 프로그램을 짜고 컴파일 하고, 실행 화일을 PC에서 수행 합니다.

이렇게 동일한 환경에서 동작 되는 컴파일러와 이 컴파일러에서
생성된 실행화일을 동일한 환경에서 수행 한다면 이때의 컴파일러를
네이티브( native ) 컴파일러라고 합니다.

이와 반대로 컴파일러가 동작하는 시스템과 컴파일러에 의해서 생성된
실행화일이 동작하는 시스템이 다를 때 이 컴파일러를 크로스(cross)
컴파일러라고 합니다.

여러분이 임베디드 시스템에 동작하는 프로그램을 작성한다면
당연히 크로스 컴파일러 환경을 구축해야 합니다.

개발 환경은 PC 일것이고 실행 화일이 동작하는 시스템은
다른 CPU 구성을 갖는 임베디드 시스템일 것이기 때문입니다.

그렇다고 모든 임베디드 시스템에 동작하는 프로그램들이 크로스
컴파일 환경을 필요로 하는 것은 아닙니다.

PC와 같은 구조를 갖는 임베디드 리눅스 시스템을 만든다면
PC의 네이티브 컴파일러에서 만들어진 실행화일이 그대로
수행될 수 있기 때문입니다.

하지만 임베디드 시스템 대부분이 저렴한 가격대를 요구하거나,
또는 특수한 기능을 수행하는 구조를 가지기 때문에 이런 경우는
조금 드믄 편입니다.

그래도 개발 프로세스를 빠르게 진행하기 위해서 익숙한 PC 구조를
사용하는 경우도 요즈음은 많아 지는 추세인것 같습니다.

어찌되었든 크로스 컴파일 환경에서의 개발은
윈도우 개발자 입장에서 보면 매우 열악한 개발 환경이 됩니다.

돈이 많은 회사야 좋은 개발 툴을 사서 이런 열악한 환경을
일부 개선하기는 하지만 그래도 열악하기는 마찬가지 입니다.

가장 큰 이유는 컴파일이 끝난후 실행 화일을 즉시 시험하지
못하기 때문입니다.

그외에도 개발하기 위해서 손가락이 무척 바빠지는 것도
한 요인입니다. 단순하게 마우스 클릭 한번으로 수행되는
GUI 컴파일러에 익순한 분들이 타자를 치는 것은 무척 힘든
것입니다.

그래도 리눅스에서 크로스 컴파일러를 사용하는 것에는 이유가
있읍니다.

3. 리눅스와 gcc

지금은 많은 분들이 임베디드 시스템 개발에 리눅스를
사용되고 있다는 것을 알고 있읍니다.

하지만 그 이유가 리눅스 커널을 임베디드 시스템에 탑제하기
때문이라고 알고 계신다면 잘못 알고 계신 겁니다.

임베디드 시스템 개발 환경으로 리눅스를 사용하는 근본적인
이유는 gcc라는 막강한 컴파일러가 있기 때문입니다.

리눅스만 사용하시는 분이라면 리눅스 프로그램 개발을 위해서
당연히 gcc라는 컴파일러를 사용합니다.

그래서 gcc라는 것이 그냥 리눅스용 컴파일러라고 알고 있읍니다.

하지만 gcc는 그렇게 단순한 컴파일러가 아닙니다.

또한 gcc는 그냥 i386 프로세서에서 동작하는 실행화일을 만들어
내는 컴파일러도 아닙니다.

현재 존재 하는 컴파일러 중에서 가장 많은 프로세서를 지원하는 컴파일러가
바로 gcc입니다.

gcc 컴파일러의 패케지는 이미 전세계에 동작되는 대부분의 프로세서를
지원하기 위한 준비를 갖추고 있읍니다.

더구나 공짜입니다. !!!

하지만 여러분은 이런 gcc가 어떻게 다른 CPU를 지원하게 할 수 있는지에
대해서는 모를 겁니다.

그냥 gcc 명령을 치면 i386 코드가 생성되기 때문입니다.


3. 크로스 컴파일러와 gcc 소스 패케지

gcc에서 i386 이외의 실행화일을 만들기 위해서는 리눅스에 이미 설치된
gcc란 컴파일러는 소용이 없읍니다.

몇 가지 옵션만 바꾸어서 gcc 수행한다고 i386 이외의 프로세서를 지원하는
코드가 생성되는 것은 아닙니다.

애초에 다른 프로세서에서 동작 될 수 있는 실행화일을 만들수 있겠금 gcc를
만들어야 하는 것입니다.

그렇다고 기존에 i386에서 동작하는 gcc를 아예 다른 프로세서에서 동작하는
실행화일을 만드는 gcc로 바꾸어 버리면 문제가 됩니다.

그 뒤로는 i386에 동작하는 어떤 프로그램도 만들 수 없기 때문입니다.

그래서 보통은 gcc의 이름을 조금 바꿉니다.

예를 들어 arm 계열의 프로세서에서 동작하는 실행 프로그램을 만들기 위해서
사용하는 gcc는 arm-linux-gcc라는 이름을 가집니다.

이름이 다른 이 두 컴파일러는 전혀 다른 컴파일러가 아닌 똑같은 gcc인 것입니다
단지 gcc는 i386 프로세서에서 수행되는 코드를 만들어 내는 컴파일러이고
arm-linux-gcc라는 것은 arm 프로세서에서 동작되는 코드를 만들어 내는 컴파일러
일 뿐입니다.

관행적으로 네이티브용 컴파일러가 보통 gcc가 되고 크로스 컴파일러는 gcc
앞에 접두사를 붙입니다.

만약 알파 프로세서 동작하는 gcc에서 i386 계열의 실행 코드를 만드는 크로스
컴파일러는 i386-linux-gcc가 될 것입니다. ( 확인하지 않았읍니다. ^^ )

어찌되었든 둘 다 동일하게 gcc란 패케지에서 파생한 컴파일러인 것입니다.

자....

제가 자꾸 gcc 패케지라는 말을 쓰고 있읍니다.
이 gcc 패케지라는 것이 무엇일까요?

윈도우에서 델파이라는 개발 툴을 구매해서 설치하면 단순하게 델파이 컴파일러
만 설치되는 것이 아닙니다. 개발하기 위한 이것저것들이 설치 됩니다.

이와 동일한 개념으로 gcc 패케지란 컴파일을 하기 위한 이런 저런 것을 모두 담은 것을
말 하는 것입니다.

윈도우에서와 달리 리눅스에서는 패케지들이 소스로 구성되어 있읍니다.
그래서 이런 것을 gcc를 예를 들면 gcc 소스 패케지 라고 말합니다.

또 여러분이 착각하는 것중 하나가 gcc가 단순하게 c 컴파일러라고 알고 있는데
정확하게 이야기 하면 c 컴파일러가 아닙니다. c++ 소스를 컴파일
할때도 역시 gcc 를 사용합니다. 어셈블러를 컴파일 할때도 gcc를 사용할수
있읍니다.

그래서 gcc 소스 패케지에는 c 이외의 몇가지 컴파일러들이 더 들어 있읍니다.

어찌되었든 gcc 소스 패케지란 gcc 컴파일러를 만들수 있는 소스로 구성된 것을
말 합니다.

이 gcc 소스 패케지를 이용하여 원하는 프로세스 지원 크로스(또는 네이티브)
컴파일러를 만드는 것입니다.

그런데 아주 모순 된 것 중 하나는 gcc를 만들기 위해서는 gcc가 필요하다는
점입니다. 왜냐하면 gcc 소스 패케지이기 때문입니다.

하지만 이점은 여기에서 문제 삼지 않으려 합니다.
여러분의 리눅스에는 당연히 gcc 컴파일러가 이미 설치되어 있기 때문입니다.

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
글쓴이 : 임장섭 (2002년 03월 21일 오전 04:34) 읽은수: 2,250 [ 새소식 인쇄용 페이지 ]

Special Report

RISC는 임베디드에 유용한가?

하나의 프로젝트를 시작할 때 그 구성요소를 선택하는 것은 무척 어려운 결정이다. 그 중 중요한 결정 중의 하나는 RISC(Reduced Instruction Set Computer)와 CISC(Complex Instruction Set Computer) 중 하나를 선택하는 것이다. CISC는 요즘 기술이 빠르게 진보한다는 점을 가만하면 비교적 오래된 것이긴 하지만, 아직도 성능이 우수하며 CISC를 선택하는 것이 더 현명할 때도 있다.

새로운 프로젝트를 시작할 시점이라고 가정해보자. 당신은 마이크로프로세서를 선택해야 할 것이다. 32비트 프로세서가 필요하다고 결정하긴 했지만, 그 중 어떤 것인가? 100가지 이상의 다양한 32비트 임베디드 칩 중에 하나를 선택해야 한다. 따라서, 그 중 마음에 드는 몇 가지로 선택의 폭을 좁혀야 한다. 그렇다면 아마도 당신은 RISC 프로세서를 골랐을 것이다.
대부분의 프로그래머와 엔지니어들은 이렇게 말할 것이다. "요즘은 프로세서가 다 RISC 아냐?" RISC는 현대적이고 더 빠르며 더 매력적이다. 한마디로 더 호감이 간다.
그러나 최신 유행에 민감한 대부분의 엔지니어들은 인정하기 힘들지 몰라도, 10년 된 CISC 칩을 선택하는 것이 요즘 나온 RISC 칩을 선택하는 것보다 너 나을 수도 있다. 물론 항상 그런 것은 아니지만, 실제 설계자들이 느끼는 것보다는 더 자주 있는 일이다. CISC 칩은 아직도 건재하며, 대부분의 인기있는 RISC보다도 더 선호되고 있다. 모토로라와 MIPS사는 32비트 프로세서 판매에서 1, 2위를 다투고 있으며, 1998년 기준으로 각각 8,330만 개, 5,000만 개의 판매고를 기록했다. 인텔의 CISC dinosaur(68K인 것으로서)도 1,230만 개의 높은 판매량을 기록한 제품이다. CISC는 RISC라는 용어가 생기고 나서 생긴 용어다. 세계대전(Great War)이 2차 세계대전(World War Ⅱ)이란 말이 생긴 이후 1차 세계대전(World War I)으로 바뀌어 불렸듯이, CISC란 표현은 이와 반대 개념인 RISC란 용어가 생김에 따라 나오게 된 용어다.

RISC란 무엇인가?
우선, RISC란 실제로 무엇인가와 RISC가 무엇을 의미하는 지를 구분해서 알아보자.
RISC는 reduced instruction set computer의 약자로서 컴퓨터(혹은 그 내부의 프로세서)가 축약형 명령 셋을 가지고 있음을 암시한다. 그것은 CPU Lite와 같다. 당신은 RISC가 마이크로프로세서의 분해된 형태일 뿐이라고 냉소적으로 말할 수도 있다. 부분적으로는 맞는 말이다.
RISC의 개발원리는 프로세서를 완전히 분해하는 것이었다. 꼭 필요한 요소가 아니면 다 버렸다. 이것은 프로그래머의 관점에서 볼 때, 때로는 RISC 칩이 간단한 곱셈도 할 수 없다는 것을 의미한다. 그 의견은 곱셈은 단순히 반복되는 덧셈이기 때문에 ADD 명령이 충분히 좋아야 한다는 것이다.
RISC가 처음 부상하기 시작한 1980년대에 UC Berkeley와 Stanford에선 무슨 생각을 하고 있었을까? 무어의 법칙에 의해, 매달 칩 디자이너에게 4%의 하드웨어를 넣는 것은 축소를 위해 바람직하지 않은 것으로 생각했다. RISC의 기초가 되는 아이디어는 복잡한 기능은 하드웨어가 아닌 소프트웨어에서 더 효율적으로 행해진다는 것이다. 소프트웨어는 하드웨어보다 바꾸기 쉽고, 업데이트하기 쉬우며 더 빨리 만들어 낼 수 있다. 새로운 칩을 설계해서 만드는 것보다 새로운 코드를 쓰는 것이 더 빠르다. 따라서 RISC를 기반으로 하는 컴퓨터는 더 빨리 업그레이드될 수 있다. 프로그램과 알고리즘은 기록시간에서 변경되고 향상되어 진다. 무엇보다도 RISC 하드웨어는 단순화되고 능률적으로 되어가기 때문에 칩도 더 빨리 작동할 수 있다. 모두가 다 좋은 것이다.
본래의 RISC 칩은 CISC의 반대 개념으로서의 현재 RISC보다 더 작고 단순했으며 빨랐다.
68020과 80286과 같은 프로세서가 수년간 축적해 온 것들을 버림으로써 SPARC와 MIPS 같은 RISC가 만들어졌다.
클록 주파수의 측면에서 RISC는 완전한 승리자였다. 기술 잡지와 산업간행물들은 RISC의 등장을 컴퓨터의 신기원이라고 환호했다.
주위에서 가장 빠른 프로세서를 찾으라고 한다면 누구나 인텔의 펜티엄을 선택할 것이다. 이것이 당신이 구할 수 있는 가장 빠른 프로세서라는 것이 애통할 만한 일이었다. 그렇다면 SPARC는? 썬사의 워크스테이션은 현재 가장 느린 32비트 칩 중의 하나에 의해 가동되고 있다.
뭐가 잘못된 것인가? 확실히 1990년대에는 RISC를 둘러싼 과장이 많았다. RISC가 PC산업에서의 인텔의 압도적인 우세를 꺾을 마지막 기회로 보여졌기 때문에 어느 정도는 이해가 간다. 만약 RISC가 반값으로 두 배의 성능을 보여주었다면(절대 실현될 수 없는데도 종종 반복되는 주장) 확실히 전세계는 인텔과 그 독점회사들을 포기했을 것이다. RISC는 가진 것 없는 자들의 마지막 희망이었다.
동시에 RISC의 기세는 인텔을 포함한 CISC 벤더들을 자극했다. 모토로라는 68030과 68040으로 68K 제품군을 확장시켰고, x86 아키텍처는 68386과 68486으로 한 단계 나아갔다.
하지만, 하나의 예외로 인해 그들은 그렇게 할 수 없었다. 68K 프로세서는 클록 속도가 대부분의 32비트 칩보다 뒤떨어져 최대치가 남들이 세 자리 숫자일 때 66 MHz 이었다. 요즘도 대부분의 68K 프로세서는 100 MHz 이하의 속도에서만 사용할 수 있다.
이것이 CISC 프로세서의 죽음을 이야기하는가? CISC는 영원히 사장되고 마는 것인가?
그렇지 않다. 클록 속도에서는 종종 뒤쳐지지만 68K와 x86 같은 CISC 칩은 아직도 충분한 능력을 수행하고 오히려 RISC 보다 더 낫다. CISC 칩은 고려해 볼만한 가치 이상의 것이며 때론 임베디드 시스템을 위한 최고의 선택이 되기도 한다.

장점과 단점
RISC 아키텍처로 얻을 수 있는 것은 직교명령집합(orthogonal instruction set)이 있는 비교적 간단한 CPU이다. 모든 명령은 같은 길이를 가지고 있어 RAM에 깔끔하게 정렬된다. 또한 비슷하게 엔코더 되기 때문에 RISC opcode를 해체하고자 한다면 작업이 쉬워진다. 메모리에서 명령을 카운트하는 것도 쉽다. 마지막으로 RISC 명령은 거의 항상 단일 클록 사이클에서 실행되기 때문에 특정 루틴의 사이클 수를 계산할 수 있다.
RISC는 명령이나 혹은 당신이 좋아할 지도 모르는 다른 기능들이 없다. 우선 수학이 있다. 대부분의 RISC 칩에는 원래 곱하거나 나누는 명령이 없다. 그리고 대부분은 아직도 나누기를 못한다. 당신이 어셈블리 언어 프로그래머라면 축하한다. 당신은 정수를 곱하고 나누기 위해 코드 루틴을 소유하게 된다. 부동 소수점 계산은 신경 쓰지 않아도 된다. 대부분의 RISC 칩은 이 기능도 없다. 대부분의 CISC 칩에도 FPU(부동소수점처리장치)가 없지만 새로운 RISC 칩보다는 오래된 CISC 프로세서에서 더 자주 볼 수 있다.
또한 bit twiddling도 없다. 시스템에 레지스터나 다른 주변장치가 많다면 프로세서가 32 bit word보다 적은 것을 처리하지 않을 때 더 곤란해진다. 많은 RISC 설계자들은 단일 비트 구동을 명백하게 이단 시 했다. 예를 들어, 상태 레지스터(status register)에서 단일 비트를 체크하고 고정(toggle)하기 위해 당신은 프로세서로 들어가는 메모리의 전체 레지스터(그리고 그 주위 메모리 32비트 전체 혹은 I/O)를 읽어야만 한다.
정렬되지 않은 메모리 액세스는 RISC의 또 다른 골칫거리다. RISC 칩은 워크스테이션을 위해 설계되었는데, 워크스테이션에선 컴파일러가 항상 워드 경계를 따라 데이터를 정렬해 놓는다(바이트처럼). 더 작은 수는 존재하지 않거나 32비트 단어에 맞추기 위해 zero-pad된다. 임베디드 시스템에서는 좀처럼 그렇게 깔끔하지 않다.
홀수 어드레스에 저장된 32비트처럼 메모리 경계 주위를 둘러싼 숫자는 많은 RISC 칩에 접근하기 어렵다. 그들은 정렬되지 않은 연산 수를 다룰 수가 없다. 마찬가지로 24-bit 값과 같이 odd-sized quantity는 저장될 때 zero-extend 또는 sign-extended 되어야만 하므로 결과적으로 RAM을 낭비한다.
좋은 소식은 컴파일러는 이 중 어떤 것도 감지하지 못한다는 것이다. 당신이 어셈블리 언어 프로그래머라면 RISC가 곤혹스러울 것이다. 만약 당신이 컴파일러를 가지고 C나 다른 고수준(high level) 언어로 프로그램을 쓴다면 이러한 제약을 거의 깨닫지 못하게 될 것이다. 당신이 코드 밀도에 관심이 없다면 말이다.
image_view.jpg
코드 밀도
많은 임베디드 설계자들은 마이크로프로세서보다 시스템 내의 RAM과 ROM에 더 많은 비용을 소비한다. 메모리는 많은 시스템의 특성을 정의(또는 한정)한다. 마케팅은 메모리에 비용을 더 쓰기보다는 기능을 줄이고 싶어한다. 프로그래머는 메모리 예산에 코드를 맞추어야 한다.
이러한 면에서 코드 밀도는 큰 문제가 될 수 있다. 코드 밀도는 실행 가능한 프로그램이 얼마나 꽉 차 있는 지를 보여준다. 그것은 프로그램의 풋프린트이며 하나의 프로세서에서 다른 프로세서로 완전히 변한다. 이것을 경험해 보지 못했다면 당신은 컴파일된 C 프로그램은 모두 다 똑같고 어떤 칩이 실제 코드를 실행시키는 지는 중요하지 않다고 생각할 수도 있을 것이다. 이것은 큰 오산이다.
다른 칩을 위해 컴파일된 아주 똑같은 C 프로그램은 완전히 다른 메모리 풋프린트를 만들어낸다. 이것은 컴파일러의 실수나 오류가 아니다. 그것은 다른 칩보다 더 밀도가 높은 바이너리를 생산하는 몇몇 CPU 칩의 자연스런 특성이다.
그림 1은 많이 사용되고 있는 32비트 마이크로프로세서들의 코드 밀도 비교한 것이다. 그림에서 볼 수 있듯이, 차이는 절반까지 생길 수 있다. 이러한 칩들이 실제 같은 프로그램(같은 소스 코드)을 실행하고 있고 같은 결과를 가져온다고 해도 어떤 칩은 다른 칩 코드 공간의 반만 있으면 된다는 것이다.
CISC 칩의 코드 밀도가 RISC 칩의 코드 밀도보다 더 좋다는 것도 알 수 있다. RISC의 원칙 중의 하나는 모든 복잡한 기능은 다 소프트웨어에서 행해지고 하드웨어는 단순화되어야 한다는 것이다. 이는 RISC 칩이 같은 일을 하기 위해 CISC 칩보다 더 많은 소프트웨어를 필요로 할 것이라는 것을 의미한다. 대부분의 RISC 칩은 나누기 명령이 없다. 만약, 두 숫자를 나누길 원한다면 소프트웨어에서 하면 되는 것이다.
이에 대해 당신이 코드나 컴파일러에서 할 일은 없다. 컴파일러는 주어진 하드웨어 명령과 함께 일해야만 한다. 당신의 프로세서에 축약형 명령어가 있다면 컴파일러는 더 많은 소프트웨어를 만들어냄으로써 그것을 보상해 줄 것이다.

코드 압축
CISC 칩이 더 나은 코드 밀도를 가지고 있는 또 다른 이유는 그 명령이 짧아지는 경향이 있기 때문이다. 정의에 의하면, 32비트 RISC 칩은 32비트 명령을 가지고 있다. 반면 32비트 CISC 칩은 아마도 8비트, 16비트, 32비트 그리고 심지어 더 큰 명령을 갖게 될 것이다. 이것은 CISC 칩을 복잡하게 만드는 기능 중의 하나 이지만 임베디드 시스템 내에서는 더 효율적으로 만들기도 한다.
왜 당신은 명령 비트에 신경을 쓰는가? 예를 들어, 68020은 ADD 명령을 8비트 프로그램 메모리에 맞출 수 있지만 MIPS R4000은 32비트를 필요로 하기 때문에 프로그램이 두 개의 숫자를 같이 더할 때마다 이전 메모리의 3/4를 버리게 된다. 또한 MIPS 칩은 68K보다 빠른 것은 첨가할 수 없다.
최근 몇몇 RISC 벤더는 이 문제에 대한 현명한 해결책을 발견했다. 일반적으로 그 해결책은 코드 압축(code compression)이라 불리지만, 그것은 잘못된 이름이다. 아무도 PKZIP을 이용해서 코드를 압축하지 않는다. 대신에 그들은 칩의 명령 셋을 약간 바꾸어 모든 명령이 32비트 길이가 되지 않도록 한다.
이에 대한 세 가지 예가 ARM, ARC Cores 그리고 MIPS이다. 이들은 각각 Thumb, ARCompact, MIPS-16이라 불리는 비슷한 코드 압축 설계가 있다. 세 경우 모두 칩이 소수의 16비트 명령으로 그들의 32비트 명령 집합을 선택적으로 증대시킬 수 있다. 각각의 C 컴파일러는 이제 바이너리를 더 작게 만들면서 16비트 명령을 코드에 뿌릴 수 있다.
얼마나 더 작아지는 지는 여러 요인에 따라 다르다. 그리고 이미 알고 있는 바와 같이 마케팅 광고만큼은 힘들다. 실제 테스트에서 축소는 대략 20∼30% 정도이고 프로그램에 따라 다르다. 그것은 단지 코드 공간의 압축일 뿐이라는 것을 명심하라. 데이터 스토리지는 압축되지 않는다. 하지만, 코드 압축은 올바른 진보이며 RISC 아키텍처를 더욱 매력적으로 만드는 요인 중의 하나이다.
ARM Thum과 MIPS MIPS-16의 두 경우에, 당신의 코드는 32비트 모드와 16비트 모드 사이에서 확실히 스위치되어야 한다. 두 개의 명령형을 혼합할 수 없기 때문에 당신은 32비트의 명령을 사용하여 구동하는 코드에서 16비트의 동작과 함께 구동하는 코드를 분리해야 한다. 우선, 전적으로 16비트 명령과 함께 구동하는 코드 영역을 찾아야 한다.
더 짧은 명령을 위한 trade-off는 그들의 제한된 레퍼터리(repertoire)이다. 예를 들어, 16비트 코드는 인터럽트, 캐시 관리, 메모리 관리, 제외(exception) 또는 롱 점프(long jump) 등을 처리할 수 없다. 운 좋게도 Thumb와 MIPS-16 컴파일러는 이를 분류한다. ARC의 ARCompact는 두 모드 사이에서 스위치하지 않기 때문에 이 제한을 받지 않으며, 두 사이즈의 명령을 자유롭게 혼합하기 때문에 프로그램을 분리시키려고 애쓰지 않아도 된다.
IBM에서 나온 CodePack system은 임베디드 PowerPC 칩에 또 다른 방식으로 접근한다. 다른 세 개의 압축 RISC 명령어와는 달리, IBM은 PKZIP을 사용하는 것처럼 오브젝트 코드(object code)에서 실제로 실행 바이너리들을 압축한다. 이 때 컴파일되고 어셈블되고 링크된 후에 프로그램을 압축할 수 있다. 그리고 나서 압축된 것을 ROM이나 디스크에 저장한다.
임베디드 PowerPC 칩은 메모리로부터 패치될 때 명령을 푸는 별도의 하드웨어가 있다. 그림 2는 어떻게 각각의 명령이 풀리고 압축되는 지 보여준다.
첫째, 당신의 코드는 보통 오브젝트 코드 형식에서 저장되지 않았기 때문에 완전히 불가사의하다. 그 코드는 압축되었고 그것이 압축 해제를 어렵게 만든다. 코드를 보호해야 할 필요성이 있을 때엔 이것이 장점으로 작용할 것이다. CodePack은 소프트웨어를 압축해줄 뿐만 아니라 효과적으로 엔코드 해준다.
둘째, CodePack은 fly 상에서 소프트웨어를 풀어야 하는데, 그것은 가끔 보통 예상하는 것보다 시간이 오래 걸리기 때문에 재미있는 기능을 수행하기도 한다. CodePack이 장착된 PowerPC 프로세서는 branch와 jump을 처리하기가 까다로운데, 이는 branch target이 ROM에 놓여진 코드의 커다란 블록의 어딘가에 엔코드 되었을 때 위치를 정하기 어렵기 때문이다.
셋째, 각각의 CodePack 프로그램은 자신만의 압축키를 사용하기 때문에 프로그램이 다르면 압축도 다르게 된다. 이는 압축된 바이너리들이 양립할 수 없음을 의미한다. 따라서, 키가 없으면 다른 PowerPC에서 가동되지 않을 것이다.
마지막으로, CodePack은 ARC, ARM, MIPS와 똑같은 30%의 compression factor를 보증한다. 그 모든 복잡성을 감안한다면 두드러지게 좋아진 것은 아니다. 하지만, IBM은 획기적인 일을 해냈다.

RISC POWER
RISC 칩이 가지고 있는 하나의 장점은 전력소모량이다. 대개 RISC 칩은 CISC 칩보다 전력을 덜 소모한다. 이것은 명백하다. 만약 RISC 프로세서의 회로 설계가 더 단순하고 간소화되었다면 그것이 전력을 덜 소모하는 이유가 되었을 것이다. 트랜지스터가 더 적다는 것은 에너지가 덜 확장된다는 것을 의미한다.
ARM 프로세서는 전력을 적게 소모하기로 유명한데, 애석하게도 진실이 아니다. 물론 ARM 프로세서는 인텔의 486보다야 전력을 덜 소모하지만, 그것은 Hoover 댐도 마찬가지이다.
공정하게 말해서 ARM 프로세서는 전력을 덜 소모하는 편이긴 하지만, 같은 시기에 나온 대부분의 RISC 프로세서도 다 마찬가지이다. 1994년의 다른 프로세서와 비교하면 ARM7은 경이로울 만큼 전력효율이 높지만 2002년에는 많은 RISC 프로세서가 있을 것이다. 심지어 어떤 CISC 프로세서는 전력효율이 ARM보다 높다. MIPS, SuperH, ARC Core 그리고 다른 것들도 모두 저전력 코어를 가지고 있다.
RISC의 전력 상의 이점은 자동온도조절기(thermostat)나 휴대전화기, 스마트카드 등을 만들 경우에는 무척 중요하지만, 그 외의 다른 애플리케이션에서는 그다지 중요치 않다. 첫 번째 카테고리를 위해 RISC 프로세서는 좋은 선택이다. 비록 당신이 메모리 전력을 소비해도 좋지만, 당신은 CPU 전력을 절약해야 하는 바 조심해야 한다.
코드 밀도는 전력소모에 관계하기 때문에 코드 밀도가 더 나은 칩은 전체적으로 메모리 액세스를 많이 만들지 않아 시스템 전력을 덜 소모할 것이다.
ROM으로부터의 패치나 RAM으로의 읽기/쓰기 액세스는 전력을 적게 소모한다. 그것을 최소화할수록 더 좋다. 여기에는 확고한 법칙이 없기 때문에 예를 든다면 코드 밀도가 2배 증가하였다고 하여도 전력도 2배 증가한다고 말할 수 없다. 애플리케이션마다 다르지만, 만일 당신이 전력소모에 대한 압박을 받게 된다면 이 관계를 기억해라.

성능
RISC의 주요 이점 중에 하나가 그 탁월한 성능이고 따라서 RISC 칩은 항상 빠르다고 할 수 있을까? 한마디로 대답은 "아니오"이다.
무엇보다도 성능이란 말은 애매 모호한 표현이다. 모든 사람은 각각 다른 종류의 성능에 관심이 있다. 예를 들어 미디어 프로세싱에 좋은 것이 네트워크 프로세싱에는 좋지 않을 수 있다. 모든 것에 뛰어난 프로세서는 없다고 말해두겠다. 모든 CPU 명령 셋은 절충일 뿐이다.
당신은 당신의 특수한 애플리케이션에 맞는 ISA(Instruction Set Architecture)가 있는 CPU를 선택해야 한다. 같은 속도로 가동되는 두 개의 칩(여기선 100 MHz라고 하자)은 ISA의 차이에 의해 완전히 다른 성능을 제공할 수 있다.
대부분의 RISC 명령 셋은 거의 동일하다. 그렇다면 결국 그들은 아주 기본적인 것만을 지원하도록 되어 있었던 것인가? 실제 모든 RISC 아키텍처는 수년간 RISC 원칙을 따르지 않는 변형된 기능에 의해 타락해 왔다. 하지만, RISC 칩은 포괄적이고 호환성이 있다.
CISC 진영에는 시스템에 믿을 수 없을 만큼 유용하거나 시스템과 전혀 관련이 없는 여러 가지 명령들이 있다. 때론 어디서 이렇게 괴상한 명령이 나왔을까 생각되기도 하고 다른 프로그램은 이것을 어디다 쓸까 하고 의아해질 때도 있다.
그 중 내가 가장 좋아하는 것 중의 하나는 모토로라에서 나온 68300 제품군 칩에서 발견된 TBLS 명령이다. TBLS는 table look up이고 interpolate instruction이다. 대부분의 프로그래머는 그것을 절대 사용하지 않겠지만, 이런 명령이 필요할 경우 이것은 그야말로 구세주이다.
TBLS 명령은 데이터 포인트의 스파스 테이블(sparse table)에서 복잡한 기하학 함수(geometric function)를 만들 수 있게 해준다. TBLS는 당신이 만들어 놓은 값의 테이블을 탐색해서 가장 가까운 두 개를 당신이 지정한 숫자에 위치시킨다. 그리고 나서 linear interpolation을 통해 그 두 데이터 포인트 사이의 정확한 값을 계산한다. 본질적으로 TBLS는 그림 3에서 보는 것과 같이 X, Y분산그래프의 점들을 연결시킨다.
이상해 보이는가? 그럴 수도 있다. 하지만, 만약 당신이 동작제어를 하고 있다면, 이것은 무척 긴요하게 쓰일 것이다. 이게 없다면 모든 종류의 exception과 boundary case를 가지고 수백 개의 다른 기하학 함수를 코드해야 한다. TBLS는 약 30 클록 사이클에서 실행되는 단일 명령이란 것을 명심해라.

RISC 대 CISC
한마디로 RISC는 빠른 클록 속도를 얻기 위해 feature와 function을 포기하는 것을 의미한다. 당신이 속도를 숭배하고 클록 속도야말로 당신의 모든 것이라고 생각한다면 RISC가 적격이다. 당신은 200 MHz RISC 프로세서를 이용해 75 MHz clunker를 이용하는 것보다 더 높은 clock rate를 얻을 수 있다.
그러나, 더 나은 성능을 얻을 수 없게 되거나 비용만 많이 들이게 될 수도 있다. 빠른 프로세서는 빠른 RAM, 빠른 ROM, 빠른 I/O를 원한다. 당신의 전체 버스 구조도 더 빨라져야 할 것이다.
RISC에 특별한 명성이 있다는 점을 부인할 수 없다. 그것은 새롭고 흥미로운 것으로 인식되고 있으며, 아직도 CISC 프로세서가 강세라는 의견은 반 직관적으로 보인다. 그럼에도 불구하고, CISC는 많은 장점들을 가지고 있다. 코드 밀도와 집적이 더 좋으며, 비트 조작, 메모리 액세스, looping, decision tree 등을 위한 특수한 명령의 성능이 뛰어나다. RISC는 어떤 추상적인 우아함이 있지만, 이것은 비즈니스에는 소용이 없다. 때로는 느리고 꾸준한 것이 경기에서 승리할 수 있다.

+ Recent posts