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

, 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

, 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
"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

, 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

, 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

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