메모리맵(memory map)이란 메모리가 어떻게 구성되어 있는 지를 나타내는 그림이다. ATmega8(A)은 프로그램을 저장하는 2Kbyte 플래시메모리, 레지스터와 동적인 데이터를 저장하는 128byte의 SRAM 그리고 128byte의 프로그램 가능한 EEPROM이 내장되어 있다. 이들 메모리의 구조가 [그림 1]에 도시되어 있다. 만약 어셈블리어로 프로그램을 하려면 이들 메모리 구조는 완전히 숙지하고 있어야 한다. 한 가지 주의할 것은 프로그램 메모리는 한주소당 2byte(=1 word) 단위로 구성되어 있고 SRAM과 EEPROM은 1byte단위로 구성된다는 것이다. 메모리 맵의 폭으로 이를 구분해 놓았다.
[그림 1] ATmega8(A)의 메모리맵
이 그림을 보면 프로그램 메모리와 데이터 메모리가 별개로 구성되어 있고 독립된 주소체계를 사용한다는 것을 알 수 있다.
프로그램메모리는 10,000번 정도 읽고 쓰기를 할 수 있는 플래시롬(flash rom)이며 1Kword(1K×16bit)의 크기를 가진다. AVR은 하나의 어셈블리 명령어가 대부분 16bits로 구성이 되므로 최대 1000개의 어셈블리 명령을 써줄 수 있다는 말이 된다. 따라서 소규모의 프로그램을 개발하기 적합하고 더 큰 규모의 프로그램 작업이 필요할 때는 상위 계열의 uC를 선택해야 할 것이다. AVR의 ISP 기능을 이용하여 PC와 직접 연결한 후 이 플래쉬메모리에 프로그램을 써 넣어줄 수 있다.
데이터메모리는 SRAM이며 하위에서부터 32byte의 레지스터, 64byte의 I/O레지스터, 그리고 128byte의 사용자메모리로 구성되어 있다. 각각의 주소는 [그림 1]에 도시된 바 대로이다. (레지스터와 I/O레지스터는 아래에서 상세히 설명하도록 하겠다.) 사용자 메모리는 프로그램에 의해서 데이터가 임시로 저장되는 메모리 공간을 지칭한다. 레지스터만으로는 저장공간이 부족할 경우 사용이 되며 변수를 저장하거나 각종 연산에 필요한 데이터와 연산 결과 등을 저장하는 메모리 공간이다.
또한 SRAM과는 별도로 128byte의 EEPROM이 내장되어 있으며 10만 회 정도 읽고 쓸 수 있는 내구성을 가진다. SRAM과는 달리 EEPROM에 데이터를 읽고 쓸 때에는 별도의 레지스터(주소 레지스터, 데이터 레지스터, 제어 레지스터)를 거쳐야 하며 소요시간이 더 걸린다.
범용 레지스터와 I/O제어 레지스터
[그림 1]을 보면 SRAM의 최하위 32byte는 범용레지스터이다. 이것의 구성을 더 자세히 도시하면 다음 [그림 2]와 같다.
[그림 2] AVR의 범용 레지스터
레지스터는 ALU와 직접 연결된 특별한 메모리이고 ALU가 산술/논리 연산을 할 때 피연산자를 여기서 읽어오며 연산 결과도 다시 여기로 저장한다. 32개의 8bit로 구성되어 있고 어셈블러에서 주소값($00~$1F)으로 참조하지 않으며 R0, R1, …R31과 같이 이름을 붙여서 참조한다.
[그림 2]에서 상위 16bye와 하위 16byte를 굵은 선으로 구분해 놓았는데 이것은 어셈블러에서 하위 16byte(R16~R31)에만 직접 상수를 대입할 수 있고 상위 16byte에는 그럴 수 없다는 것을 구분하기 위한 선이다.
또한 R24~R31은 2개씩 묶어서 16bit단위로 연산을 하기 용이하도록 구성되었으며 특히 R27:R26, R29:R28, R31:R30 쌍은 각각 X, Y, Z레지스터로 명명하여 이들 레지스터를 이용하여 16bit 연산을 할 수 있을뿐만 아니라 주소(pointer)를 지정하거나 주소 연산을 하는데도 사용할 수 있다.
SRAM에서 범용레지스터 바로 상위에 64byte의 I/O제어레지스터가 있다. 이 레지스터를 이용하여 uC의 상태를 설정하거나 상태값을 읽고 또한 각종 주변기기(입출력포트, 인터럽트, 타이머/카운터, 직렬통신, 아날로그비교기 등)를 설정·제어 할 수 있다. 각각의 레지스터의 용도는 이후에 세세히 설명될 것이다.
어셈블리어에서 I/O제어레지스터의 번지를 참조할 때 절대번지(physical address)를 사용하는 경우가 있고 상대번지(relative address)를 사용하는 경우가 있다는 것이다. 절대번지는 $20~$5F 이고, 상대번지는 최하위 절대번지인 $20번지를 $0번지로 간주하여 $00~$3F값을 갖는다.
[그림 3] ATmega8(A)의 내부 SRAM 구성도
만약 어셈블리어로 개발할 부분이 있다면 메모리 구성의 세세한 부분까지 숙지할 필요가 있으나 C/C++로만 개발할 계획이라면 대략만 파악하고 있어도 된다.
댓글 없음:
댓글 쓰기