본문 바로가기
Coding/Arduino

아두이노 우노 메모리 구조

by 루민즈 2022. 6. 20.
반응형

안녕하세요 

아두이노 우노에 보면 MCU 부분에 

atmega328p라고 적혀있는걸 볼 수가 있습니다. 

 

Atmega328p

 

아두이노 우노의 있는 Atmega328p의 스펙은 어느 정도 인지 궁금해서 한번 알아보았습니다. 

https://pdf1.alldatasheet.com/datasheet-pdf/view/241077/ATMEL/ATMEGA328P.html

 

Atemga 프로세서는 atmel이라는 회사가 만들었습니다 .

하나 나중에 microhips라는 회사가 atmel이라는 회사를 인수하면서 본격적으로 microchips 회사 꺼가 되었습니다. 

위 사이트를 보면 atmega328 p의 성능을 확인할수있습니다. 

 

아두이노 우노 atmega328p 메모리

그중 가장 눈에 띄는 게 메모리 부분인데 

 

 

아두이노 우노의 쓰이는 atmega328p은

플래시 메모리 

SRAM

EPPROM

으로 구성되어 있습니다. 

 

플래시 메모리

 

플래시 메모리란 비휘발성 메모리로써 전원이 꺼져도 데이터가 남아있는 부분을 말합니다. 

따라서 아두이노를 사용할 경우 usb선을 제거해도 데이터가 지워지지 않아 다시 5v전압을 검고 둥근 소켓 부분에 연결하면 

다시 원래대로 작동할 수 있습니다. 

 

atmega328 p 경우 32k가 있는 걸 확인할 수가 있네요 

아두이노 우노의 경우 플래시 메모리에 자신이 작성한 스케치 프로그램이 들어가는 걸 확인할 수 있습니다. 

 

 

위의 보시면 스케치는 프로그램 저장 공간 1968 바이트를 사용 최대 32256바이트라고 나와있습니다. 

32256바이트는 32k 바이트입니다. 1968바이트는 제가 작성한 코드 용량입니다. 

 

 

 

 

SRAM (Static Random Access Memory)

Static이란 정적이란 뜻입니다. 즉 전원이 공급되고 있는 한 데이터가 가만히 내버려두면 변하지 않는 그런 뜻입니다.

SRAM이란 휘발성 메모리로써 전원이 공급되고 있으면 데이터가 저장되고 

전원이 공급되지 않으면 데이터가 사라지는 메모리입니다. 

SRAM은 static 변수와 전역 변수를 저장하는 데이터 영역과 , 동적으로 데이터를 할당해야 하는 힙 영역

나머지 스택 영역으로 나누어져 있습니다. 

 

위의 스크린숏을 보면 전역 변수는 동적 메모리 218바이트를  사용한다고 나와있습니다. 

여기서 동적 메모리란 SRAM의 힙 영역을 말하며 아래 코드처럼 전역 변수를 Serial.print의 출력했을 때 

사용되는 동적 메모리가 바뀌는 걸 확인할 수 있습니다. 

 

 

위 코드를 보면 char *str = "안녕하세요 반갑습니다."; 를 Serial.print에 넣어서 출력하고 있습니다. 

따라서 동적 메모리 218바이트를 쓰고 있는 걸 확인할 수 있습니다. 

 

 

위에는 char* str = "안녕하세요";라고 나와 있는 걸 확인할 수 있습니다. 

안녕하세요 반갑습니다. 에서 안녕하세요.라고 글자 수가 줄어듦으로써 동적 메모리가 줄어드는 걸 확인할 수 있습니다. 

 

이를 통해 Serial 통신이 동적 메모리를 쓰고 있다는 걸 확인할수있고 Serial에 들어가는 변수도 SRAM의 동적메모리를 쓰고 있다는걸 확인할 수 있습니다.

 

EEPROM(Electrically Erasable Programmable Read-Only Memory)

EEPROM 이란 직역하면 전기적으로 지울 수 있고 프로그래밍이 가능한 읽기 전용 메모리란 뜻인데 

플래시 메모리에 비해 굉장히 느린 비휘발성 메모리라고 합니다. 

 

EEPROM은 모뎀이나 그래픽카드 메인보드에 쓰입니다. 

아두이노에서도 EEPROM이 있는 걸 확인할 수 있습니다. 

컴퓨터 메인보드의 있는 바이오스 프로그램 같은걸 굳이 아두이노 우노의 들어갈 필요가 거의 없기 때문에 

용량은  1KB입니다. 물론 만들려고 하는 기기마다 다르겠지요 주요 변할리 없는 설정들을 여기다 대체로 넣어 줍니다. 

 

#include <EEPROM.h>

int a = 0;
int value;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  value = EEPROM.read(a);

  Serial.print(a);
  Serial.print("\t");
  Serial.print(value);
  Serial.println();

  a = a + 1;

  if (a == 512)
    a = 0;

  delay(500);
}

 

 

위의 코드를 보면 EEPROM.read(a)를 하고 있는데

이는 a데이터를 저장할 변수의 크기(바이트)를 반환합니다. 

 

 

 

 

결과 값

 

왼쪽 결괏값이 a이고 오른쪽 결과값이 value인데 a의 값의 반복문으로 계속 더해주고 있으니 

1씩 증가하는 걸 확인할 수 있습니다. 그리고 value가 오른쪽 값인데 255바이트를 쓰겠다는걸 확인할수있습니다.

 

 


Post

다음글 무직자 대출 알아보기 >