Assembler und C zusammen mit msp430-gcc kompilieren

OP #3610736
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
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
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.
OP
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
OP
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
Persönliche Seite
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.