[avr-gcc] zajetosc pamieci

Aug 22, 2005 4 Replies

Napisalem program w c dla atmegi. Robi troche rzeczy i genralnie program wyszedl mi dosyc duzy. W jaki sposob zmierzyc zajetosc pamieci (stosu/sterty) w avr-gcc ? Zdaje sobie sprawe, ze najprostszym sposobem moze byc debager, ale u mnie to moze byc dosyc trudne, bo ciezko jest zasymulowac warunki (stany/komunikacje, itp.). Czy istatnie jakis prosty lub/i prymitywny sposob mierzenia zajetosci RAMu ?



tr



Jeśli chodzi o pamięć przydzielaną dynamicznie to możesz tak zmodyfikować funkcję malloc, aby zapamiętywała wartość maksymalną przydzielonej pamięci, włączyć urządzenie na parę godzin/dni i po tym czasie odczytać zapamiętane maksimum. Ze stosem jest trochę gorzej. Możesz oszacować na sucho jego maksymalną głębokość (najdłuższy łańcuch wywołań funkcji), albo w czasie inicjalizacji urządzenia wypełnić przestrzeń stosu jakąś znaną wartością i podobnie jak w przypadku sterty, po jakimś czasie pracy sprawdzić, jak daleko został zamazany ciąg wzorcowy.

O ile avr-gcc dziala jak inne gcc to malloc wola funkcje sbrk, ktorej zadaniem (normalnie) jest pobranie pamieci od systemu. Zwykle w tych malych wersjach bibliotek ta funkcja po prostu przestawia wskaznik zajecia pamieci i co ciekawsze jej juz nie zwalnia. Wiec zwykle wystarczy monitorowac ten wskaznik i wiadomo ile max sterty bylo uzyte.

tr napisał(a):

Sprawdź w jaki sposób używasz uzywasz stałych albo tekstów w programie. Jak masz jakąś duza tablice stałych , to typowa deklaracja w stylu

const char jakiesStale[1000] = { .... };

i odwołanie

zmienna = jakiesStale[500];

spowoduje że w trakcie inicjalizacji programu zostanie w RAM utworzona kopia tej tablicy i dane będą do niej przepisane z flash'a. Avr-gcc nie potrafi inteligentnie obsłuzyć odwołania do danych w pamieci programu i trzeba takie tablice deklarować z kaluzulą PROGMEM a następnie uzywac funkcji bibliotecznych z przyrostkiem "_P" w nazwie zeby przepisac potrzebne dane do ram. Mozna o tym zapomnieć, bo problem wychodzi dopiero jak ilość stałych zaczyna być porównywalna z wielkością RAM procesora.

Dobrym rozwiązaniem jest też wyciągnięcie źródła funkcji malloc z biblioteki libc, wywalenie jednego słowa "static" i już mamy dostęp do listy wolnych (rzeczywiście) bloków pamięci. Wystarczy przelecieć prostą pętlą po tej liście aby obliczyć rzeczywisty rozmiar wolnej pamięci sterty. Plus to czego nie pobrał sbrk tak jak zostało napisane powyżej.

A na stos mam prosty sposób: na początku działania programu jeszcze przy zablokowanych przerwaniach (najlepiej w jakiejś sekcji .init) trzeba wypełnić cały nieużywany stos od dolnego początku do SP-8 (margines bezpieczeństwa) stałą wartością, np. 0x67 a potem w dowolnej chwili można sprawdzić ile tych bajtów 0x67 od początku obszaru stosu jeszcze się ostało. Można to oczywiście sprawdzać np. co 100 ms w przerwaniu, wypełniając spowrotem stos stałą wartością aby mierzyć dynamiczną zajętość stosu.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required