avr-gcc zajetosc ram/data - dziwne zachowanie
BartekK - 13-04-2007 23:45
avr-gcc zajetosc ram/data - dziwne zachowanie Nie wiem, czy ja cos zle robie...
Mam program (dosc prosty w dzialaniu) ktory operuje w zasadzie na kilku
zmiennych tylko (razem moze z 30bajtow powinny zajmowac), ktore sa
definiowane globalnie jako "volatile static", bym mogl do tych samych
zmiennych dostawac sie z programu glownego, z przerwan i z wewnatrz
funkcji (ktore sa typu void funkcja(void) a wewnatrz operuja na
zmiennych globalnych)
Jedna z nich jest tablica, dokladnie to "volatile static int16_t
tablica[rozmiar]". Gdy podaje rozmiar np 1 - mam zajetosc data ~200
bajtow. Gdy definiuje rozmiar 2, zajetosc skacze do ~219bajtow. Przy
rozmiarze 64 (czyli teoretycznie 128bajtow tablicy) juz mam data >1300
bajtow, co niestety na atmega16 nie jest zbyt optymistyczne.
W funkcjach/obslugach przerwan uzywam jeszcze paru zmiennych
"tymczasowych" definiowanych lokalnie wewnatrz funkcji, ale probowalem
(poniewaz nie ma grozby ze rownoczesnie 2 funkcje taka zmienna
zmodyfikuja) przeniesc je jako globalne volatile static i tez nie
pomoglo...
Na projekt skladaja sie pliki:
main.c
uart.c
lcd.c
eprom.c
oraz pliki naglowkowe:
main.h (inkludowany w kazdym .c)
uart.h, lcd.h, eprom.h (inkludowane z odpowiednich .c)
W pliku main.h definiuje wszystkie zmienne "globalne", bym mial do nich
dostep np z funkcji zyjacej wewnatrz eprom.c. Probowalem robic tak:
#ifndef _ZMIENNE_
#define _ZMIENNE_
volatile static uint8_t zmienna;
#else
extern volatile static uint8_t zmienna;
#endif
by wielokrotnie (z okazji wielokrotnego inkludowania main.h) nie
definiowac tych samych zmiennych, ale nic to nie zmienilo...
Moze wogole zle do tego podchodze? moze sztuka pisania w c mi nie
wychodzi ;)
--
| Bartlomiej Kuzniewski
|
http://drut.org/|
http://www.allegro.pl/show_user_auctions.php?uid=338173
Piotrek Sz. - 14-04-2007 07:45
BartekK <sibi@NOSPAMdrut.org> napisał(a):
> Nie wiem, czy ja cos zle robie...
>...
Ty chyba nie bardzo rozumiesz , co oznacza static :(
Zmienne zadeklarowane jako static , są "widziane" tylko w module , w którym
zostały zadeklarowane.Krótko mówiąc , zmienna volatile static typ x w module
main.c , nie jest tą samą zmienną volatile static typ x , której używa moduł
uart.c itd.To sa odrębne zmienne - pomimo takiej samej nazwy i zajmują odrębny
obszar w RAM-ie.Dlatego też , jeśli zwiększasz rozmiar zmiennej static w pliku
main.h o np. 1 bajt , to zajętość pamięci operacyjnej zwiększa się o tyle
bajtów , w ilu modułach tę zmienną zadeklarowałeś.Jeśli chodzi o "extern
volatile static zmienna" - bezsensowne :(
Jeśli chcesz , by każdy moduł Twojego projektu miał "dostęp" do zmiennej , a
kompilator jej nie optymalizował , to zadeklaruj zmienną globalną jako
volatile jednym module , a w innych używaj jej jako extern.
Pozdrawiam
Piotrek
--
Wysłano z serwisu Usenet w portalu Gazeta.pl ->
http://www.gazeta.pl/usenet/
BartekK - 14-04-2007 12:45
Piotrek Sz. napisał(a):
>> Nie wiem, czy ja cos zle robie...
> Jeśli chcesz , by każdy moduł Twojego projektu miał "dostęp" do zmiennej , a
> kompilator jej nie optymalizował , to zadeklaruj zmienną globalną jako
> volatile jednym module , a w innych używaj jej jako extern.
Dzieki, tak tez podejrzewalem:)
Zmienilem miejsce definiowania zmiennych globalnych (poczatek main.c),
wyrzucilem to static i juz jest ok.
--
| Bartlomiej Kuzniewski
|
http://drut.org/|
http://www.allegro.pl/show_user_auctions.php?uid=338173
zanotowane.pldoc.pisz.plpdf.pisz.plkonstruktor.keep.pl