공부하는 내용
Start!
앞의 글을 반드시 이해한 상태에서 공부하자!
앞선 학습에서도 언급 됐었지만 MMR이란 Memory Mapped Register의 약자이다.
메모리처럼 조작 가능한 레지스터를 의미한다. 그리고 DSP Controller등 Controller 계통의 마이크로 프로세서에는 주변회로가 다양하기에 레지스터가 매우 많다.
내부(internal) 레지스터
계산용으로 사용되는 내부 레지스터는 계산과정에서 자연스럽게 접근이 가능하기에 주소를 부여하지 않는다.
번지를 가진 레지스터는 데이터 메모리 주소 생성 회로를 거쳐서 해당 번지를 부여받고 데이터 교환 작업이 이뤄지기에 사이클이 더 소모된다.
계산에는 Accmulator 레지스터, 곱셈을 위한 T, P레지스터 등이 필요하다.
이러한 내부 레지스터는 번지가 없기 때문에 데이터 교환으로 레지스터간 전용 통로를 구축하며 이를 레지스터 버스라 부른다.
레지스터 버스를 이용하면 주소 생성 과정이 필요없어지고 -> 데이터 교환 작업 등이 매우 신속하게 처리된다.
그러나 처리 속도면에서는 좋을 수 있으나 레지스터간 채널이 급격하게 증가하여 칩이 커지게 된다. 또한 전력소비도 많아진다.
메모리를 다루는 고수준 언어에서 주소가 없으니 레지스터를 다룰 수 없다.
시대가 지나면서 MPU에 주변회로가 함께 집적되어 CPU가 필요로 하는 레지스터가 많아지고 C언어 등 프로그래밍 언어가 보편화 되어 이를 이용한 개발 환경 구축이 요구되었다. 칩 사이즈를 줄이기 위해 레지스터 버스의 증가를 억제하고 처리능력을 올리기 위한 해결책으로 데이터 버스를 활용하게 되었다. 이를 통해서 레지스터의 내용을 메모리처럼 입출력하고 조작가능하게 되었다. 이를 통해 C언어와 같은 고수준 언어를 통한 조작이 가능해 진것이고 MMR의 개념이 생겨난 것이다.
결론을 말하자면
레지스터의 관리를 용이하도록 하기 위해, 메모리 주소와 같은 주소를 레지스터마다 부여하였으며, 이로 인해 C언어와 같은 데이터 메모리 조작형 언어에서도 어셈블리의 도움없이 레지스터 조작이 가능해진 것이다.
정리
1.내부 레지스터에는 사이클의 단축을 위해서 번지를 부여하지 않았으며 데이터 교환을 위한 전용 통로로 레지스터 버스를 활용한다.
2.레지스터 버스의 사용은 칩의 사이즈 증가와 전력소비 증가를 야기한다.
3.이를 줄이기 위해 데이터 버스를 활용하게 되었고 이를 통해 레지스터마다 고수준 언어인 C를 통해 어셈블리 없이 메모리 조작이 가능해졌다.
==============================================================================
MMRs(Memory Mapped Registers)
일반 입출력 핀인 GPIO(General Pulpose Input Output)을 예시로 들어본다.
GPIO는 개발자가 임의로 입출력 상태를 설정할 수 있다. 이 레지스터는 모두 MMR이며 개발자의 의도가 GPIO장치에 대한 레지스터에 올바르게 반영되어야 할것이다. 개발자는 이 레지스터에, 메모리 값을 사용하듯 읽거나 쓰면서 레지스터 내용을 정할 수 있다.
DSP에는 많은 핀들이 달려있고 전원, ADC, JTAG등의 핀을 제외하고는 모두 GPIO로 쓰일 수 있다. '쓰일 수 있다'라는 말의 의미는 '다른 용도도 있다'라고 들릴 수 있다. 리셋 직후에는 GPIO A0인 핀을 '설정 여부에 따라' PWM1로 사용할 수 있다.
GPIO핀 구조
위 그림을 보면 알 수 있듯이, GPxMUX레지스터의 설정에 따라 GPIO핀의 기능을 정할 수 있다.
GPxMUX를 0으로 설정하여 일반 입출력 포트로 설정할 경우, 이를 입력으로 사용할 것인지 출력으로 사용할 것인지를 GPxDIR레지스터로 정할 수 있다.
일반 입출력포트를 입력으로 정했다면 이 포트의 값을 읽을 있어야 하고 출력으로 정했다면 값을 정해줘야 할 것이다. 이를 위한 레지스터가 GPxDAT이다.
이런 제어를 위한 MCU에는 다양한 주변회로가 탑재되어 있고 이를 다루기 위한 많은 레지스터가 있다. 이 레지스터들을 C언어처럼 데이터 메모리를 조작하기 위해 레지스터에 메모리 주소를 부여하였다.
예를들어 GPAMUX레지스터를 조작학 싶다면 0x70C0라는 데이터 메모리 번지를 조작하면 되는 것이다. 간단히 말해 0x70C0번지에 있는 변수를 조작하는 것과 동일하다.
이처럼 번지를 부여받은 레지스터를 MMR(Memory Mapped Register)이라고 하며, 이 덕에 C언어에서 어셈블리 없이 MMR의 조작이 가능하다.
정리
1.GPxMUX로 핀의 기능을 정할 수 있다.
2.GPxDIR을 조작하여 일반 입출력 핀의 입출력 여부를 정할 수 있다.
3.GPxDAT값으로 값을 읽거나 쓸 수 있다.
4.레지스터의 메모리 주소를 통해서 C언어처럼 조작할 수 있다.
5.이렇게 주소를 부여받은 레지스터를 MMR이라고 한다.
'TMS320 > Study' 카테고리의 다른 글
28계열의 MMR선언 및 조작(2) (0) | 2014.08.11 |
---|---|
28계열의 MMR선언 및 조작(1) (0) | 2014.08.11 |
cmd 파일 (0) | 2014.08.07 |
DSP281x_GlobalVariableDefs.c (0) | 2014.08.07 |
DSP281x_Device.h (0) | 2014.08.07 |