Forum: Mikrocontroller und Digitale Elektronik mspgcc: Problem mit puts()


von Tobias (Gast)


Lesenswert?

Hallo!

Ich habe mir die Entwicklungsumgebung mit Eclips und dem mspgcc 
eingerichtet. Die ersten Programme laufen auch schon auf dem 
MSP430f1232.
Jetzt möchte ich gern über das JTAG-Interface (Parallelport) Ausgaben 
per puts(), oder printf() an den PC schicken.
Ich bekomme aber vom Linker die unten stehende Fehlermeldung. Kann mir 
bitte jemand weiter helfen. Muss ich eine andere Lib einbinden???

Vielen Dank für Eure Hilfe!

Gruß Tobias

C-Code:
1
#include <msp430x12x2.h>
2
#include <stdio.h>
3
#include <string.h>
4
5
int main(void){
6
  int n = 0;
7
  char* String = "Hallo";
8
  
9
  n = strlen(String);
10
  puts(String);
11
  
12
13
  WDTCTL = WDTPW + WDTHOLD;  // watchdog ausschalten
14
  
15
  P1SEL &= ~ 0x0F;      // Port1 I/O Funktion
16
  P1DIR |=  0x0F;        // Port1 Ausgang
17
  P1OUT &= ~0x0F;        // Port1 auf 0
18
  
19
  P1OUT |= 0x0F;
20
  
21
  puts("Hallo");
22
23
  while(1){ 
24
    P1OUT ^= 0x01;
25
    }
26
  
27
  return 0;  
28
}


Konsolenausgabe:
**** Incremental build of configuration Debug for project Projekt1 ****

make -k all
Building file: ../projekt1.c
Invoking: mspgcc GCC C Compiler
msp430-gcc -IC:\Programme\mspgcc\msp430\include -O0 -g3 -Wall -c 
-fmessage-length=0 -mmcu=msp430x1232 -oprojekt1.o ../projekt1.c
Finished building: ../projekt1.c

Building target: Projekt1
Invoking: mspgcc GCC C Linker
msp430-gcc -mmcu=msp430x1232 -oProjekt1 ./projekt1.o
/cygdrive/c/Programme/mspgcc/bin/../lib/gcc-lib/msp430/3.2.3/../../../.. 
/msp430/lib/msp1/libc.a(puts.o):  In function `puts':
/f/prog/msp430/sf/packaging/build/msp430-libc/src/stdlib/puts.c:31: 
undefined reference to `putchar'
/f/prog/msp430/sf/packaging/build/msp430-libc/src/stdlib/puts.c:33: 
undefined reference to `putchar'
make: *** [Projekt1] Error 1
make: Target `all' not remade because of errors.
Build complete for project Projekt1

von Uhu U. (uhu)


Lesenswert?

Kopfkratz... Bist Du sicher, daß Du über das JTAG-Interface Daten auf 
den PC ausgeben kannst?

Ich vermute, daß das eher nicht geht - lasse mich aber gern vom 
Gegenteil überzeugen.

Üblicherweise steckt putchar in der C-Bibliothek, wie z.B. strlen und 
ähnliche Kandidaten auch.

Wenn der Linker sie nicht findet, dann existiert sie wohl auch nicht - 
was mich allerdings auch nicht im Geringsten wundern würde, denn putchar 
ruft üblicherweise eine Betriebssystemfunktion auf, die dafür sorgt, daß 
das Zeichen auch tatsächlich auf stdout ausgegeben wird.

Nur: Wenn kein Betriebssystem da ist - wie auf jedem nackten µC - dann 
kann man auch keine Betriebssystemfunktion aufrufen und folglich ist es 
auch nicht besonders lohnend, putchar in die C-Lib für den MSP430 zu 
packen.

putchar gibt ein einzelnes Zeichen auf stdout aus und wird von puts für 
jedes Zeichen im String aufgerufen.

Du kannst Dir putchar selbst schreiben - die wird dann von puts 
aufgerufen.

Allerdings mußt Du in Deiner putchar definieren, was mit dem Zeichen 
geschehen soll - Du hast alle Freiheiten, bist aber auch für alles 
selbst verantwortlich.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Oh, prinzipiell ist so etwas möglich.

Der kommerzielle C-Compiler "Rowley Crossworks for MSP430" bietet für 
Debugausgaben über das JTAG-Interface eigene Funktionen an (deklariert 
in cross_studio_io.h), auch bei IAR meine ich derartiges gesehen zu 
haben.

Allerdings sind das nicht die normalen printf/puts/etc.-Funktionen, 
sondern spezielle Debug-IO-Funktionen, aber inhaltlich läuft's ja auf 
dasselbe hinaus.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nun, bei den beiden von mir angesprochenen kommerziellen 
Entwicklungsumgebungen existiert dieses "Etwas" - nämlich der Debugger.

Ist so etwas bei Gdb/Insight etwa nicht vorgesehen?

von Christian R. (supachris)


Lesenswert?

Also per normalem Programmcode geht das nicht, da der MSP430 von "innen 
heraus" keinen zugriff auf das JTAG Interface hat. Teure kommerzielle 
Compiler machen das, aber das geht dann rein über die Debugging-Logik. 
Für den GCC/GDB hab ich sowas noch nich gesehn. Eventuell gehts mit 
stadout, aber aufm MSP430 hab ich´s noch nicht zum laufen bekommen. 
Müsste man mal im MSPGCC Entwickler Forum auf SF nachfragen....

Die Puts() oder Printf() Funktion ist vorgesehn, um per _selbst zu 
definierender_ Funktion PutChar() Zeichen z.B. über die serielle 
Schnittstelle zu senden. Oder über ein anderen beliebiges 
Kommunikationsinterface des MSP, nicht aber über JTAG.

von Uhu U. (uhu)


Lesenswert?

> Teure kommerzielle Compiler machen das, aber das geht dann rein über
> die Debugging-Logik.

D.h., der Debugger müßte ständig einen speziellen 
Debug-Ausgabe-Speicherbereich im MSP inspizieren, ob neue Debugausgaben 
da sind - das würde aber einen Ablauf des Programmes in Echtzeit 
verhindern, da der MSP für solche Polls jeweils in den Debug-Modus 
umgeschaltet werden muß, d.h. angehalten wird.

Eine andere Möglichkeit wäre, einen Hardware-Breakpoint zu diesem Zweck 
zu mißbrauchen - aber der fehlt dann wieder irgendwo anders. Zudem haben 
die kleinen MSPs mit dem SpyBiWire sowieso nur einen einzigen 
HW-Breakpoint...

Da sollte man doch besser den UART für solche Zwecke benutzen.

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.