본문 바로가기
임베디드소프트웨어

8-Bit AVR 코어 살펴 보기 (레지스터, ALU, 메모리, 인터럽트)

by Go! Jake 2022. 3. 20.

AVR Central Processing Unit (CPU)의 주요 역할은 정상적인 프로그램 수행입니다. 그러므로 CPU는 반드시 메모리에 접근할 수 있어야하고, 계산을 수행하고, 주변장치를 제어하고 인터럽트를 관리할 수 있어야 합니다. AVR Core 구성이 어떻게 되어있는 지 살펴보도록 하겠습니다. 

AVR Core 살펴 보기

AVR은 하버드 구조*로 되어 있어, 프로그램과 데이터의 버스와 메모리가 각각 분리되어 있습니다. 프로그램 메모리 명령은 single-level 파이프라이닝**으로 수행됩니다. 이 파이프라이닝을 통해 매 clock cycle마다 명령들을 수행할 수 있습니다. 프로그램 메모리는 In-System Reprogrammable Flash memory***입니다.

 

*하버드 구조: 프로그램과 데이터가 나누어진 구조. (프로그램의 버스와 메모리, 데이터의 버스와 메모리로 나뉜다.)

**파이프라이닝: 한 명령어의 수행이 끝나기 전에 다른 명령의 수행을 시작하는 연산 방법.

***In-System Reprogrammable Flash memory: EEPROM 등 프로그래밍 할 수 있는 비휘발성 메모리를 의미함.

 

레지스터(Registers)

빠른 접근이 가능한 레지스터 파일은 32 x 8-bit 범용 레지스터입니다. 이는 매 clock cycle마다 접근이 가능합니다. 32 레지스터들 중 6개는 8-bit이지만 2개씩 묶어 총 3개의 16-bit로 별도로 쓸 수 있습니다. 3개의 16-bit 레지스터는 데이터 공간 주소를 위한 간접 주소 레지스터 포인터, 효율적인 주소 계산을 가능하게 합니다.

 

ALU (Arithmetic Logic Unit)

ALU는 레지스터 또는 레지스터와 상수 사이의 수학 연산과 로직 연산을 지원합니다. 사이클 접근 시간(Single clock cyle access time)을 통해 단일 사이클 ALU 연산이 가능합니다.

- 전형적인 ALU 연산은 레지스터 파일에서 온 피연산자 2개가 출력됩니다.

- 연산된 후 레지스터 파일에 1 clock cycle에 다시 저장됩니다.

- 수학 연산 이후, 상태 레지스터는 연산의 결과를 반영하고 레지스터를 업데이트합니다.

프로그램은 조건식 또는 비조건식 점프* 또는 콜** 명령에 따라 진행된다. 대부분 AVR 명령은 16-bit word 형태를 가집니다. 모든 프로그램 메모리 주소는 16-bit 또는 32-bit 명령을 가집니다.

 

*점프 명령: 프로그램 내 다른 제어 경로를 포인트하거나 프로그램 카운터 값을 업데이트하는 명령

**콜 명령: 서브루틴을 호출하는 명령.

 

메모리 (Memory)

메모리에는 크게 프로그램 메모리, 데이터 메모리로 나누어져 있습니다.

프로그램 메모리는 크게 2가지 분류로 나누어져 있고, 부트 프로그램 섹션과 어플리케이션 프로그램 섹션으로 나누어져 있습니다. 두 섹션 모두 특별한 Lock bits가 있어 쓰기와 읽기/쓰기 보호가 됩니다. 메모리 내부에 특별히 저장 프로그램 메모리(The Store Program Memory; SPM)가 있습니다. SPM은 어플리케이션 플래쉬 메모리 섹션에 '쓰기'를 하는 명령으로, 반드시 부트 프로그램 섹션 내에 존재해야 합니다.

 

인터럽트와 서브루틴 명령 중에, 리턴 주소 프로그램 카운터(Program Counter; PC)*는 스택 레지스터에 저장됩니다. 스택 레지스터는 효과적으로 범용 데이터 SRAM에 할당됩니다. 결과적으로 스택의 사이즈는 전체 SRAM 사이즈로 제한됩니다.

*프로그램 카운터: 프로그램 카운터는 다음 명령을 실행할 주소를 의미하며, '명령어의 주소'로 보면 됩니다. 위 글에서는 리턴 주소 프로그램 카운터이므로, 실행 중이었던 주소를 '돌아올 주소'에 미리 저장 해 두는 것입니다. 인터럽트나 서브루틴 이후 돌아오게 됩니다.

 

모든 사용자 프로그램은 리셋 과정에서 스택 포인터 (Stack Pointer; SP)를 초기화 해야합니다. 스택 포인터는 I/O 공간에 읽기쓰기가 가능합니다. 데이터 SRAM은 AVR 아키텍쳐 내 5가지 어드레스 모드를 통해 쉽게 접근 가능합니다.

 

I/O 메모리 공간은 제어 레지스터, SPI, 다른 I/O 기능을 위한 64개의 주소를 가지고 있습니다. I/O 메모리는 직접적으로 접근할 수 있고, 데이터 공간 위치는 레지스터 파일의 0x20 - 0x5F 주소를 따릅니다. 추가로, 확장 I/O 공간은 SRAM 내 0x60 - 0xFF까지 가지고 있습니다.

 

인터럽트

플렉서블 인터럽트 모듈은 I/O 공간에 제어 레지스터를 가지고 있습니다. 또한 이 제어 레지스터는 상태 레지스터에 추가적인 글로벌 인터럽트 Enable bit를 가지고 있습니다.

댓글