STM32 FreeRTOS Projekt (Makefile - GCC)

OP #2593583
Lesenswert?

Im Anhang befindet sich ein funktionierendes Beispielprojekt für 
FreeRTOS auf dem STM32F103. Als Platform habe ich das ET-STM32F103 Board 
verwendet. Das Programm lässt LEDs blinken und schreibt Daten über den 
USART1 heraus. Nichts spektakuläres, aber immerhin eine 
Ausgangsposition. ;)

Anleitung:
----------
+ Die Variable "CROSS_COMPILE" im Makefile an eure Toolchain anpassen
  (z.B. die arm-none-eabi Toolchain von Codesourcery)

+ make eingeben

+ im Ordner "output" liegt bei Erfolg dann das Kompilat


Gruß Oliver
Angehängte Dateien:
Gast #2595623
Lesenswert?

um Himmels Gottes Willen...
1
#define RCC_APB2ENR  (*((volatile unsigned long*)(0x40021000 + 0x018)))
gibt's da nix schöneres in den STM's Libs?

SCNR

trotz alledem ein schönes Projekt, werde ich demnächst mal damit 
rumspielen müssen.

mfg
OP #2595963
Lesenswert?

Entwickler schrieb:
> Kann ich den IAR Debugger benutzen ?
Was für einen Debugger hast du denn? Einen J-Link?

Dann sollte das mit folgender Openocd config funktionieren:
1
#daemon configuration
2
telnet_port 4444
3
gdb_port 4242
4

5
#interface
6
interface jlink
7

8
source [find target/stm32.cfg]

Segger bietet auch einen gdbserver für jlink an. Mit dem kann man sogar 
über den gdb das Target flashen.


Gruß Oliver
#2597062
Lesenswert?

Servus ...

ich bekomme einen Linker fehler : cannot find -lgcc_s
Verwende Ubuntu mit CodeSourceryLite
Ich habe versucht manuell mit -L/... die Library einzubinden (bin mal 
alle pfade durchgegangen in denen ich libgcc_*.*) finden konnte aber 
ohne Erfolg.

Bin leider noch etwas wackelig auf den Füßen was dies Untiefen betrifft 
...

Gruß
Christoph


/usr/local/share/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none- 
linux-gnueabi/4.5.2/../../../../arm-none-linux-gnueabi/bin/ld:  cannot 
find -lgcc_s
/usr/local/share/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none- 
linux-gnueabi/4.5.2/../../../../arm-none-linux-gnueabi/bin/ld:  cannot 
find -lgcc_s
#2598466
Lesenswert?

nö nützt nichts. Auch nicht so wild ...

compilieren kann ich und mit stlink und gdb flashen und "debuggen" (ich 
komm mit gdb aber nicht zurecht).

Allerdings mach ich das auch unter MacOS mit der summon arm toolchain 
und auch nur fertige Beispiel Makefile-Projekte (z.B. die 
Stlink-Examples). Und eigentich auch für den F4. Selber das mal in eine 
IDE wie Eclipse zu bringen sodass es alles läuft, und am Ende dann noch 
ein eigenes Projekt erstellen, davon träume ich noch. Diese ganze STM32 
Geschichte entwickelt sich langsam zu einem Frustpaket (weil ich nicht 
unter Win programmieren will, bzw. keinen Windows Rechner habe).
#2599504
Lesenswert?

Hi
ich verwende dein Makefile unveändert aus dem Zip-Archiv.


Ich habe jetzt nochmal ganz von Vorne angefangen und Ubuntu neu 
installiert. Ich kann jetzt mit Eclipse + CodeSourcery + St-link 
arbeiten. :-) Soweit war ich noch auch noch nie...



jetzt habe ich einen anderen Fehler mit deinem Projekt:

/home/christoph/CodeSourcery/arm-2011.09/bin/../lib/gcc/arm-none-eabi/4. 
6.1/../../../../arm-none-eabi/lib/thumb2/libc.a(lib_a-sbrkr.o):  In 
function `_sbrk_r':
sbrkr.c:(.text+0x12): undefined reference to `_sbrk'
collect2: ld returned 1 exit status
make: *** [output/main.elf] Error 1
#2602323
Lesenswert?

Super :-)

wenn man mal davon absieht:

/tmp/ccxttmIa.s: Assembler messages:
/tmp/ccxttmIa.s:512: Error: registers may not be the same -- `strexb 
r0,r0,[r1]'
/tmp/ccxttmIa.s:537: Error: registers may not be the same -- `strexh 
r0,r0,[r1]'
make: *** [src/fw_lib/core_cm3.o] Error 1


Google hatte auch schnell eine Lösung
https://github.com/texane/stlink/issues/65

Damit geht es dann auch.

Nur wieso funktioniert es denn bei dir?


Auf das Board habe ich es noch nicht überspielt. Mal schauen wann ich 
dazu komme.

Gruß
Christoph
Gast #2660079
Lesenswert?

Hallo,

ich habe das Beispiel auf den STM32F207 angepasst. Das Compilieren und 
Linken funktioniert. Jetzt möchte ich mit dem IAR JLink Debugger über 
den GDB Server debuggen und auch flashen können. Welche Einstellungen 
müsste ich in Eclipse sowie im OpenOCD File vornehmen ?
#2660578
Lesenswert?

Hi,

Ich versuche gerade dein Beispiel auf einem stm32F103VET6 zum laufen zu 
bringen, bisher ohne Erfolg.

Was es Tut:
Es compiliert,
die *_init() sache werden noch ausgeführt (per LED getestet), aber kommt 
aus dem "xTaskCreate" nicht mehr zurück und führt auch keine Code in den 
Tasks aus.

Was ich bisher gemacht habe:
1)
#define STM32F10X_HD in einkommentiert, da es ja ein HD-Device ist.

2)
den inhalt der startup.s gegen den aus einer startup_stm32f10x_hd.s 
getauscht.
die FeeRTOS-spezifischen Änderungen (Umbenennungen der ISR-Vektoren des 
Systick-Timers etc.) habe ich aus deiner Version mitgenommen.
Die weak aliases waren auch in deiner Version unverändert.

Hab ich irgendwas übersehen?
#2661682
Lesenswert?

@ Oliver, danke für den Tip, aber das habe ich auch schon gemacht, nur 
vergessen zu erwähnen.

3)
Linkerscript wurde angepasst:
1
MEMORY
2
{
3
  RAM      (RWX) : ORIGIN = 0x20000000     , LENGTH = 64K
4
  FLASH    (RX)  : ORIGIN = 0x08000000     , LENGTH = 512K
5
  FLASHB1 (rx)  : ORIGIN = 0x00000000, LENGTH = 0
6
  EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0
7
  EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
8
  EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0
9
  EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0
10
}
11

12
/* higher address of the user mode stack */
13
_estack = ORIGIN(RAM)+LENGTH(RAM);
OP #2661981
Lesenswert?

Entwickler schrieb:
> bin leider noch nicht weitergekommen. Welche Einstellungen müsste ich
> vornehmen, damit ich mit dem JLink Debugger von IAR auf dem STM32F207
> debuggen kann ?

Das nutze ich als GDB-Init-Sequence für die JLinkExe von Segger als 
GDB-server:
1
monitor interface swd
2
monitor speed 4000
3
monitor endian little
4
monitor flash device = STM32F103RB
5
monitor flash breakpoints = 1
6
monitor flash download 1
7
load ./output/main.elf
8
monitor reset

Gruß Oliver
Gast #2662375
Lesenswert?

Wenn ich in Eclipse die Debug Konfiguation einstelle und den Button 
Debug drücke erscheint folgende Meldung:

Cannot run program "make" (in directory "C:\STM32\STM32F207_BLINK_LED"): 
CreateProcess error=2, Das System kann die angegebene Datei nicht finden
Error: Program "make" is not found in PATH
OP #2662433
Lesenswert?

Entwickler schrieb:
> Wie wird der GDB server in Eclipse konfiguriert ?
Bei mir gar nicht. Den starte ich immer über die Kommandozeile und 
einstellen braucht man beim Segger JlinkGDBServer (nicht JlinkExe) auch 
nichts. Bei mir wird alles über die Init Commands vom arm-none-linux-gdb 
aus eclipse heraus erledigt. Wie das geht hab ich dir bereits gezeigt.


Entwickler schrieb:
> Cannot run program "make" (in directory "C:\STM32\STM32F207_BLINK_LED"):
> CreateProcess error=2, Das System kann die angegebene Datei nicht finden
> Error: Program "make" is not found in PATH
Steht doch da wo das Problem liegt. Make kann nicht gefunden werden, 
weil der Installationsordner nicht in der PATH-Umgebungsvariable 
eingetragen ist.


Entwickler schrieb:
> Vielleicht kann mir da jemand genauer sagen was
> ich wo einstellen muss.

Im Bild1: dort muss bei application das elf-file eingetragen werden.

Im Bild2: Versuchen auf TCP 2331 einzustellen

Im Bild3: nur einen Haken bei Load Symbols und die Init-Sequenz in das 
obere
          Textfeld.

Dann brauchst du eigentlich nur noch vorm Debuggen den JlinkGDBServer in 
einer Konsole starten und es sollte funktionieren.

Gruß Oliver
Gast #2662477
Lesenswert?

Hallo Oliver J.,

ich habe jetzt versucht deine Angaben umzusetzen. Welche EXE Datei 
müsste ich starten ? Ich habe im IAR Programmverzeichnis folgende EXE 
Dateien die den IAR JLINK Debugger betreffen.

JLinkTCPIPServer.exe
JLinkSTM32.exe
JLinkConfig.exe
jlink.exe

Das mit dem make und der PATH Umgebungsvariable bereitet mir noch 
Probleme.
Wo muss ich dies einstellen ? in Eclipse ?
OP #2662911
Lesenswert?

Entwickler schrieb:
> Ich habe für das Debuggen kein make erzeugt. Deshalb verstehe ich auch
> nicht, warum ein make verlangt wird.
Eclipse führt bei mir standardmäßig ein make all aus vor dem Debug.
Nimm das Make hier:
http://gnuwin32.sourceforge.net/packages/make.htm

Entwickler schrieb:
> Den Segger JlinkGDBServer finde ich auf dem Rechner nicht. Muss diese
> Software noch zusätzlich heruntergeladen werden ?
http://www.segger.com/jlink-gdb-server.html

Entwickler schrieb:
> Das mit dem make und der PATH Umgebungsvariable bereitet mir noch
> Probleme.
> Wo muss ich dies einstellen ? in Eclipse ?

Das stellt man in Windows ein.


Gruß Oliver
Gast #2663008
Lesenswert?

Ich verwende den MinGW GCC.

Wie kann ich dies unterbinden, dass vor dem Debug make all ausgeführt 
wird ? Da ich MinGW GCC einsetze, wie kann ich dies in Eclipse 
einstellen, dass statt make all MinGW GCC gestartet wird ?
OP #2663256
Lesenswert?

Entwickler schrieb:
> Wie kann ich dies unterbinden, dass vor dem Debug make all ausgeführt
> wird ? Da ich MinGW GCC einsetze, wie kann ich dies in Eclipse
> einstellen, dass statt make all MinGW GCC gestartet wird ?
Was willst du denn mit dem MinGW wenn du für ARM kompilierst?
Weißt du auch nur ansatzweise, was du da tust?

Entwickler schrieb:
> So wie es aussieht kann ich mit dem JLink
> nicht auf mein Device zugreifen.
Der JLinkGDBServer scheint nicht zu laufen.


PS. Kauf dir lieber ne Fertiglösung, da braucht man so gut wie kein 
Hintergrundwissen. Installieren und fertig. Rowley Crossworks könnte 
eine Anlaufstelle sein.

Gruß Oliver
Gast #2663911
Lesenswert?

Hallo Oliver J., ich muss mich leider korrigieren.
Ich verwende kein MinGW GCC sondern CoudeSourcery für ARM. Es geht mir 
eigentlich nur um den JLink Debugger. Irgendwo habe ich was falsches 
bzw. vergessen einzustellen. Wo könnte bei mir noch das Problem liegen ?
Gast #2664973
Lesenswert?

Hallo Oliver J.,

ok vielen Dank. Das werde ich am Montag mal testen.

Dies bedeutet, dass zuerst der JLinkGDBServer.exe gestertet werden muss 
und im Anschluss in Eclipse dann die arm-none-eabi-gdb.exe.

Bye
Gast #2666008
Lesenswert?

Guten Morgen,

ich habe von SEGGER das Softwarepaket für den JLink GDB Server 
heruntergeladen und istalliert. Wenn ich die Datei JLinkGDBServer.exe 
ausführe, wird der JLInk Debugger von IAR auch erkannt. Nun starte ich 
in Eclipse im GDB Hardware Debugging die Datei arm-none-eabi-gdb.exe.
In der Konsole von Eclipse erscheint eine Warnung: warning: RMT ERROR : 
failed to get remote thread list. Ich kann den Code nicht starten. Der 
Debugger in Eclipse zeigt mir Thread [1] <main> (Supsend : User Request) 
0x0 an. Ich kann gar nicht debuggen.

C/C++ Application:
C:\STM32\STM32F207_BLINK_LED\output\main.elf

GDB Setup
GDB Command:
C:\CodesourceryARM\arm-2011.09\bin\arm-none-eabi-gdb.exe

Remote Target
JTAG Device: Generic TCP/IP
Hoast name or IP address: localhost
Port number: 2331

Initialization Commands:
monitor interface swd
monitor speed 5000
monitor endian little
monitor flash device = STM32F207IG
monitor flash breakpoints = 1
monitor reset

Load symbols
Use project binary:
STM32\STM32F207_BLINK_LED\output\main.elf
Angehängte Dateien:
Gast #2666024
Lesenswert?

Ich habe auch mal diese Kommandos benutzt:
monitor interface swd
monitor speed 1000
monitor endian little
monitor flash device = STM32F207IG
monitor flash breakpoints = 1
monitor flash download 1
load ./output/main.elf
monitor reset
monitor reg r13 = (0x00000000)
monitor reg pc = (0x00000004)
#after load:
monitor reset
continue
Gast #2666072
Lesenswert?

Wenn ich folgende Kommandos verwende:

>>set mem inaccessible-by-default off
>>monitor interface swd
>>monitor speed auto
>>monitor endian little
>>monitor flash device = STM32F207IG
>>monitor flash breakpoints = 1
>>monitor flash download 1
>>load ./output/main.elf
>>break main
>>monitor reg r13 = (0x00000000)
>>monitor reg pc = (0x00000004)
>>monitor reset
>>continue

erhalte ich folgende Meldung von Eclipse:

Error in final launch sequence
Failed to execute MI command:
-target-select remote localhost:2331

Error message from debugger back end:
localhost:2331: Ein Verbindungsversuch ist fehlgeschlagen, da die 
Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, 
oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host 
nicht reagiert hat.
OP #2666086
Lesenswert?

Entwickler schrieb:
> Warnung: warning: RMT ERROR :
> failed to get remote thread list.
Das kommt bei mir auch und das Debuggen funktioniert trotzdem.

Versuch es doch erst einmal über die Konsole. Wenn das dann 
funktioniert, dann kann man sich daran machen diese Geschichte in 
Eclipse zum Laufen zu bringen.

Den GDB-startest du so:
1
arm-none-eabi-gdb STM32\STM32F207_BLINK_LED\output\main.elf


Dann führe mal folgende Befehle im GDB-Commandline-Interface Zeile für 
Zeile aus:
1
target remote :2331
2
monitor interface swd
3
monitor speed 1000
4
monitor endian little
5
monitor flash device = STM32F207IG
6
monitor flash breakpoints = 1
7
monitor flash download 1
8
load ./output/main.elf
9
break main
10
monitor reset
11
continue

Mit Strg+c kannst du das Programm anhalten. Mit continue gehts weiter.


Entwickler schrieb:
> Error message from debugger back end:
> localhost:2331: Ein Verbindungsversuch ist fehlgeschlagen, da die
> Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat,
> oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host
> nicht reagiert hat.
Manchmal kann es helfen den Jlink auf der USB-Seite neu zu verbinden.

Gruß Oliver
Gast #2666160
Lesenswert?

Hi Oliver J.,

danke. Ich kann nun debuggen. Das ist schonmal super!

Ich meiner Applikation starte ich zunächst einen Task.
Der Task wird allerdings nur einmal angesprungen. Das verstehe ich nicht 
ganz.
1
/* Include STM32 Firmware Lib Headers */
2
#include "stm32f2xx.h"
3
#include "stm32_eval.h"
4

5
/* Scheduler include files. */
6
#include "FreeRTOS.h"
7
#include "task.h"
8
#include "croutine.h"
9

10
// Function Declarations
11
int main(void);
12
void vLeds(void* dummy);
13

14
unsigned int retTaskCreate=0;
15

16
/* Main function */
17
int main(void)
18
{
19
  STM_EVAL_LEDInit(LED1);
20
  STM_EVAL_LEDInit(LED2);
21
  STM_EVAL_LEDInit(LED3);
22

23
  STM_EVAL_LEDOn(LED1);
24
  STM_EVAL_LEDOn(LED2);
25

26
  retTaskCreate = xTaskCreate(vLeds,(signed char*)"Led",100,0,10,0);
27

28
  vTaskStartScheduler();
29

30
  /* Here the devil lives */
31
  while(1)
32
  {
33
    STM_EVAL_LEDOn(LED3);
34
  }
35
    return 0;
36
}
37

38
/* Controls 4 LEDs (chaser light) */
39
void vLeds(void* dummy)
40
{
41
  STM_EVAL_LEDOff(LED1);
42
  STM_EVAL_LEDOff(LED2);
43
  vTaskDelay(500);
44
  STM_EVAL_LEDOn(LED1);
45
  STM_EVAL_LEDOn(LED2);
46
}
OP #2666401
Lesenswert?

Entwickler schrieb:
> void vLeds(void* dummy)
> {
>   STM_EVAL_LEDOff(LED1);
>   STM_EVAL_LEDOff(LED2);
>   vTaskDelay(500);
>   STM_EVAL_LEDOn(LED1);
>   STM_EVAL_LEDOn(LED2);
> }

Da fehlt die Endlosschleife.
1
void vLeds(void* dummy)
2
{
3
   while(42) {
4
     STM_EVAL_LEDOff(LED1);
5
     STM_EVAL_LEDOff(LED2);
6
     vTaskDelay(500);
7
     STM_EVAL_LEDOn(LED1);
8
     STM_EVAL_LEDOn(LED2);
9
   }
10
}

Gruß Oliver
#2668360
Lesenswert?

Hi,

hab inzwischen zum laufen bekommen.

Es lag nich an deinem Paket Oliver, sonder vermutlich an meiner 
toolchain.

Ich verwende die summon-arm-toolchain, mit der ich bisher gute 
Erfahrungen gemacht habe (bisher = ohne FreeRTOS).

Ich hab den Fehler soweit zurückverfolgen können: Er springt beim 
Starten der Tasks in den HardFault_Handler.
Beheben konnte ich das Verhalten, in dem ich den Aufruf der strncpy 
funktion aus der <string.h> durch das RTOS durch eine einfache selbst 
implementierte Version von strncpy ersetzt habe. (strncpy wird verwendet 
um den Task-Name zu kopieren).

Warum die Nutzung einer Funktion aus <string.h> einen Hard-Fault 
auslößt: keine Ahnung. Vielleicht kann das jemand anders beantworten.

Danke Oliver für das onlinstellen deines Minimaldemos!
OP #2668723
Lesenswert?

Andreas R. schrieb:
> Warum die Nutzung einer Funktion aus <string.h> einen Hard-Fault
> auslößt: keine Ahnung. Vielleicht kann das jemand anders beantworten.

Ein ähnliches Problem hatte ich Anfangs auch. Und zwar blieb bei mir 
auch jedes mal das System im Hardfault-Handler hängen. Der Grund war, 
dass der Linker die 32-Bit arm-Code-Variante von strcpy gelinkt hatte. 
Der Fehler lag natürlich bei mir. Ein Cortex-M kann ja bekanntlich nur 
Thumb(2)-Code ausführen, sodass er sich an 32-Bit-Code die Zähne 
ausbeißt.

Einen solchen Fehler kann man leicht finden, indem man sich mal das 
Assembler-Listing ansieht: Wenn in der Spalte mit den hex-kodierten 
Befehlen bei strcpy etwas auftritt, was 32 Bit breit ist, dann wurde 
wahrscheinlich nicht die Thumb-Version gelinkt.

Gruß Oliver
Gast #2676734
Lesenswert?

Hi, letzte Woche hatte ich den Debugger zum Laufen gebracht. Nun ist es 
allerdings so, dass es Probleme mit dem GDB Debugger gibt.

Disassembly in Eclipse:

00000000:   Failed to execute MI command:
          -data-disassemble -s 0 -e 76 -- 1
          Error message from debugger back end:
          Cannot access memory at address 0x0

Was könnte da die Ursache für dieses Fehlverhalten sein ?
Gast #2676761
Lesenswert?

Ich verstehe das einfach nicht. Warum funktioniert plötzlich der GDB 
Debugger nicht mehr. Vor jedem debuggen starte ich manuell die Software 
"JLinkGDBServer.exe".

Wenn sich jemand mit dieser Fehlermeldung auskennt, wäre ich sehr 
dankbar für die Unterstützung.
Gast #2788680
Lesenswert?

Hallo Oliver J.,

ich habe ein Evaluationboard von STMicroelectronics "STM32VLDISCOVERY" 
mit dem STM32F100 Mikrocontroller.
Link: http://www.st.com/internet/evalboard/product/250863.jsp

Eclipse sowie Codesourcery habe ich laut dieser Anleitung installiert.
Link: 
http://www.chibios.org/dokuwiki/doku.php?id=chibios:guides:eclipse1

Ich habe nun das FreeRtos Projekt heruntergeladen und mit Eclipse habe 
ich das Projekt geöffnet. Den Link habe ich bei CROSS_COMPILE auch 
angepasst.
Wie kann ich nun in Eclipse das Projekt kompilieren ? Ich finde kein 
MakeTarget.

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