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

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...

Reply to
BartekK
Loading thread data ...

Zrob z nich jedna strukture.

Reply to
Krzysztof Rudnik

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?

Reply to
BartekK

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

Reply to
Gregor

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.

Reply to
BartekK

"normalnie", google -> struktury c

tak

tak

Reply to
Wiktor S.

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?

Reply to
BartekK

BartekK napisał(a):

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

Reply to
BartekK

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.