mikrocontroller.net

Forum: Compiler & IDEs Realloc in Methode


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hoffe ihr könnt mir helfen. Folgender Code:

uint8_t openDiagCache(){
  // Allocate memory for diag-session
  diagCache = (char*) realloc (diagCache, 520*sizeof(char)); // HIER 
Stopt es.
  // Check if allocation was succesfull
  if (diagCache != NULL) {
    diagCacheOpen = 1;
  }
  return diagCacheOpen;
}

Das Problem ist der Code stoppt in der markierten Zeile. Wieso? Ich kann 
es mir nicht erklären ansonsten funktioniert realloc() einwandfrei. Auch 
in der Ebene über dieser Methode (d.h. in der Methode wo diese Methode 
aufgerufen wird funktioniert es noch). Habt ihr eine Idee. P.S. malloc() 
hat den selben Effekt, bleibt auch stecken.

DANKE!

Tobi

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine Glaskugel sagt zu wenig RAM.

HTH

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Wert hat diagCache vor dem Aufruf?

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@HTH/g457, aber warum ist dann vor Methodenaufruf genug RAM vorhanden um 
den Befehl durchzuführen? Selbst mit 1*sizeof(char) geht es nicht, also 
RAM schließe ich aus. Beim ersten aufruf hat diagCache den Wert NULL.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SO nochmal rumprobiert: Ich initialisiere in selber Datei mehrere 
globale Variablen. Sobald ich einige der Definitionen entferne 
gehts...also doch RAM? Naja wie schaffe ich nun platz?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was verstehst du unter "HIER Stopt es"? Du hast ein Programm, das da so 
läuft (worauf eigentlich? ATtiny12 oder Cray XT5?), und das bleibt 
einfach so stehen?

Übrigens, das da:
  diagCache = (char*) realloc (diagCache, 520*sizeof(char)); // HIER
Stopt es.
  // Check if allocation was succesfull
  if (diagCache != NULL) {

produziert im Fehlerfall ein Memory-Leak. Wenn realloc fehlschlägt, 
bleibt nämlich der vorher allokierte Speicher unberührt. Da du aber den 
Zeiger diagCache schon überschrieben hast, kommst du an diesen Speicher 
nicht mehr ran. Man muß bei realloc immer das Ergebnis erst in einem 
temporären Zeiger zwischenpeichern und erst, wenn der nicht NULL ist, in 
den original-Zeiger kopieren.

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre interessant zu wissen was Du mit der Funktion erreichen willst. 
VIeleicht ist Dein Ansatz so einfach suboptimal.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Controler ist ein AT90CAN128. Es stoppt nicht war vll. ein wenig falsch 
ausgedrückt, Heap und Stack vermischen sich wohl => Der Controller 
fabriziert Unsinn. Das liegt daran, dass wahrscheinlich zu viel 
Speicherplatz im Ram verwendet wird. Als ersten Ansatz habe ich vor alle 
Strings in den Programmspeicher zu verfrachten. Die Allokation von 
520Byte ist schon zml. viel. In den alloziierten Bereich werden nach und 
nach Daten per UART/Eingabe von Touch hineingeschaufelt und bei einem 
bestimmtem Char wird der Inhalt ausgewertet. Wann das passiert ist aber 
nicht vorhersehbar (Usereingabe). Das ganze Konstrukt hat auch schon 
funktioniert (bis gestern Abend, 5 Revisionen vorher), das einzige was 
ich mir nach euren Tipps erklären kann wäre die unvernünftige 
Speicherverwaltung. Danke schon mal für eure Tipps.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobias schrieb:

> Die Allokation von 520Byte ist schon zml. viel.

Warum verwendest du da eigentlich realloc? Hast du einen kleinen Puffer, 
der mit der Zeit wächst? Dann mußt du nämlich bedenken, daß realloc 
unter Umständen temporär soviel Speicher braucht wie alte und neue 
Puffergröße zusammen.
Generell ist auch eine Allokation eines so großen zusammenhängenden 
Speicherblocks immer etwas problematisch, falls durch vorherige 
Allokationen der Speicher schon fragmentiert wurde.
Kannst du nicht eine feste Blockgröße definieren und die statisch 
anlegen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobias schrieb:

> In den alloziierten Bereich werden nach und
> nach Daten per UART/Eingabe von Touch hineingeschaufelt und bei einem
> bestimmtem Char wird der Inhalt ausgewertet.

Genau das ist etwas, was du auf einem µC mit recht arg limitiertem SRAM 
nicht machen willst. Du willst dich hier nicht auf malloc oder realloc 
verlassen, denn das kann ganz böse ins Auge gehen.

Was willst du den machen, wenn dir malloc meldet (oder realloc meldet), 
das kein Speicher mehr frei ist, obwohl rein rechnerisch noch was da 
sein müsste?

Daher allokiert man solche Speicher praktisch immer statisch im voraus 
und legt sich auf eine SPeichergröße fest, mit der man durchkommen muss.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.