091
[C/C++] ESP32에서 EEPROM 저장하기 본문
01. EEPROM(Electrically Erasable Prohrammable Read-Only Memory)
- EEPROM : 저장을 꺼도 데이터가 유지되는 비휘발성 메모리먀, 비밀번호, 설정값, 마지막 상태 저장 등에 사용됨
-> 전기적으로 데이터를 읽고, 지우고, 다시 쓸 수 있으며, Flash와 유사함, 사용자가 정하는 만큼의 용량을 사용함
Q. EEPROM과 Flash는 무슨 차이가 있나요?
A. EEPROM과 Flash는 둘 다 비활성 메모리지만, 구조와 쓰임새의 차이가 있습니다. Flash는 플래시 기반으로 블록 단위로 지우고 쓰며 속도가 상대적으로 빠르지만, EEPROM은 바이트 단위로 읽고 쓰기가 가능하며 느립니다. 그러므로 Flash는 펌웨어나 파일 시스템(SPIFFS, LittleFS)에서 주로 사용되고 EEPROM의 설정값, 비밀번호 등의 소량의 데이터를 저장할 때 사용됩니다.
=> 실제로 ESP32에는 EEPROM.h 라이브러리로 내부 FLASH의 일부를 바이트 단위로 쓰는 방식입니다. EEPROM 칩이 없어도 내부 Flash 메모리를 에뮬레이션해서 사용합니다.
* 펌웨어(Frimware) : 하드웨어를 움직이게 해주는 소프트웨어(프로그램)로, 마우스 움직임을 전달하거나, 프린터의 인쇄 명령, ESP32의 setup()/loop() 코드 같은 경우도 결국 펌웨어의 예시
* 에뮬레이션(Emulation) : 의미 그대로 있는 척하는 것을 의미하며, 하드웨어나 기능이 실제로는 없는데 소프트웨어적으로 흉내내서 마치 있는 것처럼 동작하게 만드는 것을 의미
02. EEPROM 저장 & 꺼내는 코드
* 내부 Flash 메모리를 에뮬레이션 해서 사용하기 때문에 PC <- USB -> ESP32 처럼 연결해주면 됨 *
- 저장 :
#include <EEPROM.h>
#define EEPROM_SIZE 64
#define START_ADDR 0
#define DATA_LENGTH 10
void setup(){
Serial.begin(115200);
EEPROM.begin(EEPROM_SIZE);
String inputStr = "ESP32test9";
for(int i = 0; i < DATA_LENGTH; i++){
EEPROM.write(START_ADDR + i, inputStr[i]); // 문자 하나씩 저장
}
EEPROM.commit(); // 실제로 Flash에 쓰기
Serial.println("Data written to EEPROM.");
}
void loop() {}
- EEPROM.begin(사용자 지정 메모리 크기); : 메모리 공간 확보 및 시작( Flash 메모리의 일부를 EEPROM처럼 에뮬레이션 해줌)
- EEPROM.wirte(주소, 값); : 주소에 값을 임시적으로 저장함(버퍼에 저장됨)
- EEPROM.commit(); : Flash 메모리에 실제로 쓰는 작업으로, write()만 이용하며 버퍼에만 저장하게 돼서 재부팅 시 저장 안됨, 버퍼에 모아놓은 데이터를 한꺼번에 Flash 메모리로 저장
Q1. 저장 과정을 왜 write() -> commit() 두 단계로 나눠놓은건가요?
A1. EEPROM이나 Flash를 사용하는 데에는 시간이 오래걸리기 때문에 데이터를 한꺼번에 모아서 쓰는게 더 효율적입니다. 자바언어에서 BufferedWriter에서 write()를 통해 출력 데이터를 버퍼에 저장해두고 flush()를 통해 한꺼번에 모아서 출력하는 것과 개념상 같은 역할입니다.
Q2. 버퍼, EEPROM, Flash 메모리같은 메모리 저장공간에는 뭐가 있나요?
A1. 아래의 표를 참조하면 됩니다.
저장 공간 | 용도 |
레지스터(Register) | CPU와 가장 가까운 메모리 영역, 데이터를 빠르게 읽고 쓸 수 있는 공간 |
캐시 메모리(Cache Memory) | CPU와 메인 메모리(RAM) 사이에서 빠른 데이터 접근을 제공 |
RAM(Random Access Memory) | 프로그램 실행 중에 데이터를 임시로 저장하는 메모리 |
버퍼 메모리(Buffer Memory) | 입출력 장치와 프로세서 간 데이터 전송을 효율적으로 처리하기 위한 임시 저장 공간 |
EEPROM | 비휘발성 메모리로, 전원이 꺼져도 데이터를 유지하며 작은 데이터를 저장하는 용도로 사용 |
Flash 메모리 | 비휘발성 메모리로, 대용량 데이터를 저장하는데 사용(EEPROM보다 큰 용량을 제공) |
SD 카드 | 외부 저장 장치로서, 대용량 데이터를 저장하는데 사용 |
ROM(Read-Only Memory) | 읽기 전용 메모리로, 장치의 펌웨어나 초기화 데이터를 저장 |
DMA(Direct Memory Access) | CPU의 개입 없이 메모리와 I/O 장치 간 데이터 전송을 수행하는 기술 |
-> 버퍼는 RAM이나 디스크의 일부를 나눠 사용하므로 RAM과 비슷한 특징을 가짐(휘발성, 위치)
- 꺼내기 :
#include <EEPROM.h> //EERPOM 라이브러리
#define EEPROM_SIZE 64
#define START_ADDR 0
#define DATA_LENGTH 10
void setup(){
Serial.begin(115200);
EEPROM.begin(EEPROM_SIZE);
String outputStr = "";
for(int i = 0; i < DATA_LENGTH; i++){
char c = EEPROM.read(START_ADDR + i);
outputStr += c;
}
Serial.print("Read from EEPROM: ");
Serial.println(outputStr);
}
void loop() {}
- EEPROM.read(주소) : 저장된 데이터 읽기
'Programming Language > C&C++' 카테고리의 다른 글
[C/C++] ESP32에서 RTOS 사용하여 3가지 작업 유연하게 처리하기 (0) | 2025.04.13 |
---|---|
[C/C++] ESP32에서 3가지 작업(LCD,Switch,UART) 반복처리하기 (0) | 2025.04.09 |
[C/C++] LCD에 원하는 글자를 출력하기 (4) | 2025.03.24 |
[C/C++] ESP32와 Potentiometer를 이용하여 모드 설정 후 변경하기 (4) | 2025.03.15 |
[C/C++] ESP32와 Potentiometer를 이용하여 LED의 밝기 조절하기 (2) | 2025.03.07 |