• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
STRINGI z FLASH'a
#5
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.

Kod:
char bufor[8];
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
 
Odpowiedź
  


Wiadomości w tym wątku
STRINGI z FLASH'a - przez ANT - 01-11-2016, 23:22
RE: STRINGI z FLASH'a - przez namok - 02-11-2016, 09:06
RE: STRINGI z FLASH'a - przez ANT - 08-11-2016, 21:40
RE: STRINGI z FLASH'a - przez przemo.bundy - 16-03-2019, 20:25
RE: STRINGI z FLASH'a - przez Robson Kerman - 16-03-2019, 23:42
RE: STRINGI z FLASH'a - przez przemo.bundy - 17-03-2019, 20:41

Skocz do:


Przeglądający: 1 gości