많은 양의 텍스트 변수로 PROGMEM을 사용하여 플래시 메모리에 변수를 저장해야 한다는 것을 알았습니다 . Arduino에서 플래시 (PROGMEM 사용) 대 SRAM 대 EEPROM에 큰 변수를 저장하면 긍정적이고 부정적인 결과는 무엇입니까?
많은 양의 텍스트 변수로 PROGMEM을 사용하여 플래시 메모리에 변수를 저장해야 한다는 것을 알았습니다 . Arduino에서 플래시 (PROGMEM 사용) 대 SRAM 대 EEPROM에 큰 변수를 저장하면 긍정적이고 부정적인 결과는 무엇입니까?
답변:
다음은 현재 많은 Arduino 보드 (Due, Leonardo, 구형 Arduino 및 기타 호환 보드 제외)의 마이크로 컨트롤러 인 AtMega328의 FLASH, EEPROM 및 SRAM에 대한 간단한 비교입니다.
PROGMEM
.따라서 PROGMEM 사용의 주요 가상 부정적인 결과는 10,000 쓰기주기 제한입니다. EEPROM 사용의 주요 부정적인 결과는 데이터를 읽고 / 쓰고 / 복사 하는 코드 의 복잡성입니다 . SRAM 은 용량이 매우 제한적입니다 .
주요 의미는 PROGMEM에 저장된 정보를 수정할 수 없다는 것입니다. 문자열을 한 번에 1 바이트 씩 복사해야하기 때문에 (매우 작은) 성능 저하가 발생합니다.
프로그램을 변경하기 위해서는 FLASH를 다시 프로그래밍해야하기 때문에 FLASH의 마모는 (1 차) 문제가 아닙니다.
IDE 1.x 소개에는 F () 매크로가 포함되었습니다. 이렇게하면 PROGMEM에서 문자열을보다 쉽게 유지할 수 있습니다.
예를 들어 다음을 사용하는 대신 : Serial.print ( "Hello World!");
이제 다음을 사용할 수 있습니다.
Serial.print (F ( "Hello World!");
F ()는 함수가 아니며 매크로이므로 사용이 다소 제한적입니다.
PROGMEM은 변경 불가능한 데이터에 가장 적합합니다. 급변하는 변수를 계속 유지하려면 SRAM에 저장하면됩니다. 반면에 너무 자주 가져 오지 않는 불변의 텍스트 변수 (예 : 표시 할 항목)를 원한다면 PROGMEM을 사용하는 것이 좋습니다.
EEPROM에 관하여-영구적 인 것을 위해 이것을 저장하십시오. IIRC SRAM / PROGMEM을 통해 EEPROM에서 데이터를 가져 오는 속도가 느립니다. 일반적으로 나는 (그리고 다른 사람들은) 사용하기 전에 EEPROM에서 SRAM으로 데이터를 복사합니다 ( 공식 예제 에서도 마찬가지입니다 ).