avr-gcc zajetosc ram/data - dziwne zachowanie

Apr 13, 2007 2 Replies

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 ;)


BartekK snipped-for-privacy@NOSPAMdrut.org napisał(a):

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

Piotrek Sz. napisał(a):

Dzieki, tak tez podejrzewalem:) Zmienilem miejsce definiowania zmiennych globalnych (poczatek main.c), wyrzucilem to static i juz jest ok.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required