Speicherverbrauch(RAM) & Datentypen-Problem

Gast #443142
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
#443217
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.