現在、一部のライブラリを変更して、プロジェクトでSRAMが不足しないように、文字列の格納にRAMではなくフラッシュを使用するようにしています。
ライブラリの一部の文字列は、次のように宣言されています。
const char *testStringA = "ABC";
これは、私がこれを通常行う方法とは異なります。
const char testStringB[] = "DEF";
ただし、これら2つは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);
}