[AVR] Zmienna w pamięci FLASH

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

[AVR] Zmienna w pamięci FLASH

Post autor: slawek55 » 21 lut 2013, 8:52

Cześć.
Mam małą zagwozdkę z pojęciu co to takiego fizycznie jest zmienna w pamięci FLASH dla AVRów.
O ile sprawą oczywistą jest co to takiego zmienna w pamięci RAM to już zupełnie pogubiłem się w pojęciu zmienne w pamięci FLASH?

Jak to ma niby wyglądać fizycznie i po co jest coś takiego?

janusz17
-
Posty: 7
Rejestracja: 20 gru 2005, 7:15
Lokalizacja: Kraków

Post autor: janusz17 » 21 lut 2013, 12:32

Według mnie to w pamięci programu może być umieszczona tylko stała. I deklaruje się ją ze specyfikatorem const.
Np: const char nazwa_stalej PROGMEM = 13;
Natomiast zmienna mogła by być zadeklarowana w pamięci EEPROM no i oczywiście w RAM.

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 21 lut 2013, 12:51

Niby tak, ale możemy zadeklarować nap coś takiego:

char *wsk PROGMEM="tekst";

To jest co prawda stała w takim sensie że nie możemy jej zmienić poprzez przypisanie w czasie pracy programu, ale z punktu widzenia składni języka jest to zmienna przechowująca adres łańcucha. Inny przykład to struktury z zapisanymi stałymi np poziomami MENU.

vito1
-
Posty: 15
Rejestracja: 05 maja 2007, 17:03

Post autor: vito1 » 21 lut 2013, 13:22

slawek55 pisze:Niby tak, ale możemy zadeklarować nap coś takiego:

char *wsk PROGMEM="tekst";

To jest co prawda stała w takim sensie że nie możemy jej zmienić poprzez przypisanie w czasie pracy programu, ale z punktu widzenia składni języka jest to zmienna przechowująca adres łańcucha. Inny przykład to struktury z zapisanymi stałymi np poziomami MENU.
Nie pytałeś o to Mirka ?

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 21 lut 2013, 13:26

Pytałem ale mnie ochrzanił i dlatego chciałem zobaczyć jak Wy to rozumiecie

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 21 lut 2013, 18:52

Wskaźnik nie jest stałą, tylko specyficzną zmienną, a konkretnie fizycznym adresem do zmiennej na którą wskazuje. Nie jest przechowywany w FALSH, tylko w RAM.
Natomiast może wskazywać na stałą umieszczoną w pamięci programu, i w takim kontekście został tu pewnie użyty.

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 22 lut 2013, 6:54

Masz racje formalnie to powinno tak być, lecz okazuje sie że nie i wskaźnik tez może byc we FLASH i wskazywać na komórę w pamięci FLASH. Właśnie próbuje do tego dojść jak to jest.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 22 lut 2013, 16:26

Wskaźnik nie może być w FLASHu jako zmienna, bo nie masz możliwości jej modyfikowania. Może być zapisany tam jako stała, i pobierany z niej. Ewentualnie jest zapisany jako stała, w FLASH, pobierany z niej i modyfikowany na stosie lub zmiennej tymczasowej, wtedy możesz go formalnie nie widzieć.

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 23 lut 2013, 16:33

Powiedz mi w takim razie jak fizycznie wygląda taka tablica wskaźników do funkcji

Kod: Zaznacz cały

void (*parse_funk[3])(char *buf) PROGMEM = {
                          parse_set_led,
                          parse_get_led,
                          parse_set_lcd};

gdzie void parse_set_led(char *buf); oraz pozostałe są funkcjami
co dokładnie gdzie jest umieszczone?

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 23 lut 2013, 17:12

Aż tak dobrze C nie znam. Ale rodzi się pytanie. Po co ci to wiedzieć ? Dla ciebie jako programisty wysokiego poziomu, nie ma znaczenie gdzie fizycznie kompilator wrzuci dane. Istotne jest tylko to że używasz wskaźnika. Gdybyś pisał w ASM, to inna sprawa, ale w C, nie wiem czy warto aż tak wnikać, w szczegóły. Zresztą pewnie każdy kompilator zrobi to po swojemu.

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 23 lut 2013, 17:39

Potrzebne mi to bo chcę wiedzieć jak się potem dostać do takiego wskaźnika.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 23 lut 2013, 21:05

Normalnie używasz go w programie. Zresztą i tak musisz najpierw zadeklarować taki wskaźnik. A to gdzie on fizycznie jest nie ma dla ciebie znaczenia, kompilator i tak sam sobie go odnajdzie.

ODPOWIEDZ