Jeśli umieścisz zmienne we FLASH'u, musisz się do nich odwoływać w specjalny sposób. Trzeba kopiować poszczególne komórki pamięci do bufora w RAM.
Ja to robię w bardzo podobny sposób jak wyżej. Tylko, że mój sposób jest szybszy i wygodniejszy.
Deklarujemy sobie tablicę we FLASH'u.
Kod:
const char tekst[] PROGMEM = "Jakis tekst";
Jak nie wszyscy wiedzą, każdy element takiej tablicy jest wskaźnikiem do przestrzeni, gdzie przechowywane są znaki.
To nie umieści tekstu w FLASH'u, a jedynie samą tablicę wskaźników.
Teraz należy umieścić sam tekst w FLASH'u.
Ja to robię tak:
Kod:
PGM_P const p_tekst[] PROGMEM = {tekst};
Jak chcę pobrać łańcuch znaków z FLASH'a do bufora w RAM'ie, na początku deklaruję bufor.
Zależy jak długie stringi przechowujesz, to możesz sobie ten bufor powiększyć, ale 8 bajtów to pewnie na większość rzeczy wystarczy.
I teraz trzeba przekopiować naszą tablicę z FLASH'a do bufora w RAM.
Kod:
strcpy_P(bufor,(PGM_P) pgm_read_word(&(p_tekst[0])));
I mamy normalnego Stringa z którym możemy zrobić co tam chcemy. Na przykład wyświetlić na LCD.
Jeśli masz więcej stringów, to muszisz każdy zadeklarować oddzielnie.
Kod:
const char tekst1[] PROGMEM = "Jakis tekst1";
const char tekst2[] PROGMEM = "Jakis tekst2";
const char tekst3[] PROGMEM = "Jakis tekst3";
const char tekst4[] PROGMEM = "Jakis tekst4";
const char tekst5[] PROGMEM = "Jakis tekst5";
A następnie skopiować do tablicy:
Kod:
PGM_P const p_tekst[] PROGMEM =
{
tekst1,
tekst2,
tekst3,
tekst4,
tekst5
};
Jak chcesz odczytać konkretny tekst do bufora, to w makrze
Kod:
strcpy_P(bufor,(PGM_P) pgm_read_word(&(p_tekst[0])));
piszesz numer tablicy, która Cię interesuje, p_tekst[2], p_tekst[5] itd.
"Bardziej ludzkiej " metody nie ma.
Nie ma też sensu odczytywanie wszystkich tablic na raz:
Kod:
char bufor[5][8];
for (unsigned char i = 0; i < 5; i++)
{
strcpy_P(bufor[i],(PGM_P) pgm_read_word(&(p_tekst[i])));
}
Bo właśnie wrzuciliśmy wszystkie stringi do RAM, co przecież chcieliśmy uniknąć. A jak program jest opasły, to o przepełnienie stosu łatwo.
Ameryki tym tekstem nie odkryłem.
Zapraszam do zapoznania się z manualem avr-libc na stronie
http://www.nongnu.org/avr-libc/user-manual/pages.html
A w szczególności z rozdziałem
Data in Program Space