আমি বর্তমানে স্ট্রিং স্টোরেজের জন্য র্যামের পরিবর্তে ফ্ল্যাশ ব্যবহার করার জন্য কয়েকটি লাইব্রেরি পরিবর্তন করছি যাতে আমার কোনও প্রকল্পের আরআরএমে চলে না যায়।
লাইব্রেরির কয়েকটি স্ট্রিং এইভাবে ঘোষণা করা হয়েছে:
const char *testStringA = "ABC";
আমি সাধারণত এটি করা দেখি তার থেকে আলাদা This
const char testStringB[] = "DEF";
যাইহোক, আমি মনে করি যে ঘোষণায় কনস্ট এবং ইনিশিয়েশনের সময় এই দুটি সমতুল্য। উভয় কোডে সূক্ষ্ম কাজ।
আমি এগুলি ফ্ল্যাশ-এ স্থানান্তরিত করার চেষ্টা করেছি:
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);
}