Chciałbym się jeszcze tylko podzielić wiedzą w temacie definiowania stringów we flash'u AVR'a.
Otóż zakładając że chcemy umieścić tam jednego tylko string'a to robimy to tak :
Kopiuj
#include <avr/pgmspace.h>
const char str[] PROGMEM = "Ala ma kota.";
ale nie tak :
Kopiuj
#include <avr/pgmspace.h>
const char *str PROGMEM = "Ala ma kota.";
...i mamy wówczas w Ram'ie jedynie wskaźnik do tej tablicy "char'ów" czyli do naszego stringa.
Gdybyśmy zrobili tak jak piszę aby nie robić to we flash'u byłby wskaźnik do tego stringa a sam string i tak byłby kopiowany do Ram'u.
Dodatkowo, jeśli jednak chcemy zdefiniować we flash'u kilka stringów a ich wskaźniki umieścić w tablicy wskaźników do pamięci flash która to tablica będzie przechowywana w Ram'ie to wówczas robimy to tak :
Kopiuj
#include <avr/pgmspace.h>
const char str1[] PROGMEM = "Ala ma kota.";
const char str2[] PROGMEM = "Kot ma Alę.";
PGM_P str_tab[] PROGMEM = { str1, str2 };
...i wówczas mamy we flashu tablicę wskaźników do stringów umieszczonych również w pamięci flash.
Jednak jedna rzecz mi nie daje spokoju.
Mianowicie mając we flashu oprócz stringów również i tablicę wskaźników do nich w jaki sposób mogę dobrać się do wybranego stringa. W AVR z uwagi na harvardzką architekturę mamy tak, że musimy czytać z flash'a poprzez specjalną funkcję pgm_read_byte, gdzie jej argumentem będzie adres. Czy zatem w takim wypadku muszę to zrobić tak:
Kopiuj
char pierwszy_znak_drugiego_stringa = pgm_read_byte(pgm_read_byte(str_tab[1]));
? Jeśli nie tak, to jak ?
I czy warto w ogóle trzymać wskaźniki do tych stringów również we flashu czy też może lepiej zrobić tak :
Kopiuj
const char str1[] PROGMEM = "Ala ma kota.";
const char str2[] PROGMEM = "Kot ma Alę.";
PGM_P str_tab[] = { str1, str2 };
co spowoduje że cała ta tablica wskazań do stringów (które nota bene są trzymane we flashu) będzie trzymana w Ram'ie... ?
Proszę o odpowiedzi stricte na moje pytania. Pytania potrzebne mi są do programowania AVR-ów.