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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.