Forum: Compiler & IDEs Speicherverbrauch(RAM) & Datentypen-Problem


von Richard Rudolf (Gast)


Lesenswert?

Hallo,

ich hab mal ein paar Fragen:

1. Wie ermittle ich den Speicherverbrauch(RAM) eines C-Programms?
Also nicht die Größe des Codes, sondern die letztendlich vom laufenden 
Programm maximal benötigte Speichergröße.
Zusammenzählen der von den globalen Variablen verbrauchten Bytes ist 
einfach, aber wie sieht es mit dem Stack etc. aus?
Und was passiert, falls der µC an die Grenze seines RAM stößt? Wirds 
undefiniert oder macht der einen sauberen Reset?

----


2. Wie viele Bytes sind die Datentypen "Float" und "Double" bei WinAvr 
und AtMega16 groß? Und wie groß ist der jeweilig verwendbare 
Wertebereich der Datentypen?

Konkret geht es um folgende Funktion:

vsolly = vsoll*labs(ysoll-y_act_ok)
        /sqrt((xsoll-x_act_ok)*(xsoll-x_act_ok)
             +(ysoll-y_act_ok)*(ysoll-y_act_ok));

welche dank irgendeinem Wertüberlauf nur Mist produziert und damit einen 
Portalroboter unsanft durch die Gegend schickt.
ysoll und y_act_ok sind als 32-Bit-Variablen(unsigned int32) gespeichert 
und können dabei Werte von ca. 2.700.000 bis ca. 3.300.000 annehmen, 
während vsoll zwischen 0 und 128 groß ist.

Ich weiß, einen 8-Bitter soll man nicht mit so großen Zahlen quälen, 
aber hier geht es leider nicht anders... ;-)

Vielen Dank schonmal im Voraus für die Hilfe.

MfG,
Richard

von Karl H. (kbuchegg)


Lesenswert?

> 1. Wie ermittle ich den Speicherverbrauch(RAM) eines C-Programms?
> Also nicht die Größe des Codes, sondern die letztendlich vom laufenden
> Programm maximal benötigte Speichergröße.

Im Prinzip kann man den Wert nicht in allen Fällen bestimmen, weil
es klarerweise immer davon abhängt welchen Weg das Programm
durch seine Funktionen nimmt. Je nachdem kann der Speicherverbrauch
sehr unterschiedlich (bis hin zu unendlich) sein.

> Und was passiert, falls der µC an die Grenze seines RAM stößt? Wirds
> undefiniert oder macht der einen sauberen Reset?

undefiniert.
Alles Mögliche kann passieren.

>
> ----
>
>
> 2. Wie viele Bytes sind die Datentypen "Float" und "Double" bei WinAvr
> und AtMega16 groß? Und wie groß ist der jeweilig verwendbare
> Wertebereich der Datentypen?

Probiers aus:
  sizeof  liefert dir die Grösse in Bytes

  sizeof( double )
  sizeof( float )

float hat auf einem AVR eine Größe von 4 Bytes. double wird
ebenfalls mit 4 Bytes gerechnet. Von der Rechengenauigkeit
macht es also auf einem AVR keinen Unterschied ob man double
oder float benutzt.

>
> Konkret geht es um folgende Funktion:
>
> vsolly = vsoll*labs(ysoll-y_act_ok)
>         /sqrt((xsoll-x_act_ok)*(xsoll-x_act_ok)
>              +(ysoll-y_act_ok)*(ysoll-y_act_ok));
>
> welche dank irgendeinem Wertüberlauf

Dann finde den Überlauf raus.
Teile die Formel in Einzelteile auf und schau dir an
welches Teilergebnis den Überlauf verursacht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.