我目前正在更改某些库,以使用闪存而不是RAM进行字符串存储,这样我就不会在项目上用完SRAM。
库中的某些字符串以这种方式声明:
const char *testStringA = "ABC";
这与我通常看到的情况不同:
const char testStringB[] = "DEF";
但是,我认为这两个在声明为const并在声明中进行初始化时是等效的。两者都在代码中正常工作。
我试图将它们移动到闪存:
const prog_char *testStringC PROGMEM = "GHI";
然后我发现这行不通。打印时正在产生gobbledegook。
但是,遵循以下更常见的模式:
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);
}