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
@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.
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?
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:
1 | diagCache = (char*) realloc (diagCache, 520*sizeof(char)); // HIER |
2 | Stopt es. |
3 | // Check if allocation was succesfull
|
4 | 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.
Wäre interessant zu wissen was Du mit der Funktion erreichen willst. VIeleicht ist Dein Ansatz so einfach suboptimal.
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.
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?
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.
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.