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

Reply to
BartekK
Loading thread data ...

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

Reply to
Piotrek Sz.

Piotrek Sz. napisał(a):

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

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.