Hardfault-Interrupt bei malloc wenn kein Speicher verfügbar

Gast #3966668
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
Gast #3968606
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
Gast #3968630
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
}
Gast #3969661
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren