이렇게 생각해보면 어떨까 한다. 택배시 스템을 보자. 택배 시스템이 제대로 운영되기 위해서는 택배를 의뢰하는 물건을 제때에 제대로 받아와서, 의뢰한 주소에 역시 제 때에 제대로 전달되어야 좋은 시스템으로 평가될 것이다. 우리나라의 경우, 고도로 발달한 도로망 시스템을 보유하고 있음에도 불구하고 번지 시스템이 후져서 택배를 의뢰할 때 번지정보로 위치를 알려주는 경우는 많지 않다. 번지를 알려주었다가는 바보아냐 하는 소리듣기 쉽상인 지역도 허다하다. 이처럼 택배시스템의 경우, 중요 거점을 활용하여 위치를 알려주는 방식을 많이 활용하고 있기는 한데 왜 이렇게 될 수밖에 없을까? 그것은 바로 신속 배송이라는 전제를 깔고 있기 때문인 것이다.
일반 우편 시스템을 General Purpose Processor 에 비교한다면, 택배와 같은 시스템을 DSP에 비교할 수 있을 것이다. 이건 순전히 필자마음인데, 글쓰기전에 적절한 비유가 무엇일까 생각해본 끝에 우편시스템과 택배시스템이 적합하다는 결론을 얻었기 때문이다. 산간오지라도 우편은 전달되지만, 택배는 전달되지 못한 경우가 많다. 하지만 신속하다.
DSP는 신속해야한다. 그래서, 신속하다. 말장난하려는 것이 아니다. 신속하려다 보니, 메모리 접근을 다채롭게 하지는 못한다. 예를 든다면, 대부분의 DSP에서는 Byte addressing이 이뤄지지 못하고 있다. 대부분은 Word 단위로 이뤄지는데, DSP 용 C Compiler에서 short 형이나, char, int 등등의 크기를 살펴보기 바란다. 모두 한 워드로 되어 있음을 쉽게 볼 수 있다. byte 단위로 접근하기 위해서는 부수적인 일들이 필요한데, 이 부수적인 일들에 사이클을 필요하다보니 과감히 제거해 버린 것이다.
24계열이나 28계열도 마찬가지다. 최소 데이터 크기가 Word이다. 대신에 데이터 메모리 어드레싱을 한 사이클에 처리하도록 다양한 어드레싱 회로를 갖추고 있다. 이 어드레싱에 여러사이클을 뺏기게 되면, 실시간 신호처리는 요원하게 된다. 이요원은 예쁘기라도 한데... 같은 요원이지만 떠오르는 이미지는 다르다.
DSP 역시 마이크로 프로세서이기에 정확한 동작을 위해서는 정확한 데이터의 입출이 필요한데, 이 부분이 바로 어드레싱이다. 또한, 이 데이터들이 어디에 위치해 있어야 하나 하는 것들도 아주 중요한 데, 이 부분이 바로 메모리 맵에 나와 있는 것이다. 메모리 맵을 볼 줄 알게되면, 해당 마이크로 프로세서 프로그래밍은 거의 반은 끝난 셈이다. 문제는 얼마나 신속하게 입출 시키냐 하는 것인데, 예를 하나 들어 보자.
가장 극적인 부분이 FFT(Fast Fourier Transform)과정인데, 문제는 이 극적인 부분이 흔히 일어난다는 것이고, 심각한 것은 왜 그런지 잘 모른다는 것이다. FFT가 고속으로 돌기위해서는 데이터의 위치가 상당히 중요하다. Data Alignment가 어쩌고 저쩌고 하는 말들을 매뉴얼에서 볼 수 있는데, 바로 신속한 어드레싱을 위한 조건을 말하는 것이다. 데이터가 제대로 정렬이 되어서 정확한 번지에 저장이 되면 FFT 연산은 고속으로 일어난다. 그런데, 정렬이 되지 않고, 엉뚱한 번지에 들어가 있으면 DSP 칩은 번지 만들다 볼일을 다본다. 이 부분은 라이브러리 매뉴얼등을 꼼꼼히 읽어서 준비작업에 차질이 없도록 조처하시기 바란다.
이 FFT에는 데이터 정렬이 Bit Carry Reverse라는 재미난 규칙을 따르고 있는데, 어드레싱의 일종인 이 규칙이 바로 DSP 칩이 갖춰야 할 덕목중에 하나다. 뿐만이 아니라, DSP 칩이 쓰이는 분야는 대부분이 stream data processing이 이루지는 곳이다. 오디오, 비디오등등 데이터가 끊이없이 쏟아져 들어오고 이 데이터를 계속해서 처리해서 실시간으로 내보내야 하는데, 여기에는 circular addressing이 필요하게 된다. 이 두가지가 DSP가 갖춰야할 대표적인 어드레싱 덕목이다. 대부분의 DSP는 이 두가지를 다 갖추고 있다.
이 어드레싱은 C와 같은 하이레벨언어에서는 가려져서 잘 보이지 않는다. 역시 C가 최고야 하고 느낄지는 모르지만, C에서 속도에 대한 한계를 느끼게 되면 결국 신속한 데이터 처리를 위한 궁리를 하게 되며, 문제 해결의 종착지에는 어드레싱이 떡하니 버티고 있음을 보게 된다. 이 어드레싱에 대한 내용은 CPU 핸드북 게시판에서 [예제3-6]을 참조하여서 익히시기 바란다.
어드레싱에서 메모리 맵으로 주제를 옮겨 보자. 어드레싱은 결국 메모리 맵내에서 일어나게 되는데, 우선 2407A와 2812 메모리 맵을 한번 보도록 하자.

[그림 1] TMS320LF2407A의 메모리 맵
하버드 구조를 갖춘 칩 답게 프로그램 메모리/데이터 메모리 맵을 갖추고 있다. 마지막에 IO 메모리 맵도 있는데, 단순히 데이터 메모리 페이지가 하나 더있다라고 보면된다. 대신에 I/O 메모리 맵을 접근할 수 있는 명령어는 IN/OUT 두 개밖에 없다라는 것을 곁들어 알아두면 되는 정도다.
2407A와 같은 칩에서는 어드레싱 모드가 크게 두 개가 있을 수 있다. 프로그램 메모리 어드레싱/데이터 메모리 어드레싱인데, 프로그램 메모리 어드레싱은 칩 내부에 있는 프로그램 카운터(PC)라는 놈이 알아서 한다. 혹시 PC가 Reserved 된 영역등으로 가면 illegal address 로 간주하고 인터럽트까지 발생시켜주니 얼마나 고마운가. 데이터 메모리 어드레싱은 다르다. 개발자의 의도를 알아낼만큼 칩은 똑똑하지 못하다. 순전히 개발자 책임이다. 어드레싱 방법도 많아서, 적절한 방법을 선택하지 못할 경우, 칩은 탱자탱자거리면서 태업을 한다. 이것도 개발자에 기인한 것이기에 자신을 탓해야 한다.
하지만, 조금만 신경쓰면 아주 잘 부릴 수 있다. 또한, 잘 부려질 수 있도록 설계를 해두었다. 그림 1에서 보면 memory mapped register를 볼 수 있는데, 사용의 편리함을 위해서 레지스터에 번지를 부여한 것이다. 마이크로 프로세서는 사실상 레지스터의 집합체인데, 이 레지스터들에게 번지가 있다면 메모리 다루듯이 할 수 있어서 편리 해지는 것이다.
프로그램을 작성해서 플래시 메모리에 심어야 한다면, 프로그램 메모리의 0000h~ 7FFFh에 구워야 함을 알 수 있다. I/O 메모리를 사용할려면, 0000h~FEFF 내에서 입출이 이뤄져야 함도 알 수가 있다. 이런 것이 메모리 맵을 보는 것이다.
2812 메모리 맵을 보자.

[그림2] TMS320F2812의 메모리 맵
2407A에 비해 복잡해 보인다. 당장에 주소 정보를 보라. 0x000000 ~ 0x3FFFFF까지니 메모리가 얼마나 큰가? 참고로 28X Core는 4G 까지 어드레싱이 가능하다. 역시 이 칩도 최소 메모리 단위는 Word이며, 그림에는 없지만 1 word는 16비트로 구성된다.
온칩메모리와 외부메모리로 구분되어 있으며, 각각은 Data Space/Prog. Space로 나뉘어진 듯이 보여서 엄청 보기가 힘들다. 그래서, 메모리 맵을 보는 훈련이 필요하다. 이 짧은 글로 쉽지는 않겠지만, 간단하게나마 훈련을 해보자.
먼저 외부 메모리 영역.
온칩메모리 영역에서 Reserved 된 영역이 ZONE0,1,2,6으로 되어있고, Zone7등은 온칩메모리의 BROM 영역과 겹친다. 즉, ZONE7은 MP모드로 설정되었을 경우 BROM 영역을 대신하는 것이고 나머지는 사실 한 그림으로 합쳐 그릴 수 있다. 그러니, 별도의 메모리 맵이 아닌 하나의 맵을 보기 좋게 하기 위해서 부분 확대해서 그린 셈인데 어려워하는 경우가 많다. 즉, 단일 메모리 시스템을 갖춘 칩임을 알 수 있다.
Data Space와 Prog. Space
2812는 단일 메모리를 갖춘 칩인데, 이 칩의 레지스터들이 Peripherals Frame이라는 영역에 맵핑되어 있다. 이 부분이 사실 데이터 스페이스 역할 하는데, 큰 의미는 없다. 다만, 24계열의 코드와 호환을 위해서, 0x00 0000 ~ 0x00 FFFF를 240X의 Data Memory로 0x3F 0000 ~ 0x3F FFFF까지를 프로그램 메모리로 둔 것 뿐이다. 단일 메모리임에도 하버드 메모리 구조의 코드를 운용할 수 있는 것은 바로 다중 버스 구조 덕분이다.
글을 쓰다보니, 내용이 상당히 전문적으로 되 버린 듯 하다. 설명이 부족하거나 보충이 필요한 부분 지적해주시면 보강토록 하겠다. 모쪼록 도움이 되셨기를...
<자료출처 - (주)싱크웍스(http://www.syncworks.co.kr)>
※ 글을 옮겨갈 때에는 꼭 출처를 밝혀주시기 바랍니다.