현재 프로젝트에서 SRAM이 부족하지 않도록 문자열 저장소에 RAM 대신 플래시를 사용하도록 일부 라이브러리를 변경하고 있습니다.
라이브러리의 일부 문자열은 다음과 같이 선언됩니다.
const char *testStringA = "ABC";
이것은 내가 정상적으로 수행하는 방식과 다릅니다.
const char testStringB[] = "DEF";
그러나 const 선언하고 선언에서 초기화 할 때이 두 가지는 동일하다고 생각합니다. 둘 다 코드에서 잘 작동합니다.
나는 이것을 플래시로 옮기려고 시도했다.
const prog_char *testStringC PROGMEM = "GHI";
나는 이것이 작동하지 않는 것을 발견했다. 인쇄 할 때 고 블럭을 생산하고있었습니다.
그러나 다음과 같은 일반적인 패턴을 따르십시오.
const prog_char testStringD[] PROGMEM = "JKL";
잘 작동합니다.
분해에서 볼 수 있습니다.
00000068 <testStringC>:
68: 04 01 ..
0000006a <_ZL11testStringD>:
6a: 4a 4b 4c 00 JKL.
따라서 포인터가 명확하고 PROGMEM으로 인해 문자열 / 배열이 초기화되지 않습니다.
왜 이런거야?
예제 코드 :
#include <avr/pgmspace.h>
const int BUFFER_LEN = 20;
const char *testStringA = "ABC";
const char testStringB[] = "DEF";
const prog_char *testStringC PROGMEM = "GHI";
const prog_char testStringD[] PROGMEM = "JKL";
void setup()
{
Serial.begin(9600);
}
void loop()
{
char buffer[BUFFER_LEN];
Serial.println(testStringA);
Serial.println(testStringB);
strncpy_P(buffer, testStringC, BUFFER_LEN);
Serial.println(buffer);
strncpy_P(buffer, testStringD, BUFFER_LEN);
Serial.println(buffer);
delay(1000);
}