[avr-gcc] zajetosc pamieci

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

Reply to
tr
Loading thread data ...

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.

Reply to
Zbych

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.

Reply to
Krzysztof Rudnik

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.

Reply to
"Miłosz K."

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.

Reply to
Adam Dybkowski

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.