RTV forum PL | NewsGroups PL

Czy można wymusić na gcc, by zmienne volatile były uporządkowane w RAM od adresu do adresu?

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

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Czy można wymusić na gcc, by zmienne volatile były uporządkowane w RAM od adresu do adresu?

BartekK
Guest

Sun May 06, 2007 7:45 pm   



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

--
| Bartlomiej Kuzniewski
| sibi@drut.org GG:23319 tel +48 696455098 http://drut.org/
| http://www.allegro.pl/show_user_auctions.php?uid=338173

Krzysztof Rudnik
Guest

Sun May 06, 2007 8:05 pm   



BartekK wrote:

Quote:

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.


--
Krzysiek Rudnik

BartekK
Guest

Sun May 06, 2007 8:10 pm   



Krzysztof Rudnik napisał(a):
Quote:
BartekK wrote:

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 Wink, 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?

--
| Bartlomiej Kuzniewski
| sibi@drut.org GG:23319 tel +48 696455098 http://drut.org/
| http://www.allegro.pl/show_user_auctions.php?uid=338173

Andy
Guest

Sun May 06, 2007 8:41 pm   



Użytkownik "BartekK" <sibi@NOSPAMdrut.org> napisał w wiadomości
news:f1l9bu$quo$1@atlantis.news.tpi.pl...
Quote:
...
Tez tak myslalem, ale po pierwsze niezbyt wiem jak Wink, tzn jak mi to
ulatwi zycie, czy wtedy wystarczy
write_eeprom_block(wskaznik_do_stuktury, sizeof(struktura)) ?

Wlasnie tak a przy odtwarzaniu zmiennych

read_eeprom_block( & ustawienia, sizeof(ustawnienia) );


Quote:
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?


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.


--
Andrzej

Gregor
Guest

Sun May 06, 2007 9:35 pm   



BartekK napisal:
Quote:
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.

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

--
Tutaj sygnatura Grzegorza Domagały - jeśli chcesz wysłać do niego wiadomość
pisz pod adres grg12@chello.at i nie zapomnij dodać
"kielbaska dla cerbera" w treści albo Cerber zeżre twój list...

BartekK
Guest

Sun May 06, 2007 10:32 pm   



Gregor napisał(a):
Quote:
BartekK napisal:
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.
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).
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.


--
| Bartlomiej Kuzniewski
| sibi@drut.org GG:23319 tel +48 696455098 http://drut.org/
| http://www.allegro.pl/show_user_auctions.php?uid=338173

Wiktor S.
Guest

Mon May 07, 2007 1:48 am   



Quote:
Zrob z nich jedna strukture.
Tez tak myslalem, ale po pierwsze niezbyt wiem jak Wink

"normalnie", google -> struktury c

Quote:
tzn jak mi to ulatwi zycie, czy wtedy wystarczy
write_eeprom_block(wskaznik_do_stuktury, sizeof(struktura)) ?

tak

Quote:
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?

tak


--
Azarien

BartekK
Guest

Tue May 08, 2007 11:41 am   



Andy napisał(a):
Quote:
Tez tak myslalem, ale po pierwsze niezbyt wiem jak Wink, tzn jak mi to
ulatwi zycie, czy wtedy wystarczy
write_eeprom_block(wskaznik_do_stuktury, sizeof(struktura)) ?
Wlasnie tak a przy odtwarzaniu zmiennych
read_eeprom_block( & ustawienia, sizeof(ustawnienia) );
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?


--
| Bartlomiej Kuzniewski
| sibi@drut.org GG:23319 tel +48 696455098 http://drut.org/
| http://www.allegro.pl/show_user_auctions.php?uid=338173

BartekK
Guest

Tue May 08, 2007 11:14 pm   



BartekK napisał(a):
Quote:
Andy napisał(a):
Tez tak myslalem, ale po pierwsze niezbyt wiem jak Wink, tzn jak mi to
ulatwi zycie, czy wtedy wystarczy
write_eeprom_block(wskaznik_do_stuktury, sizeof(struktura)) ?
Wlasnie tak a przy odtwarzaniu zmiennych
read_eeprom_block( & ustawienia, sizeof(ustawnienia) );
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?
Ok, juz wiem Smile Wystarczylo mu wytlumaczyc ze &ustawienia to void

eeprom_read_block( (void*)& ustawienia, ADR_ustawienia,
sizeof(ustawienia) );
dziala slicznie :)

--
| Bartlomiej Kuzniewski
| sibi@drut.org GG:23319 tel +48 696455098 http://drut.org/
| http://www.allegro.pl/show_user_auctions.php?uid=338173

elektroda NewsGroups Forum Index - Elektronika Polska - Czy można wymusić na gcc, by zmienne volatile były uporządkowane w RAM od adresu do adresu?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map