Forum: Mikrocontroller und Digitale Elektronik STM32VL-Discovery & printf


von An S. (an_s)


Lesenswert?

Hallo zusammen,

bin noch recht neu was mikrocontroller und deren programmierung angeht. 
Jedoch scheitere ich schon an der einfachen ausgabe von zeichen auf die 
konsole. Hier mein mini-programm:
1
  #include <stdio.h>
2
3
  int main()
4
  {
5
     printf("hello world\n");
6
  }

Und hier geht was beim linken schief:
1
       [cc] Starting link
2
       [cc] arm-none-eabi-gcc -O0 -nostartfiles -Wl,-Map=Print1.map -mcpu=cortex-m3 -mthumb -LC:\CooCox\CoIDE\workspace\Print1 -Wl,--gc-sections -Wl,-TC:\CooCox\CoIDE\workspace\Print1\link.ld -g -o Print1.elf ..\obj\startup_stm32f10x_md_vl.o ..\obj\core_cm3.o ..\obj\system_stm32f10x.o ..\obj\stm32f10x_pwr.o ..\obj\stm32f10x_gpio.o ..\obj\main.o ..\obj\stm32f10x_rcc.o ..\obj\stm32f10x_usart.o ..\obj\maiin.o
3
       [cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-sbrkr.o): In function `_sbrk_r':
4
       [cc] sbrkr.c:(.text+0xc): undefined reference to `_sbrk'
5
       [cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-writer.o): In function `_write_r':
6
       [cc] writer.c:(.text+0x10): undefined reference to `_write'
7
       [cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-closer.o): In function `_close_r':
8
       [cc] closer.c:(.text+0xc): undefined reference to `_close'
9
       [cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-fstatr.o): In function `_fstat_r':
10
       [cc] fstatr.c:(.text+0xe): undefined reference to `_fstat'
11
       [cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-isattyr.o): In function `_isatty_r':
12
       [cc] isattyr.c:(.text+0xc): undefined reference to `_isatty'
13
       [cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-lseekr.o): In function `_lseek_r':
14
       [cc] lseekr.c:(.text+0x10): undefined reference to `_lseek'
15
       [cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-readr.o): In function `_read_r':
16
       [cc] readr.c:(.text+0x10): undefined reference to `_read
17
       [cc] '
18
       [cc] collect2: ld returned 1 exit status


Ich programmiere mit coide von coocox, welches sich ja um die passenden 
linker-skripte etc. pp. kümmern sollte. Was also mache ich falsch und 
wie kann ich es beheben?

Grüße

von Jan H. (jan_h74) Flattr this


Lesenswert?

Und nach was soll "printf() dan etwas ausspucken ? Ist nirgendwo 
definiert. Printf() ist auch keine Standardfunction in <stdio.h>. 
Bestimmte compiler haben da selbst eine lib definiert, aber bei diesen 
bin ich unbekannt.
sprintf() ist well definiert, aber macht nur eine String aus text/ 
variabele. Zweitens muss diese String dan an USART oder etwas anderes 
uebergeben werden.

von Oliver J. (skriptkiddy)


Lesenswert?


von An S. (an_s)


Lesenswert?

Jan H. schrieb:
> Und nach was soll "printf() dan etwas ausspucken ? Ist nirgendwo
> definiert.

Als Test soll printf erst einmal "Hello World" auf die Console der IDE 
ausspucken.

> sprintf() ist well definiert, aber macht nur eine String aus text/
> variabele. Zweitens muss diese String dan an USART oder etwas anderes
> uebergeben werden.

Mit USART habe ich mich noch nicht beschäftigt. Ist es generell möglich, 
dass das Board einen String an die Konsole der iDE ausgibt oder muss das 
generell über USART geschehen und mit einem Terminal am PC abgefangen 
werden?

Grüße

von Thomas W. (diddl)


Lesenswert?

Nicht jeder JTAG unterstützt Ausgabe auf die Console der IDE. CooCox 
verwendet weitgehend die standard Header dateien von ST.

Man kann printf() ganz leicht auf einen der USART umleiten. Am USART 
habe ich eine USB bridge und gehe damit auf den PC. Wenn man es ganz gut 
machen will, wickelt man die Ausgabe und Eingabe vom USART noch über 
Interrupt und Ringbuffer ab. Dann entstehen keine unerwünschten 
Wartezeiten durch die Ausgabe über printf().

Alternativ könnte man den USB anprogrammieren und einen virtuellen COM 
Port zum PC schaffen. Ich halte das jedoch für unnötigen overhead im 
Code, mir gefällt die USART Lösung einfach viel besser.

von Dr. Sommer (Gast)


Lesenswert?

Thomas Winkler schrieb:
> Ich halte das jedoch für unnötigen overhead im
> Code, mir gefällt die USART Lösung einfach viel besser.
Na printf() kann man ja auch elegant dahin umleiten... Klar geht mehr 
"Leistung" für das USB-Zeug drauf, dafür kann man aber auch schneller 
übertragen ;-)

An S. schrieb:
> Als Test soll printf erst einmal "Hello World" auf die Console der IDE
> ausspucken.
Das geht nicht, wie gesagt musst du die Übertragung selber basteln, ob 
per UART, USB oder was andrem...

von An S. (an_s)


Lesenswert?

Oliver J. schrieb:
> https://sites.google.com/site/stm32discovery/open-...
>
> Gruß Oliver

Ich habe mal das Tutorial zum Aufsetzen von Eclipse + CodeSourcery 
durchprobiert (mehrfach) und bekomme beim kompilieren des Beispiels 
immer folgenden Fehler:
1
15:30:13 **** Incremental Build of configuration Debug for project Template ****
2
make all 
3
C:\Program: C:\Program: No such file or directory
4
make: *** [std_src/misc.o] Error 127

Ich habe CodeSourcery bzw. alle anderen Programmteile in Ordnern liegen, 
die kein Leerzeichen enthalten (nicht mal den Teil "Program").
Weiterhin habe ich die Anweisungen von 
Beitrag "Re: Was will Eclipse von mir? - Vollständiges Log" befolgt (weiß jedoch 
nicht, was er mit ProgramFiles und USBProg meint; ProgramFiles ist bei 
mir nicht gesetzt). Hilft nichts, selber Fehler.

von An S. (an_s)


Lesenswert?

NACHTRAG:

Ich habe mal die newlib_stubs.c Datei in dem Unterordner 'src' angelegt. 
Beim Kompilieren kommt jedoch der Fehler:
1
       [cc] Starting link
2
       [cc] arm-none-eabi-gcc -O0 -nostartfiles -Wl,-Map=Print1.map -mcpu=cortex-m3 -mthumb -LC:\CooCox\CoIDE\workspace\Print1 -Wl,--gc-sections -Wl,-TC:\CooCox\CoIDE\workspace\Print1\link.ld -g -o Print1.elf ..\obj\startup_stm32f10x_md_vl.o ..\obj\core_cm3.o ..\obj\system_stm32f10x.o ..\obj\newlib_stubs.o ..\obj\stm32f10x_pwr.o ..\obj\stm32f10x_gpio.o ..\obj\main.o ..\obj\stm32f10x_rcc.o ..\obj\stm32f10x_usart.o
3
       [cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/armv7-m\libgcc.a(unwind-arm.o): In function `get_eit_entry':
4
       [cc] unwind-arm.c:(.text+0x144): undefined reference to `__exidx_start'
5
       [cc] unwind-arm.c:(.text+0x148): undefined reference to `__exidx_end'
6
       [cc] collect2: ld returned 1 exit status

Daher habe ich mal versucht Code-Rümpfe in newlib_stubs.c anzulegen:
1
int _start(){
2
  return 1;
3
}
4
5
int _end(){
6
  return 1;
7
}

Mit dem selben Ergebnis. In CoIDE kann man im Repository Fenster das 
Paket 'C Library' wählen, welches die Datei 'syscalls.c' im Unterordner 
syscalls anlegt. Da kommt es jedoch zur selben Fehlermeldung, wie mit 
newlib_stubs.c

von Oliver J. (skriptkiddy)


Lesenswert?

Diese Referenzen kommen eigentlich vom Linksskript.

von An S. (an_s)


Lesenswert?

In CoIDE wird das Linkskript ja automatisch angelegt, nachdem man seinen 
Mikrokontroller ausgewählt hat. Komischerweiße funktioniert das 
Linkskript ohne Probleme bei Sourcecode, welches kein iprintf() / 
printf() enthält.
Wenn ich die Zeile
1
iprintf("Greeting Earthlings");

auskommentiere, wird das binary ordentlich erstellt.

Das Linkerskript enthält:
1
OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
2
SEARCH_DIR(.)
3
INCLUDE "memory.ld"
4
5
/* Section Definitions */ 
6
SECTIONS 
7
{ 
8
    .text : 
9
    { 
10
        KEEP(*(.isr_vector .isr_vector.*)) 
11
        *(.text .text.* .gnu.linkonce.t.*)         
12
        *(.glue_7t) *(.glue_7)                    
13
        *(.rodata .rodata* .gnu.linkonce.r.*)                            
14
    } > rom
15
    
16
    .ARM.extab : 
17
    {
18
        *(.ARM.extab* .gnu.linkonce.armextab.*)
19
    } > rom
20
    
21
    .ARM.exidx :
22
    {
23
        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
24
    } > rom
25
    
26
    . = ALIGN(4); 
27
    _etext = .;
28
    _sidata = .; 
29
        
30
    .data : AT (_etext) 
31
    { 
32
        _sdata = .; 
33
        *(.data .data.*) 
34
        . = ALIGN(4); 
35
        _edata = . ;
36
    } > ram
37
38
    /* .bss section which is used for uninitialized data */ 
39
    .bss (NOLOAD) : 
40
    { 
41
        _sbss = . ; 
42
        *(.bss .bss.*) 
43
        *(COMMON) 
44
        . = ALIGN(4); 
45
        _ebss = . ; 
46
    } > ram
47
    
48
    /* stack section */
49
    .co_stack (NOLOAD):
50
    {
51
        . = ALIGN(8);
52
        *(.co_stack .co_stack.*)
53
    } > ram
54
       
55
    . = ALIGN(4); 
56
    _end = . ; 
57
}

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.