PROGMEM을 사용하여 플래시 메모리에 쓸 수 있습니까?


11

Arduino의 문서에서 나는 인용합니다 :

http://playground.arduino.cc/Learning/Memory 참고 : 프로그램 레코딩시에만 플래시 (PROGMEM) 메모리를 설치할 수 있습니다. 프로그램 실행이 시작된 후에는 플래시의 값을> 변경할 수 없습니다.

그리고 PROGMEM 설명에 :

http://arduino.cc/en/Reference/PROGMEM SRAM 대신 플래시 (프로그램) 메모리에 데이터를 저장하십시오. Arduino 보드에서 사용 가능한 다양한 유형의 메모리에 대한 설명이 있습니다.

PROGMEM 키워드는 변수 한정자이므로 pgmspace.h에 정의 된 데이터 유형에만 사용해야합니다. 컴파일러는 보통 SRAM 대신 "이 정보를 플래시 메모리에 넣습니다"라고 지시합니다.

우리가 할 수 있습니까? 아니면 같은 것이 아닌가?


런타임에 프로그램 메모리에 쓰기 (플래시) 할 수는 있지만 (잠기지 않은 경우) 프로세스는 조금 더 복잡하며 기본적으로 할당 프로세스를 제어하는 ​​PROGMEM 지시문으로는 수행 할 수 없습니다. 어떻게 할 수 있는지 보려면 부트 로더 소스를보십시오.
Chris Stratton

페이지 쓰기 블록은 플래시 쓰기를 비실용적으로 만들지 않습니다. 실제로 그 무언가가 기대되었습니다.
Anothercg Gmail 2009 년

답변:


9

짧은 대답은 '아니오'입니다. PROGMEM 데이터는 읽기 전용입니다.

플래시 메모리 제한 사항
이해해야 할 첫 번째 사항 은 플래시 메모리 (프로그램 공간이있는 곳)가 장기 고정 스토리지 용으로 설계되었다는 것입니다. 그것으로부터 읽는 것은 매우 빠르고 정확합니다. 그러나 일반적으로 바이트 단위로 수정할 수는 없습니다 (예 : 특정 변수 변경). 일반적으로 큰 블록으로 지우고 다시 써야합니다. 따라서 지우기 및 쓰기주기를 수행하는 동안 다른 곳에 많은 중복 정보를 저장해야하므로 런타임 조작에 완전히 비실용적입니다.

PROGMEM의 실제 기능
코드에 지정된 모든 리터럴 데이터 (예 : 문자열 및 숫자)는 항상 프로그램 공간에 항상 있습니다 (예 : Flash). 그러나 스케치가 실제로 런타임에 해당 데이터를 사용하려면 일반적으로 SRAM에 해당 공간을 할당하고 복사해야합니다. 즉, Flash의 고정 원본과 SRAM의 임시 복사본이라는 두 가지 사본이 생깁니다.

PROGMEM 수정자를 사용할 때 SRAM에서 두 번째 사본을 만들지 말라고 지시합니다. 대신 스케치는 Flash의 원본에 간단히 액세스합니다. 할당 및 복사 작업을 피하기 때문에 데이터 를 읽어야 하는 경우 매우 유용합니다 .

그러나 데이터를 수정하려면 SRAM에 복사해야합니다. 위에서 언급 한 플래시 제한 외에도 코드 안전 문제이기도합니다.

프로그램 공간에 저장된 데이터 를 수정할 수 있으면 논리적으로 프로그램 공간에 저장된 코드를 수정할 수 있습니다 . 이는 간단한 실수 (또는 이론적으로 악의적 인 공격)로 인해 스케치가 런타임에 부분적으로 또는 완전히 다시 작성 될 수 있음을 의미합니다. 이는 단순히 중단하는 것부터 작동하는 것, 연결된 장비의 손상 / 파괴에 이르기까지 매우 예측할 수없는 결과를 가져올 수 있습니다.

추가 정보
여기에서 저수준 PROGMEM에 대한 자세한 내용을 확인할 수 있습니다.

동일한 PROGMEM 학습서의 이전 버전은 여기에서 사용 가능합니다.


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