아두이노 메모리에 대하여
아두이노의 메모리 종류
아두이노에는 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 을 사용해야 합니다.
문자열의 경우는 F() 구문을 사용할 수도 있습니다. 아래와 같이 사용하면 되므로 간편합니다. (아두이노 IDE 1.0 이상에서만 지원)
Serial.println( F(“This string will be stored in flash memory“) );
아두이노 메모리에 대한 보다 상세한 분석 글을 작성하였습니다. 아래 링크를 참고하세요.