Forum: Mikrocontroller und Digitale Elektronik Assembler und C zusammen mit msp430-gcc kompilieren


von Jan L. (janl)


Lesenswert?

Hallo,

ich suche schon seit einiger Zeit nach einer Lösung für das Problem, 
dass der GNU Compiler mit einem Fehler abbricht:

Meine Assembler -Datei (set_port.s):
1
#include "msp430g2553.h"
2
.text
3
.global set_port
4
set_port:
5
    xor.b    #01h, &P1OUT    ; funktioniert nicht, P1OUT ist aber in Header definiert
6
    ; xor.b    #01h, 0x0021    ; funktioniert (P1OUT = 0x0021)
7
    ret
8
.end

Meine C -Datei (main.c):
1
#include "msp430g2553.h"
2
3
extern void set_port(void); 
4
5
void main( void )
6
{
7
    IFG1 = 0;                    /* clear interrupt flag1 */
8
    WDTCTL = WDTPW+WDTHOLD;      /* stop WD */
9
    P1DIR = 0x01;
10
  
11
    while(1)
12
        set_port();      /* Aufruf der Assembler -Methode */
13
}

Meine Compiler -Anweisung:
1
msp430-gcc -mmcu=msp430g2553 -o main.elf set_port.s main.c

Ich komme auf keinen grünen Zweig, die Ausgabe lautet:
1
/var/folders/wn/0gqrzq_53fg904dc7fk0bmcc0000gp/T//cc3LO8NK.o: In function `set_port':
2
(.text+0x2): undefined reference to 'P1OUT'
3
collect2: ld gab 1 als Ende-Status zurück

Ich habe den Code (ähnlich) unter IAR Embedded für Windows getestet, 
dort funktioniert der Mix einwandfrei... hier unter Mac OS X sowie unter 
Ubuntu klappt es einfach nicht.

Vielleicht findet sich ja jemand, der sich damit auskennt oder ein 
ähnliches Problem gelöst hat.

Vielen Dank im Voraus!
Jan

: Bearbeitet durch User
von Roland E. (roland0815)


Lesenswert?

Da ich aktuell nur mit dem IAR arbeite...

Kann das sein, dass das '&' vor dem P1OUT zu viel ist?

Edit: Ja ich denke, das '&' ist zu viel.

: Bearbeitet durch User
von Jan L. (janl)


Lesenswert?

Danke für die schnelle Antwort!

Das Weglassen des '&' vor dem P1OUT bringt leider nichts, der Fehler 
besteht weiterhin.

von hp-freund (Gast)


Lesenswert?

Jan L. schrieb:
> undefined reference to

Das deutet darauf hin das zwar die .h benutzt wird, aber die passende 
lib bzw. .c Datei nicht gefunden wird.

Kenne mich aber mit den msp430 nicht aus.
Gibt es auch eine msp430g2553.c?

Wenn nicht muss P1OUT neben dem Vorkommen in der .h auch in einer lib zu 
findes sein. Die musst Du dann einbinden...

von Jan L. (janl)


Lesenswert?

hp-freund schrieb:
> Gibt es auch eine msp430g2553.c?

Nein, die gibt es nicht. 'msp430g2553.h' enthält ja auch nur 
Definitionen und keinen Code.

Es ließe sich ja auch eine andere (einzeilige) Header -Datei verwenden 
wie z.B. myHeader.h:
1
#define P1OUT    0x0021

Meine angepasste Assembler -Datei (set_port.s):
1
#include "myHeader.h"
2
.text
3
.global set_port
4
set_port:
5
    xor.b    #01h, &P1OUT    ; funktioniert nicht, P1OUT ist aber in Header definiert
6
    ; xor.b    #01h, 0x0021    ; funktioniert (P1OUT = 0x0021)
7
    ret
8
.end

Der Fehler bleibt bestehen, als würde das '#include' vollständig 
ignoriert werden.

: Bearbeitet durch User
von hp-freund (Gast)


Lesenswert?

Müsste das nicht:

.include sein?

von Jan L. (janl)


Lesenswert?

hp-freund schrieb:
> Müsste das nicht:
>
> .include sein?

Habe ich auch bereits getestet, gleicher Fehler. Unter IAR Workbench 
kompiliert es übrigens mit '#include'.

von hp-freund (Gast)


Lesenswert?

Bleibt noch .s gegen .S Endung zu tauschen.

von Jan L. (janl)


Lesenswert?

hp-freund schrieb:
> Bleibt noch .s gegen .S Endung zu tauschen.

Gleicher Fehler. Es ist zum verzweifeln...

von hp-freund (Gast)


Lesenswert?

Benutzt Du ein Makefile?

von Jan L. (janl)


Lesenswert?

hp-freund schrieb:
> Benutzt Du ein Makefile?

Nein, nur die Anweisung:
1
msp430-gcc -mmcu=msp430g2553 -o main.elf set_port.s main.c

von hp-freund (Gast)


Lesenswert?

Da sehe ich - wie der Compiler - auch keine lib ;-)
Häng mal

[c]
-lc
[/]

an.

von hp-freund (Gast)


Lesenswert?

Schuldigung. Richtig:

Da sehe ich - wie der Compiler - auch keine lib ;-)
Häng mal
1
-lc

an.

von Jan L. (janl)


Lesenswert?

Ausgabe:
1
msp430-gcc -mmcu=msp430g2553 -lc -o main.elf set_port.s main.c
2
/var/folders/wn/0gqrzq_53fg904dc7fk0bmcc0000gp/T//ccQBt9mh.o: In function `set_port':
3
(.text+0x2): undefined reference to `P1OUT'
4
collect2: ld gab 1 als Ende-Status zurück

von hp-freund (Gast)


Lesenswert?

-lc ganz nach hinten bitte.

von Jan L. (janl)


Lesenswert?

Ausgabe:
1
msp430-gcc -mmcu=msp430g2553 -o main.elf set_port.s main.c -lc
2
/var/folders/wn/0gqrzq_53fg904dc7fk0bmcc0000gp/T//ccqImfIB.o: In function `set_port':
3
(.text+0x2): undefined reference to `P1OUT'
4
collect2: ld gab 1 als Ende-Status zurück

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nur mal am Rande gefragt:

Welchen Sinn hat es, "setport" in Assembler zu schreiben? Hat das mit 
dem Glauben zu tun, der Compiler würde einen Schreibzugriff auf ein 
Register weniger effizient durchführen als es in handgeklöppeltem 
Assembler möglich ist?

von hp-freund (Gast)


Lesenswert?

Dann bleibt noch mein letzter Satz von 11:19

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

hp-freund schrieb:
> Schuldigung. Richtig:
>
> Da sehe ich - wie der Compiler - auch keine lib ;-)
> Häng mal
>
>
1
 -lc
>
> an.

Was sollen solche unsinnigen Ratschläge? P1OUT ist wohl kaum in der libc 
definiert...

Frage ist: Wo wird P1OUT definiert?
In msp430g2553.h?
Funktioniert der Header sowohl for Assembler als auch für C?

--> Definition von P1OUT suchen und rausfinden, warum die nicht vom 
Präprozessor erseztzt wird.

Das Präprozessierte Assembler file von foo.S ist foo.s und vorausgesetzt 
man hat ein OS wo foo.S und foo.s nicht die gleiche Datei bezeichnet :-)

Besser Endung .sx verwenden oder falls einem das nicht gefällt .asm 
zusammen mit -x assembler-with-cpp.

von Jan L. (janl)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Nur mal am Rande gefragt:
>
> Welchen Sinn hat es, "setport" in Assembler zu schreiben?

Gar keinen, es ging einfach darum, dass es sich nicht kompilieren ließ. 
Da ist es doch egal was der Code wann, wo, und wie gut macht.


Johann L. schrieb:
> Besser Endung .sx verwenden oder falls einem das nicht gefällt .asm
> zusammen mit -x assembler-with-cpp.

Das war's :-) set_port.s nach set_port.sx umbenannt und es funktioniert:
1
#include "myHeader.h"
2
.text
3
.global set_port
4
set_port:
5
    xor.b    #01h, &P1OUT   
6
    ret
7
.end
1
msp430-gcc -mmcu=msp430g2553 -o main.elf set_port.sx main.c

TAUSEND DANK an alle!! Das hat mich einiges an Nerven gekostet.

von Roland E. (roland0815)


Lesenswert?

versuch mal

include <msp430g2553.h>

Mich deucht mir war da was mit ".." für lokal und <..> für global zu 
suchende Inkludes.

Ansonsten noch die msp430.h inkludieren. Die holt normalerweise alle 
anderen nötigen nach.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Roland Ertelt schrieb:
> Ansonsten noch die msp430.h inkludieren.

Nicht noch, nur. Der verwendete genaue Prozessortyp sollte über ein 
#define bzw. als Compileroption festgelegt werden, und das wiederum legt 
fest, welche Dateien in msp430.h eingebunden werden.

So ist's bei IAR, und so sollte es auch bei msp430-gcc sein.

von Jan L. (janl)


Lesenswert?

1
#include <msp430g2553.h>
funktioniert auch prächtig (warum auch nicht),
1
#include <msp430.h>
hingegen produziert wieder Fehler:
1
/usr/local/msp430-uniarch-20110716/lib/gcc/msp430/4.5.3/../../../../msp430/include/msp430.h: Assembler messages:
2
/usr/local/msp430-uniarch-20110716/lib/gcc/msp430/4.5.3/../../../../msp430/include/msp430.h:22: Error: unknown opcode `typedef'
3
/usr/local/msp430-uniarch-20110716/lib/gcc/msp430/4.5.3/../../../../msp430/include/msp430.h:24: Error: junk at end of line, first unrecognized character is `,'
4
...

IAR scheint wesentlich komfortabler zu sein.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Hmm. Dann enthält wohl die msp430.h Dinge, die der Assembler nicht 
versteht.

von Jan L. (janl)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Hmm. Dann enthält wohl die msp430.h Dinge, die der Assembler nicht
> versteht.

Oder könnte es sein, dass mein Compiler oder gar der Code selbst eine 
Macke hat? Denn er kompiliert wirklich NUR .sx -Dateien.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Jan L. schrieb:
> Rufus Τ. Firefly schrieb:
>> Hmm. Dann enthält wohl die msp430.h Dinge, die der Assembler nicht
>> versteht.
>
> Oder könnte es sein, dass mein Compiler oder gar der Code selbst eine
> Macke hat? Denn er kompiliert wirklich NUR .sx -Dateien.

Daß der Assembler kein typedef versteht dürfte nicht allzu sehr 
verwundern...

Merke: C != Assembler

 :-)

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.