Forum: Compiler & IDEs Hardfault-Interrupt bei malloc wenn kein Speicher verfügbar


von Christian (Gast)


Lesenswert?

Hallo,

ich bin programmiere gerade mit dem STM32F4Discovery Board. Als 
Entwicklungsumgebung nutze ich CooCox CoIDE 1.7.7 mit dem GNU 
C-Compiler.

Ein Problem habe ich, wenn der Speicher schon mittels malloc voll ist, 
d.h. malloc einen NULL-Zeiger zurückgibt, aber trotzdem noch weiterer 
Speicher angefordert wird. Hier wird bei mir nach ca 10-20 weiteren 
malloc-Aufrufen ein Hardfault-Interrupt ausgelöst.

Mein Programm um den Fehler einzukreisen besteht eigentlich nur aus den 
beiden Zeilen:

while(malloc(1)!=NULL);
while(malloc(1)==NULL);

Was könnte hier der Fehler sein?

Viele Grüße,

Christian

von Mike R. (thesealion)


Lesenswert?

Ich verweise erst einmal auf Beitrag "STM32 Grund für Hardfault herausfinden"

Ansonsten denke ich mal das malloc "irgendwelchen" Mist macht, wenn der 
Heap aufgebraucht ist und du es immer wieder aufrufst. (Oder aber weil 
der Speicher zwar belegt aber nicht freigegeben wird.

von huhu (Gast)


Lesenswert?

normalerweise kommt irgendwann ein NULL zurück ..
ABER ...
schau mal nach der _sbrk funktion
da ist bei der standardimplemenation vom coocox kein overflowcheck drin 
...

du musst dir dann im linker eine marke setzen wie groß der RAM ist ..
also ram - stack - startvector

evtl ist bei den STM .ld fles schon ein .ramstart und .ramend definiert

von huhu (Gast)


Lesenswert?

ich hab noch ne variable mehr um zu schauen wieviel ich noch übrig hab 
...
1
extern unsigned char __HeapStart;
2
extern unsigned char __HeapEnd ;
3
extern unsigned char __StackStart;
4
unsigned int HeapAvailable;
5
6
__attribute__ ((used))
7
caddr_t _sbrk (int size){
8
   static unsigned char *heap = NULL;
9
   unsigned char *prev_heap;
10
11
   if (heap == NULL) {
12
     heap = (unsigned char *)&__HeapStart;
13
   }
14
   prev_heap = heap;
15
16
   if((heap + size) > (unsigned char *)&__HeapEnd ){
17
      errno = ENOMEM;
18
      return (caddr_t) -1;
19
   }
20
   heap += size;
21
22
   HeapAvailable = (unsigned char *)&__HeapEnd - heap;
23
24
   return (caddr_t) prev_heap;
25
}

von Christian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

vielen Dank für den Hinweis mit dem Linker-Skript! Leider habe ich 
bisher noch keine Erfahrung damit gemacht.

Im Anhang findet ihr das Standard-Linkerscript, welches ich verwende. 
Wie könnte die vorgeschlagene Änderung dort eingearbeitet werden?

Viele Grüße,
Christian

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.