AVR kontrola stosu

Nov 25, 2005 3 Replies

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³


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³

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...

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.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required