Jak monitorować i unikać przepełnienia stosu w programach na ATmega32 z 2kB RAM?
AVR kontrola stosu
From: "Paweł" <paw1976_at_nospam_poczta.onet.pl>
Subject: AVR kontrola stosu
Date: Fri, 25 Nov 2005 07:41:37 +0100
Witam.
Piszę program na atmega32 (2kB ramu).
W programie mam zdefiniowaną globalną zmienną char temp[1000]
Niestety czasami dzieje się tak że w tej zmiennej pojawiają się krzaczki
zamazując poprawne dane. Nie dzieje się tak gdy ustawię wielkość
zmiennej na 800. W programie używam kilkudziesięciu woich funkcji,
jak i bibliotecznych (sprintf, sscanf, memcpy, strstr, str....) do których
przesyłane są różne parametry (większe strukturki za pomocą wskaźników),
ale też w tych funkcjach definiuję inne zmienne.
Domyślam się że następuje nadpisanie danych przez stos. Czy jest
jakaś kontrola tego stosu na poziomie kompilacji, lub przynajmniej
informacja że takie przepełnienie może wystąpić w którymś momencie?
Dziękuję za pomoc
Paweł
From: "Paweł" <paw1976_at_nospam_poczta.onet.pl>
Subject: Re: AVR kontrola stosu
Date: Fri, 25 Nov 2005 07:45:19 +0100
Dodam jeszcze wynik kompilacji przez avr-gcc
Size after:
avr-net.elf :
section size addr
.text 30008 0
.data 452 8388704
.bss 1186 8389156
.noinit 0 8390342
.eeprom 103 8454144
.debug_aranges 200 0
.debug_pubnames 2659 0
.debug_info 12098 0
.debug_abbrev 2881 0
.debug_line 8340 0
.debug_str 2931 0
Total 60858
AVR Memory Usage:
-----------------
Device: atmega32
Program: 30460 bytes (93.0% Full)
(.text + .data + .bootloader)
Data: 1638 bytes (80.0% Full)
(.data + .bss + .noinit)
Paweł
From: "Bogdan Gutknecht" <b_gutknecht_at_nospam_interia.pl>
Subject: Re: AVR kontrola stosu
Date: Fri, 25 Nov 2005 08:27:26 +0100
Domyślam się że następuje nadpisanie danych przez stos. Czy jest
jakaś kontrola tego stosu na poziomie kompilacji, lub przynajmniej
informacja że takie przepełnienie może wystąpić w którymś momencie?
Niestety na poziomie kompilacji nie da się określić wielkości stosu.
Musiałyby być śledzone wszystkie wywołania funkcji, i to w zależności od
warunków, czyli innych wywołań, co jest niemożliwe do zrealizowania -
kompilator musiałby symulować wykonywanie programu. Do tego dochodzš
przerwania, które zaciemniłyby całkowicie obraz używania stosu.
Pozostajš metody szacunkowe - to Ty wiesz jak ten program działa i właśnie
Tobie będzie najłatwiej prześledzić użycie stosu. Unikaj deklarowania tablic
i dużych struktur w funkcjach, zmniejsz jeśli to jest możliwe ilość
przerwań, nie zagnieżdżaj funkcji itp., itd...
From: Adam Dybkowski <adybkows123_at_nospam_amwaw.edu.pl>
Subject: Re: AVR kontrola stosu
Date: Sat, 26 Nov 2005 23:38:18 +0100
Paweł wrote:
Piszę program na atmega32 (2kB ramu).
W programie mam zdefiniowaną globalną zmienną char temp[1000]
Niestety czasami dzieje się tak że w tej zmiennej pojawiają się krzaczki
[...]
Domyślam się że następuje nadpisanie danych przez stos. Czy jest
jakaś kontrola tego stosu na poziomie kompilacji, lub przynajmniej
informacja że takie przepełnienie może wystąpić w którymś momencie?
Nie ma lekko. :( Możesz spróbować jednak zaalokować tą tablicę
dynamicznie (malloc) i tak ustawić położenie sterty, aby nie mogła być
zamazana przez stos (popatrz do dokumentacji avr-libc, chyba jedyny plik
PDF w zainstalowanym pakiecie WinAVR). Wtedy istnieje zagrożenie, że
stos może zamazać inne kluczowe obszary (jak zejdzie za nisko to np.
rejestry). Można kontrolować zajętość stosu, najpierw wypełniając całą
wolną pamięć stałą wartością (np. 0x67) a potem w wybranym momencie
sprawdzając, ile zostało ciągłego obszaru pamięci zawierającego bajt 0x67.
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.