아두이노 메모리에 대하여

아두이노의 메모리 종류

아두이노에는 3가지 종류의 메모리가 있습니다.

  • Flash memory (Program space) : 아두이노 스케치, 부트로더가 저장되는 메모리. 읽고 쓰기가 가능하며 비휘발성 메모리로 전원이 차단되어도 삭제되지 않습니다. 다만 아두이노 스케치에서 여기에 쓰는 작업을 할 수는 없습니다. 오직 아두이노 IDE에서 작성한 스케치를 업로드 할 때만(burn time) 쓰기 작업을 할 수 있습니다.
  • SRAM (Static Random Access Memory) : 우리가 PC에서 흔히 얘기하는 RAM, 메모리에 해당합니다. 휘발성 메모리로 전원이 차단되면 내용이 삭제됩니다. 아두이노 스케치를 실행할 때 필요한 각종 변수, 버퍼 등이 여기에 생성됩니다. (일반적인 문자열도 여기에 생성됨)
  • EEPROM : 하드디스크처럼 긴 시간 자료를 저장해두고 싶을 때 사용할 수 있는 메모리입니다. 비휘발성 메모리로 전원이 차단되어도 삭제되지 않습니다.

메모리의 크기

아두이노 종류별로 각 메모리의 사이즈가 다릅니다. 아두이노 프로세서 칩의 종류에 따라 아래와 같은 사이즈를 가집니다.

ATMega168 ATMega328P ATmega1280 ATmega2560
Flash
(1 Kbyte used
for bootloader)
16 KBytes 32 KBytes 128 KBytes 256 KBytes
SRAM 1024 bytes 2048 bytes 8 KBytes 8 KBytes
EEPROM 512 bytes 1024 bytes 4 KBytes 4 KBytes

변수와 메모리 사용, 주의사항

위 표에서 보시다시피 Flash 메모리가 RAM 보다 상대적으로 여유가 있습니다. 따라서 프로젝트가 복잡해지고 무거워질 경우 RAM 부족 문제를 겪을 확률이 높고, 이 경우는 Flash 메모리로 대체해서 사용해야 합니다. 그러기 위해 필요한 방법들을 살펴보겠습니다.

일반적으로 아두이노에서 문자열을 생성할 때 아래와 같이 합니다.

char message[] = “I support the Cape Wind project.”;

위와 같이 사용하면 아두이노가 실행되고 문자열 변수를 생성할 때, 프로그램 메모리(Flash memory)에서 SRAM 으로 33바이트를 복사합니다. (1글자=1바이트, 총 32 글자 + 마지막 문자열 종료를 알리는 null 바이트) 이 정도 메모리 사용은 별 문제가 되지 않습니다. 하지만 이런 문자열의 수가 많거나, 긴 텍스트를 사용하는 경우라면 메모리의 상당 부분을 차지하게 될겁니다. (이더넷 모듈, 디스플레이 모듈을 사용하는 경우 이런 문제가 발생하기 쉽습니다.)

명심하셔야 할 점은 본인이 작성한 코드 뿐 아니라 프로젝트에 사용된 라이브러리, 아두이노 기본 코드에 포함된 변수와 라이브러도 SRAM을 공유한다는 점입니다. 특히 통신용 라이브러리나 그래픽 라이브러리는 상당량의 버퍼를 내부에 생성하므로 2KB SRAM 메모리가 부족할 수 있습니다.

따라서 메모리 부족 문제가 염려되는 상황에서는 SRAM 대신 Flash 메모리를 직접 사용하도록 해야합니다. (이게 유일한 방법입니다) 이렇게 해주는 키워드가 PROGMEM 입니다. PROGMEM 키워드는 pgmspace.h 에 정의된 데이터 타입에 사용할 수 있습니다. 하지만 반드시 스케치가 실행되는 동안 변경되지 않는, 고정된 변수에만 사용할 수 있습니다. 스케치 실행 중 변경되는 변수는 SRAM 을 사용해야 합니다.

PROGMEM 키워드 사용법 바로가기

문자열의 경우는 F() 구문을 사용할 수도 있습니다. 아래와 같이 사용하면 되므로 간편합니다. (아두이노 IDE 1.0 이상에서만 지원)

Serial.println(  F(“This string will be stored in flash memory“)  );

 

아두이노 메모리에 대한 보다 상세한 분석 글을 작성하였습니다. 아래 링크를 참고하세요.

https://www.hardcopyworld.com/?p=1963

You may also like...