PROGMEM 사용의 의미는 무엇입니까?


12

많은 양의 텍스트 변수로 PROGMEM을 사용하여 플래시 메모리에 변수를 저장해야 한다는 것을 알았습니다 . Arduino에서 플래시 (PROGMEM 사용) 대 SRAM 대 EEPROM에 큰 변수를 저장하면 긍정적이고 부정적인 결과는 무엇입니까?

답변:


10

다음은 현재 많은 Arduino 보드 (Due, Leonardo, 구형 Arduino 및 기타 호환 보드 제외)의 마이크로 컨트롤러 인 AtMega328의 FLASH, EEPROM 및 SRAM에 대한 간단한 비교입니다.

  • 플래시 : 10,000 쓰기 / 삭제주기. 액세스는 빠르지 만 SRAM보다 느립니다. 를 통한 코드 액세스 PROGMEM.
  • EEPROM : 100,000 쓰기 / 삭제주기. 밀리 초 단위로 액세스 할 수 있습니다. 비교적 복잡한 액세스 절차.
  • SRAM : 무제한 쓰기 / 삭제주기. 액세스는 2 클럭 사이클로 매우 빠릅니다. 코드로 직접 액세스

따라서 PROGMEM 사용의 주요 가상 부정적인 결과는 10,000 쓰기주기 제한입니다. EEPROM 사용의 주요 부정적인 결과는 데이터를 읽고 / 쓰고 / 복사 하는 코드복잡성입니다 . SRAM 은 용량이 매우 제한적입니다 .


EEPROM 액세스에 대한 정보를 어디서 얻습니까? 약간의에서 찾고 에 대한 EEPROM 같이, 그것은 보이는 읽고 ~ 5 클럭 사이클과 같은 걸릴 것을. 글쓰기 는 느리지 만 읽을 수는 없습니다.
코너 울프

OP는 많은 것을 저장 하려고합니다 .
Anindo Ghosh

예, 그러나 한 번만 쓰거나, 많이 읽거나 그 반대입니까? "텍스트 변수"는 컴파일 타임에 지정되어 장치에 구워진 후 그 이후에는 절대 변경되지 않습니다 (예 : 메뉴 텍스트 또는 sommat).
코너 울프

질문 의 상점 을 "컴파일 / 업로드시 저장"으로 읽었습니다 . 변수를 런타임에 읽기 / 쓰기로 사용하려는 경우 FLASH에 저장해서는 안됩니다. 전체 페이지를 먼저 지우지 않고 FLASH를 수정할 수 없다는 추가 제한이 없습니까?
microtherion 12

... 문자열 상수가 아닌 텍스트 변수 .
Anindo Ghosh

2

주요 의미는 PROGMEM에 저장된 정보를 수정할 수 없다는 것입니다. 문자열을 한 번에 1 바이트 씩 복사해야하기 때문에 (매우 작은) 성능 저하가 발생합니다.

프로그램을 변경하기 위해서는 FLASH를 다시 ​​프로그래밍해야하기 때문에 FLASH의 마모는 (1 차) 문제가 아닙니다.

IDE 1.x 소개에는 F () 매크로가 포함되었습니다. 이렇게하면 PROGMEM에서 문자열을보다 쉽게 ​​유지할 수 있습니다.

예를 들어 다음을 사용하는 대신 : Serial.print ( "Hello World!");

이제 다음을 사용할 수 있습니다.

Serial.print (F ( "Hello World!");

F ()는 함수가 아니며 매크로이므로 사용이 다소 제한적입니다.


1

PROGMEM은 변경 불가능한 데이터에 가장 적합합니다. 급변하는 변수를 계속 유지하려면 SRAM에 저장하면됩니다. 반면에 너무 자주 가져 오지 않는 불변의 텍스트 변수 (예 : 표시 할 항목)를 원한다면 PROGMEM을 사용하는 것이 좋습니다.

EEPROM에 관하여-영구적 인 것을 위해 이것을 저장하십시오. IIRC SRAM / PROGMEM을 통해 EEPROM에서 데이터를 가져 오는 속도가 느립니다. 일반적으로 나는 (그리고 다른 사람들은) 사용하기 전에 EEPROM에서 SRAM으로 데이터를 복사합니다 ( 공식 예제 에서도 마찬가지입니다 ).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.