mikrocontroller.net

Forum: Compiler & IDEs Makefile stm32f1


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Make (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche mich gerade an den STM32 Controllern. Ich habe hier dieses 
BluePill Board mit dem STM32F103C8.

Ich habe es geschafft mit Eclipse und dem GNU ARM Plugin ein Projekt 
dafür zu erstellen und auch die LED blinken zu lassen. Jedoch ist in dem 
vorhandenen Projektemplate im Erstell-Assistenten eine alte CMSIS 
Version dabei.
Damit funktioniert zum Beispiel der USB Teil nicht (Ich möchte damit das 
USB Tutorial hier im Wiki durcharbeiten).
Ebenfalls ist da die StdPeripheral Treiber und alles mögliche dabei, 
welches ich nicht verwenden will.

Deswegen habe ich versucht ein Bare Metall Template mit einem Makefile 
und nur der CMSIS Version (aktuelle aus en.stm32cubef1.zip von 
STMicroeletronics) zu bauen.

Wenn ich nun make aufrufen, dann bekomme ich folgende Error Meldung:
david@david-opensuse:~/Schreibtisch/stm32make> make
~/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/arm-none-eabi-gcc  -nostartfiles -Tlibs/STM32F103XB_FLASH.ld  libs/startup_stm32f103xb.s   -o libs/startup_stm32f103xb
/tmp/ccUJ7FAL.o: In function `LoopFillZerobss':
(.text.Reset_Handler+0x26): undefined reference to `SystemInit'
(.text.Reset_Handler+0x2e): undefined reference to `main'
/home/david/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/lib/libc.a(lib_a-init.o): In function `__libc_init_array':
init.c:(.text.__libc_init_array+0x44): undefined reference to `_init'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'libs/startup_stm32f103xb' failed
make: *** [libs/startup_stm32f103xb] Error 1

Das Projekt habe ich angehängt.
Mein OS ist openSUSE Leap 42.3

Und gibt es für die STM32 auch so ein schönes Makefile Template wie 
dieses hier für AVR:
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Exkurs_Makefiles

Wäre nett, wenn mir jemand von euch weiterhelfen könnte

Autor: Niklas Gürtler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst eine Funktion SystemInit, welche die Takte alle 
initialisiert... Die von Hand zu schreiben ist relativ lästig.
Daher folgede Möglichkeiten:
1. Du kannst die aktuelle CMSIS/HAL Library einfach in dein eclipse 
Projekt reinkopieren (aus dem CubeF1 Download Paket).
2. Du implementierst die SystemInit manuell oder mit der HAL neu, oder 
lässt sie aus STM32CubeMX generieren
3. Du nimmst das Beispielprojekt vom Tutorial, da ist ein 
eclipse-Projekt drin. Da ist übrigens eine manuelle Variante dieser 
Funktion drin, unter anderem Namen.
4. Du nimmst das TrueStudio und generiert das Projekt mittels 
STM32CubeMX, das geht eigentlich am Einfachsten (auch unter Linux).

Autor: Make (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber die SystemInit Funktion ist doch schon unter "system_stm32f1xx.c" 
implementiert.
Fehlt mir da eine Verlinkung darauf?

Autor: Niklas Gürtler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso... Du hast die system_stm32f1xx.o offebar nicht mit gelinkt? Das 
-nostartfiles ist auch verkehrt wenn man den Standard Startupcode nimmt, 
der ruft __libc_init_array auf...

Autor: Make (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hab jetzt das -nostartfiles entfernt und bekomme nun folgenden 
output:
david@david-opensuse:~/Schreibtisch/stm32make> make all
  CC src/main.c
  CC libs/CMSIS/system_stm32f1xx.c
~/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/arm-none-eabi-gcc  -Tlibs/STM32F103XB_FLASH.ld  libs/startup_stm32f103xb.s   -o libs/startup_stm32f103xb
/tmp/ccbjBOVf.o: In function `LoopFillZerobss':
(.text.Reset_Handler+0x26): undefined reference to `SystemInit'
(.text.Reset_Handler+0x2e): undefined reference to `main'
/home/david/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/lib/crt0.o: In function `_start':
(.text+0xec): undefined reference to `main'
/home/david/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/lib/libc.a(lib_a-exit.o): In function `exit':
exit.c:(.text.exit+0x2c): undefined reference to `_exit'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'libs/startup_stm32f103xb' failed
make: *** [libs/startup_stm32f103xb] Error 1

Er hat das SystemInit wohl immer noch nicht gefunden.
Ich dachte durch OBJS=$(SRCS:.c=.o) sollte er alle in SRCS angegebenen 
Quellen als Objektdateien haben?

Autor: Niklas Gürtler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
~/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/arm-none-eabi-gcc  -Tlibs/STM32F103XB_FLASH.ld  libs/startup_stm32f103xb.s   -o libs/startup_stm32f103xb
Hier linkst du nur den Startupcode und sonst gar nix... Lass doch 
eclipse das makefile automatisch generieren, die aktuellen CMSIS-Version 
reinzukopieren ist einfach. Ich kann das makefile hier gerade nicht 
debuggen...

Autor: Christopher J. (christopher_j23)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Make schrieb:
> Und gibt es für die STM32 auch so ein schönes Makefile Template wie
> dieses hier für AVR:
> https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Exkurs_Makefiles

Nicht besonders schön aber es funktioniert: 
https://github.com/ChristianRinn/bare_metal_stm32f103c8

Autor: Doc Cortex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niklas Gürtler schrieb:
> Du brauchst eine Funktion SystemInit, welche die Takte alle
> initialisiert... Die von Hand zu schreiben ist relativ lästig.
> Daher folgede Möglichkeiten:


Was denn, die 15 Zeilen Code? Geht doch viel schneller und einfacher als 
Dein vorgeschlagenes Gedöns...


> 1. Du kannst die aktuelle CMSIS/HAL Library einfach in dein eclipse
> Projekt reinkopieren (aus dem CubeF1 Download Paket).
> 2. Du implementierst die SystemInit manuell oder mit der HAL neu, oder
> lässt sie aus STM32CubeMX generieren
> 3. Du nimmst das Beispielprojekt vom Tutorial, da ist ein
> eclipse-Projekt drin. Da ist übrigens eine manuelle Variante dieser
> Funktion drin, unter anderem Namen.
> 4. Du nimmst das TrueStudio und generiert das Projekt mittels
> STM32CubeMX, das geht eigentlich am Einfachsten (auch unter Linux).

Autor: Nop (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Doc Cortex schrieb:

> Was denn, die 15 Zeilen Code?

Bißchen mehr ist das schon, wenn man das richtig macht. Außerdem beißen 
Regsiter bekanntlich, so daß man sich von denen fernhalten muß.

Autor: Mw E. (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Nop schrieb:
> Außerdem beißen
> Regsiter bekanntlich, so daß man sich von denen fernhalten muß.

Nop hat mal wieder keine Ahnung, daher fasst er keine Register an ;)

Den CubeMX nutzt man für GENAU 2 Dinge:
- Die Peripherie klicken und gucken auf welchen Pin die rauskommt, wenn 
man das mit der Datenblattabelle macht bekommt man nen Föhn.
- Die PLL Variablen ausrechnen lassen fürn Takt.

Autor: Nop (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Mw E. schrieb:

> Nop hat mal wieder keine Ahnung, daher fasst er keine Register an ;)

Dein Ironiedetektor hat Pfingsten nicht so gut verkraftet, ne? ^^

Autor: Mw E. (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Naja bei dir weis man nie ob da mal wieder Murks gelabert ist oder obs 
Ironie ist.

Autor: Make (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christopher J. schrieb:
> Make schrieb:
>> Und gibt es für die STM32 auch so ein schönes Makefile Template wie
>> dieses hier für AVR:
>> https://www.mikrocontroller.net/articles/AVR-GCC-T...
>
> Nicht besonders schön aber es funktioniert:
> https://github.com/ChristianRinn/bare_metal_stm32f103c8

Ich hab jetzt das hier genommen und den STM32F103C8 Ordner von src ins 
Hauptverzeichnis kopiert und die CMSIS Dateien aktualisiert, sowie das 
Makefile für den verschobenen Ordner angepasst.
Damit hats geklappt und werde damit weiterarbeiten.

Autor: Nop (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Mw E. schrieb:
> Naja bei dir weis man nie ob da mal wieder Murks gelabert ist oder
> obs Ironie ist.

Was daher kommt, daß Dein Gedächtnis auch nur lückenhaft funktioniert - 
sonst hättest Du Dich nämlich auch erinnert, daß ich kein Freund von HAL 
& Co bin.

Im Übrigen labere ich auch technisch gesehen keinen Murks, sondern 
allenfalls kontroverse, aber vertretbare Ansichten.

Autor: W.S. (Gast)
Datum:
Angehängte Dateien:

Bewertung
-1 lesenswert
nicht lesenswert
Make schrieb:
> Ich habe es geschafft mit Eclipse und dem GNU ARM Plugin ein Projekt
> dafür zu erstellen und auch die LED blinken zu lassen. Jedoch ist in dem
> vorhandenen Projektemplate im Erstell-Assistenten eine alte CMSIS
> Version dabei.

Make schrieb:
> (.text.Reset_Handler+0x26): undefined reference to `SystemInit'
> (.text.Reset_Handler+0x2e): undefined reference to `main'

und
> /home/david/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/../lib/gcc/arm-non 
e-eabi/7.2.1/../../../../arm-none-eabi/lib/libc.a(lib_a-init.o):  ...

Jawoll! Immer nach dem Motto: "warum einfach, wenn es auch kompliziert 
immer noch nicht geht"

Manchmal kommt mir angesichts derartiger Herangehensweise das große 
Kopfschütteln. Du bist also in der eigentlichen Sache überhaupt noch 
keinen einzigen Schritt vorangekommen, sondern kämpfst die ganze Zeit 
mit der IDE und irgendwelchen CMSIS-Versionen und Make und sonstigem 
Zirkus - anstatt wenigstens EINMAL zu lernen, wie du deinen Compiler und 
Linker aufrufst und welche Kommandozeilenparameter du ihm geben mußt. 
Und du glaubst, daß die IDE dir eine Hilfe sei - tatsächlich hat sie 
sich als Hemmschuh für dich erwiesen.

Dabei geht es eigentlich so einfach! Ich häng dir mal die 
GCC-Batch-Datei aus der Lernbetty dran. Da mußt du zwar drin 
herumeditieren, weil deine Quellen ja andere sind als die der Lernbetty, 
ebenso ist deine CPU nebst RAM/ROM-Layout anders, ebenso werden die 
Pfadangaben vom Windows-PC anders gehandhabt als auf deinem Linux-PC und 
schlußendlich mußt du aus ner Batchdatei ein Shellscript machen.

Sollte alles ja keine Thema sein für jemanden, der sich zum 
Programmieren anschickt. Also stell dich nicht so an.

W.S.

Autor: Nop (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
W.S. schrieb:

> Dabei geht es eigentlich so einfach! Ich häng dir mal die
> GCC-Batch-Datei aus der Lernbetty dran.

Das Problem hier war nicht die IDE oder das Makefile, weswegen ein 
Buildscript auch keine Lösung ist. Das Problem war, daß der OP nicht 
willens war, die Fehlermeldung des Linkers sinnerfassend zu lesen.

Wenn man vergißt, ein relevantes Quelltextfile einzubinden, wird ein 
Buildscript nämlich zu genau derselben Fehlermeldung führen. D'oh.

Autor: Make (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
W.S. schrieb:
> Und du glaubst, daß die IDE dir eine Hilfe sei - tatsächlich hat sie
> sich als Hemmschuh für dich erwiesen.

Hab ich hier geschrieben, dass ich ein Problem mit Eclipse habe?

Nein ganz im Gegenteil, mit Eclipse konnte ich das erzeugte Beispiel 
kompilieren und erzeugen.
Ich wollte aber ein bare-metall Projekt, welches ich auch ohne Eclipse 
nur mit Make kompilieren kann.

Autor: Niklas Gürtler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Make schrieb:
> Ich wollte aber ein bare-metall Projekt, welches ich auch ohne Eclipse
> nur mit Make kompilieren kann.

Eclipse generiert makefiles, welche dann auch ohne Eclipse nur mit make 
genutzt werden können. Die sind aber nicht besonders hübsch

Autor: Make (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Niklas Gürtler schrieb:
> Eclipse generiert makefiles, welche dann auch ohne Eclipse nur mit make
> genutzt werden können.

Ich weiß aber den Grund hast du dir selber schon beantwortet:

> Die sind aber nicht besonders hübsch

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Make schrieb:
> Ich weiß aber den Grund hast du dir selber schon beantwortet:

Wenn die "Schönheit" einer Datei, welche man normalerweise nicht öffnet 
weil sie autogeneriert ist und funktioniert, relevant ist... Was schon 
eher ein Problem ist: Pfade sind darin hartkodiert, das makefile ist 
also nicht wirklich portabel.

Autor: W.S. (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Make schrieb:
> Ich wollte aber ein bare-metall Projekt, welches ich auch ohne Eclipse
> nur mit Make kompilieren kann.

Dann kannst du zu wenig.

Also ICH kann meine Projekte übersetzen, ohne dazu Make oder eine IDE 
nötig zu haben. Das beredte Beispiel hab ich dir ja schon gepostet.

Aber wenn dir die einfach zu handhabende Version nicht recht ist, dann 
mach's eben so kompliziert wie du selber willst.

W.S.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.