[avr-gcc] zajetosc pamieci



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "tr" <bill_at_nospam_microsoft.com>
Subject: [avr-gcc] zajetosc pamieci
Date: Mon, 22 Aug 2005 20:26:46 +0200


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



Poprzedni Następny
Wiadomość
Spis treści
From: Zbych <abuse_at_nospam_onet.pl>
Subject: Re: [avr-gcc] zajetosc pamieci
Date: Mon, 22 Aug 2005 22:18:21 +0200


tr wrote:
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 ?

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.

Poprzedni Następny
Wiadomość
Spis treści
From: Krzysztof Rudnik <rudnik_at_nospam_kki.net.pl>
Subject: Re: [avr-gcc] zajetosc pamieci
Date: Tue, 23 Aug 2005 08:32:30 +0200


Zbych wrote:

tr wrote:
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 ?

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.

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.



--
Krzysiek Rudnik


Poprzedni Następny
Wiadomość
Spis treści
From: Adam Dybkowski <adybkows123_at_nospam_amwaw.edu.pl>
Subject: Re: [avr-gcc] zajetosc pamieci
Date: Sun, 28 Aug 2005 21:06:51 +0200


Krzysztof Rudnik wrote:

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.

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.

--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/

Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.

Poprzedni Następny
Wiadomość
Spis treści
From: =?ISO-8859-2?Q?=22Mi=B3osz_K=2E=22?= <news_at_nospam_miklobit.WYTNIJTO.com>
Subject: Re: [avr-gcc] zajetosc pamieci
Date: Tue, 23 Aug 2005 11:49:30 +0200


tr napisał(a):
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 ?


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.


--
Miłosz

-------------------------------------------
AVR: narzędzia,moduły prototypowe (USB/CAN)
http://www.miklobit.com
-------------------------------------------