[avr-gcc] zmienne "ciurkiem" w ramie?

May 06, 2007 8 Replies

Sa sobie zmienne roznych typow i wymiarow, uzywane w programie w roznych funckcjach, zdefiniowane jako /volatile/ zeby byl do nich dostep z kazdego miejsca programu. W programie jest opcja "zapisania" aktualnych ustawien do eepromu. Przy starcie programu zestaw zmiennych jest "odzyskiwany" z eepromu.



Niestety - obecnie ze wzgledu na przerozna konstrukcje zmiennych funkcje zapisu i odczytu wygladaja jak lista eeprom_write_byte(zmienna) tudziez "wyluskiwanie" zmienna > bajt, i zapis bajtow, podobnie odczyt. Sensu to nie ma za bardzo.



Jak zmusic kompilator/gcc (jesli sie da?) aby zestaw zmiennych trzymal w pamieci od adresu-do adresu, albo przynajmniej jedna po drugiej, tak by wskaznik do pierwszej z nich wskazywal na poczatek obszaru, a wskaznik do ostatniej (powiedzmy 8bitowej) koniec obszaru, dzieki temu jedna funkcja eeprom_write(read)_block bym mogl pojechac po wszystkich zmiennych bez wnikania w to jaka maja nature (bo i tak sa bajtami w ramie). Probowalem zdefiniowac zmienne jedna-po-drugiej, ale przy debugowaniu okazuje sie ze w ramie wcale nie sa w tej samej kolejnosci, obawiam sie ze po X kompilacjach i dorzuceniu/wyrzuceniu paru zmiennych moga sie okazac rozrzucone calkiem inaczej i padnie mi zapis/odzyskiwanie eepromu...


Zrob z nich jedna strukture.

Tez tak myslalem, ale po pierwsze niezbyt wiem jak ;), tzn jak mi to ulatwi zycie, czy wtedy wystarczy write_eeprom_block(wskaznik_do_stuktury, sizeof(struktura)) ? A po drugie kazda z nich jest gdzie indziej uzywana w innej funkcji i jest innego typu, musialbym poprzerabiac cale stado funkcji by sie odwolywaly do struktury zamiast bezposrednio do zmiennej ? Tzn teraz mam powiedzmy: volatile int16_t temperatura; volatile uint8_t napiecie; i mam to przerobic na: struct ciurkiem { int16_t temperatura; uint8_t napiecie; } volatile struct ciurkiem ustawienia; i wszedzie gdzie odwolywalem sie do "napiecie" teraz mam sie odwolywac do "ustawienia.napiecie", i to wystarczy?

U¿ytkownik "BartekK" snipped-for-privacy@NOSPAMdrut.org napisa³ w wiadomo¶ci news:f1l9bu$quo$ snipped-for-privacy@atlantis.news.tpi.pl...

Wlasnie tak a przy odtwarzaniu zmiennych

read_eeprom_block( & ustawienia, sizeof(ustawnienia) );

To wystarczy.

W ostatecznosci jesli Ci sie nie chce przerabiac programu to mozesz zrobic definesy

#define napiecie ustawienia.napiecie

ale to moze sie wydawac nieleganckie.

BartekK napisal:

A co "volatile" ma wspólnego z dostępnością zmiennej w całym programie? Deklaracja volatile oznacza że zmienna może zostać zmodyfikowana poza kontrolą programu (np. jest rejestrem jakiegoś urządzenie) i kompilatorowi nie wolno optymalizować dostępu do niej (nawet jeśli zmienna tego typu została przed chwilą załadowana do akumulatora przy następnym użyciu znowu musi zostać odczytana z pamięci). Zmienne dostępne w całym programie to zmienne globalne - jeśli chcesz mieć pewność że będą leżały kolejno - zgrupuj (jak ci już radzono) je w strukture. GRG

Gregor napisał(a):

Tak, wiem o tym. I np zapis/odczyt eepromu dokonuje w przerwaniu (np guzik podlaczony do nozki INT1), dlatego musze miec pewnosc ze zapisuje/odczytuje aktualne zmienne. Problem w kazdym razie juz rozwiazany - sktruktura zalatwila dostep.

"normalnie", google -> struktury c

tak

tak

Andy napisał(a):

Pomijajac juz 'literowke' wywolanie: eeprom_read_block(&ustawienia, adr_w_epp, sizeof(ustawienia) ); wywala warninga "passing arg 1 of `eeprom_read_block' discards qualifiers from pointer target type" - a warningow nie lubimy, jakas rada?

BartekK napisał(a):

Ok, juz wiem :) Wystarczylo mu wytlumaczyc ze &ustawienia to void eeprom_read_block( (void*)& ustawienia, ADR_ustawienia, sizeof(ustawienia) ); dziala slicznie :)

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required