Tôi hiện đang thay đổi một số thư viện để sử dụng flash thay vì RAM để lưu trữ chuỗi để tôi không hết SRAM trong một dự án.
Một số chuỗi trong thư viện được khai báo theo cách này:
const char *testStringA = "ABC";
Điều này khác với cách tôi thường thấy điều này được thực hiện:
const char testStringB[] = "DEF";
Tuy nhiên, tôi nghĩ rằng hai cái này là tương đương khi khai báo const và khởi tạo trong khai báo. Cả hai đều hoạt động tốt trong mã.
Tôi đã cố gắng chuyển những thứ này sang flash:
const prog_char *testStringC PROGMEM = "GHI";
Sau đó tôi thấy rằng điều này đã không làm việc. Nó đã được sản xuất gobbledegook khi in.
Tuy nhiên, theo mô hình thông thường hơn của:
const prog_char testStringD[] PROGMEM = "JKL";
hoạt động tốt
Tôi có thể thấy trong phần tháo gỡ:
00000068 <testStringC>:
68: 04 01 ..
0000006a <_ZL11testStringD>:
6a: 4a 4b 4c 00 JKL.
Vì vậy, rõ ràng con trỏ và kết quả PROGMEM trong chuỗi / mảng không được khởi tạo.
Tại sao lại thế này?
Mã ví dụ:
#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);
}