मैं वर्तमान में स्ट्रिंग स्टोरेज के लिए RAM के बजाय फ्लैश का उपयोग करने के लिए कुछ लाइब्रेरी बदल रहा हूं ताकि मैं किसी प्रोजेक्ट पर SRAM से बाहर न चला जाऊं।
पुस्तकालय में कुछ तार इस तरह से घोषित किए गए हैं:
const char *testStringA = "ABC";
यह अलग है कि मैं इसे सामान्य रूप से कैसे देखता हूं:
const char testStringB[] = "DEF";
हालांकि, मुझे लगता है कि घोषित होने पर इन दोनों को समतुल्य घोषित किया गया है। दोनों कोड में ठीक काम करते हैं।
मैंने इन्हें फ्लैश करने का प्रयास किया:
const prog_char *testStringC PROGMEM = "GHI";
मैंने तब पाया कि यह काम नहीं किया। यह मुद्रित होने पर gobbledegook का उत्पादन कर रहा था।
हालाँकि, निम्न सामान्य पैटर्न के बाद:
const prog_char testStringD[] PROGMEM = "JKL";
ठीक काम करता है।
मैं disassembly में देख सकता हूं:
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);
}