defioniowanie zmiennych w WINAVR

witam

jak to jest w winavr jak sobie zdefiniuje zmienna jako

char tablica[1000];

to gdzie ona zostanie umieszczona? w SRAM'ie czy we flashu? bo wykrylem taka prawidlowosc ze jezeli zainicjalizuje tablice a wiec wpisze char tablica[1000] = "\0"; wowczas tablica ta jest umieszczona w hexie po skompilowaniu a jezeli nie zainicjalizuje czyli wpisze: char tablica[1000]; to jej nie ma w hexie, czy to oznacza ze jest wowczas tworzona w pamieci SRAM?

Krzysztof

Reply to
Krzysztof Skoroniak
Loading thread data ...
Reply to
Krzysztof Skoroniak

Ale kod startowy zeruje caly ten zarezerwowany obszar.

Krzysiek Rudnik

Reply to
Krzysztof Rudnik

Krzysztof Rudnik napisal(a):

Tylko w przypadku zmiennych globalnych i statycznych, nieprawdaz?

Reply to
Marcin E. Hamerla

Tylko dla takich zmiennych jest rezerwowane miejsce przez kompilator. Inne zmienne rezerwowane sa w czasie wykonania.

Krzysiek Rudnik

Reply to
Krzysztof Rudnik

Podczas kompilacji kompilator rozrzuca produkty kompilacji w (co najmniej) trzy miejsca zwane sekcjami:

- sekcja .text - tutaj ląduje kod programu,

- sekcja .data - tutaj lądują zmienne zainicjalizowane, czyli np. int x = 5;

- sekcja .bss - tutaj są umieszczane zmienne niezainicjalizowane, czyli np. int x;

Zawartość sekcji .data musi być umieszczona w pamięci nieulotnej ponieważ, tak jak to już zostało napisane, podczas startu programu musi ona być skopiowana w odpowiednie miejsce pamięci RAM. Natomiast sekcja .bss bywa traktowana różnie - podczas startu programu ten obszar RAM-u jest zazwyczaj zerowany (jakaś prosta pętelka), ale AFAIR standard C tego nie wymaga. Nie należy więc polegać na tym że po deklaracji int x, zmienna x zawsze będzie miała wartośc początkową 0.

Nazw .text, .data, .bss używa gcc, inne kompilatory mogą np. używać nazw CODE (lub TEXT), DATA, BSS. W każdym bądź razie idea jest taka sama.

Regards, /J.D.

Reply to
Jan Dubiec

On Fri, 30 Jul 2004 19:13:18 +0200, "Mister" snipped-for-privacy@poczta.onet.pl> wrote: [.....]

Kompilator nie robi żadnej pętelki. W przypadku programowania systemów embedded odpowiedni kod startowy musi zapewnić programista. Na szczęście jest tak, że producenci kompilatorów dodają do kompilatora również mniej lub bardziej użyteczną bibliotetę funcji (nazwijmy ją biblioteką standartową) oraz *kod startowy* który w zależności od konfiguracji sprzętu tudzież innych czynników programista czasami/często musi zmodyfikować.

Regards, /J.D.

Reply to
Jan Dubiec

Bardzo stara specyfikacja C mowila ze takie zmienne sa rzeczywiscie zerowane. Poniewaz jest to nieeleganckie i czesto niepotrzebne - co nowsze implementacje wcale nie musza zerowac.

J.

Reply to
J.F.

Akurat zmienna blabla bedzie w ram. Gdzie w ROM (flash) bedzie napis, akurat tak jest ze wszystkimi stalymi napisowaymi (literalami) np te od printf:

printf("Wartosc zmiennej x = %d\n", x);

Krzysiek Rudnik

Reply to
Krzysztof Rudnik

Tu nie jestem taki pewny - w sumie wynik ten sam, a umieszczenie zmiennej w .data powoduje powiekszenie binarki ladowanej do rom. Wydaje mi sie ze np. gcc 2.95 zmienne jawnie inicjowane zerami wrzucal do .bss. Musze sprawdzic.

Krzysiek Rudnik

Reply to
Krzysztof Rudnik

tak oczywiscie, w przypadku AVR bedzie w RAM, o czym zreszta napisalem, ale chyba nie doczytales. Bedzie we flash, w przypadku procesora, ktory ma jednolita przestrzen adresowa dla RAM i dla flasj, np w msp430.

Stringi takie sa ladowane przez kod startowy do ram. Funkcja printf pobieta je z ram, chyba ze:

const char *aqq PROGMEM = "Wartosc zmiennej x = %d\n"; printf_P(aqq, x);

wtedy string jest pobierany bezposrednio z flash.

Reply to
Krzysztof

Akurat w AVR i 51 RAM i ROM sa rozdzielone. Inaczej trzeba je odczytywac, wiec printf czyta z RAM. A napis sie przepisuje z ROM do RAM na poczatku.

Do ROM jest inny printf.

J.

Reply to
J.F.

dzieki wszystkim za wyczerpujace odpowiedzi

pozdr

Reply to
Krzysztof Skoroniak

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.