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