Forum: Mikrocontroller und Digitale Elektronik Problem mit malloc() + arm-none-eabi-gcc + newlib


von Peter (Gast)


Lesenswert?

Hallo,

ich programmiere gerade für den STM32 mit arm-none-eabi und der newlib. 
Eine kleine 'blinky' Demo läuft.

Sobald ich aber malloc() aufrufe gibt es Probleme.

Zuerst hat sich der Linker beschwert, dass die Funktion _sbrk() nicht 
gefunden werden kann. Diese habe ich nun (zu Testzwecken) leer 
implementiert. Der Linker linkt jetzt.

Allerdings springt der STM32 direkt in den HardfaultHandler() bei 
ausführen von malloc() - und zwar ohne zuvor _sbrk() auszuführen.

Den build des GCC und der newlib habe ich nach dieser Anleitung 
durchgeführt:
http://fun-tech.se/stm32/gcc/index.php

Da ich mich in das Thema erst einarbeite, bin ich etwas ratlos, wie ich 
den Fehler debuggen kann.

Ich bin jede Hilfe dankbar. Peter

von Nico W. (nico_w)


Lesenswert?

Ein leeres _sbrk() kann ja auch nicht funktionieren.
Du musst halt in deinem Prozessor einen funktionierenden Heap 
implementieren. Ohne geht malloc und co nicht.

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?


von Jim M. (turboj)


Lesenswert?

Peter schrieb:
> Allerdings springt der STM32 direkt in den HardfaultHandler() bei
> ausführen von malloc() - und zwar ohne zuvor _sbrk() auszuführen.

Dann ist was kaputt. Aber eine leere Funktion kann den Debugger 
durcheinander bringen, mach da mal wenigstens ein __NOP(); rein.

Übrigens können bessere Debugger (auch GDB) Dir anzeigen wo der 
Hardfault ausgelöst wurde - Du hast ja alle Quellen da.

von Peter (Gast)


Angehängte Dateien:

Lesenswert?

So,

ich habe jetzt eine ganze Weile getestet, aber es will nicht laufen.

Deshalb hänge ich mal meine Dateien an und hoffe, dass jemand mal 
drüberschaut und den Fehler findet.

Anbei:
- main.c (LED an/aus)
- system.c (_sbrk(), HardfaultHandler() usw.)
- stm32f103_flash.ld (Linker Script)
- makefile

Wenn ich die Zeile mit
1
ptr = (uint8_t *)malloc(1);

ausmaskiere, dann läuft es. Andernfalls springt der STM32 ohne Aufruf 
von _sbrk() direkt in den HardfaultHandler().

Gruß, Peter

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.