Assembler und C zusammen mit msp430-gcc kompilieren

OP #3610736
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
Gast #3611217
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...
OP #3611239
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.
Persönliche Seite #3611315
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.
OP #3611350
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.
OP #3611936
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.
Persönliche Seite #3611979
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

 :-)

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