STM32F4 printf bleibt hängen

Gast #2481661
Lesenswert?
• ▲
▼
Hallo zusammen!

Ich bin gerade dabei mich mit dem STM32 einzuarbeiten und verwende 
hierfür:

STM32F4 Discovery
Eclipse
Codesourcery G++ Lite
OpenOCD 0.5.0 mit dem Luminary ICD Board
newlib_stubs von: 
https://sites.google.com/site/stm32discovery/open-source-development-with-the-stm32-discovery/getting-newlib-to-work-with-stm32-and-code-sourcery-lite-eabi

Das erste Programm läuft bereits, allerdings mit folgendem seltsamen 
Phänomen:

printf bleibt hängen, wenn das Programm ohne Debugger ausgeführt wird 
(flashen über ST-Link + Reset).

Wenn ich das Programm vom ICD-Debugger ausflashe und starte dann klappt 
alles und es wird über die UART gesendet. Nachdem ich dann aber das 
Board resette bleibt es wieder hängen.

Da ich über den Debugger dann aber trotzdem den Programcounter auslesen 
kann, konnte ich folgende Stelle ausmachen an welche das Programm hängt:

newlib_stubs.c in funktion "int _write(int file, char *ptr, int len)":

while((USART1->SR & USART_FLAG_TC) == (uint16_t)RESET) {}

Hat jemand eine Idee was hier schief läuft???
(Programm funktioniert über Debugger, aber bleibt ohne Debugger in 
printf hängen)

gdb-script für OpenOCD:

set complaints 1
set output-radix 16
set input-radix 16
set prompt (arm-gdb)
set remote memory-write-packet-size 1024
set remote memory-write-packet-size fixed
set remote memory-read-packet-size 1024
set remote memory-read-packet-size fixed
set remote hardware-watchpoint-limit 6
set remote hardware-breakpoint-limit 6
monitor reset
monitor sleep 200
monitor poll
monitor soft_reset_halt
monitor flash write_image 
"${workspace_loc:/Template/Debug/Template.bin}" 0x08000000 bin

Vielen Dank im Voraus,
Mike
Gast #2481879
Lesenswert?
• ▲
▼
Das "printf()" ist keine Standard function in die Standard C Library. 
Bei den IAR compiler wird das ueber eine Sonder-lib in compiler gemacht. 
Da wird dan einen sogenannte "Library configurator" eingestellt.
In program steht dan bei mir :
1
#ifdef __GNUC__
2
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
3
     set to 'Yes') calls __io_putchar() */
4
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
5
#else
6
  //#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
7
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE*f)
8
#endif /* __GNUC__ */
9
PUTCHAR_PROTOTYPE   //in main achteraan
10
{
11
  /* Place your implementation of fputc here */
12
  /* e.g. write a character to the USART */
13
  USART_SendData(USART1, (uint8_t) ch);
14

15
  /* Loop until the end of transmission */
16
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
17
  {}
18

19
  return ch;
20
}
Suche mal aus wie diese printf() bei ihre compiler eingebunden ist.
Gast #2481999
Lesenswert?
• ▲
▼
Hallo

Vielen Dank für Eure Antworten!

tip schrieb:
> stack vergrößern?

habe ich gemacht, bringt aber leider nichts

Matthias K. schrieb:
> boot0 und boot1 richtig gesetzt?

Das Programm an sich läuft ja, es bleibt nur an der besagten Stelle 
hängen, wenn es nicht über den Debugger sondern über einen Reset 
gestartet wird.

RP6Conrad schrieb:
> IAR compiler wird das ueber eine Sonder-lib in compiler gemacht

Ich verwende den Codesourcery Compiler mit newlib.
printf funktioniert auch wenn das Programm über den Debugger gestartet 
wird.
Gast #2482352
Lesenswert?
• ▲
▼
Hallo User...

Nicht kaputt, aber es wird nicht aufgerufen wie ich gerade gesehen 
habe..

main(void) {
  GPIOInit();
  USARTInit();
  while(1) {
    printf("abc");
    delay();
  }
}

GPIOInit wird nicht verlassen - lasse zu debugzwecken davor und danach 
LEDs setzen - die danach werden nicht gesetzt.

Möglich dass mir innerhalb von GPIOInit etwas einen ASSERT wirft.

Trotzdem wundert es mich warum das Programm in while(1) springt und das 
ganze mit dem Debugger auch funktioniert.. Das Binary welches 
aufgespielt wird ist ja dasselbe..

Werde morgen weitermachen und kurz das Ergebnis Posten.

Viele Dank!!

Mike

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.