Include in Assemblerdatei (.S) - wie funktionierts?

Gast #366085
Lesenswert?

Hallo zusammen,

ich schreibe einen Teil meines Programms in Assembler. Dafür benutze
ich eine ganze Datei (kein Inline-Assembler), die ich dann in mein
Programm einbinde.

Das Problem dabei ist jedoch, dass ich auf Definitionen (#define), die
in anderen eingebundenen Programmdateien stehen, zugreifen möchte. Das
klappt aber offensichtlich so einfach nicht, es kommt ein Schwall von
Fehlermeldungen (unknown opcode typedef; unknown opcode void).

Ich binde die Dateien ganz normal mit '#include <main.h>' ein. Wieso
funktioniert das nicht? Wie muss es denn richtig lauten?

Grüsse,
Steffen
Gast #366087
Lesenswert?

Das GCC-Tutorial hier auf der Seite habe ich mir schon angeschaut. Dort
wird aber lediglich von

#include "avr/io.h"

gebrauch gemacht. Das hab ich bei mir auch so in der Assemblerdatei
stehen und funktioniert soweit auch. Nur wenn ich beispielsweise ein

#include "main.h"

einfüge, gibt er mir Fehlermeldungen noch und nöcher. Und ich habe -
ehrlich gesagt - keine Idee, warum. Kannst Du mir weiterhelfen?
Gast #366090
Lesenswert?

In der Assemblerdatei von Peter Fleury wird lediglich "avr/io.h"
eingebunden. Leider keine andere Datei und deshalb hilft es mir auch
nicht weiter, denn "avr/io.h" kann ich bei mir auch ohne Probleme
einbinden.

Mal von vorne: es geht im Prinzip darum, dass ich Definitionen aus
anderen Headerdateien benutzen muss (Registerdefinitionen eines
CAN-Controllers, die ich nicht nocheinmal alle abschreiben möchte) und
benutzen möchte (Parameter aus Main.h).

Also schreibe ich in meiner Assemblerdatei etwa (Auszug):

...
#include "mcp2515.h"
...


Die Datei mcp2515.h sieht dabei wie folgt aus:

#ifndef _MCP2515
#define _MCP2515

/* Dateien einbinden */
#include <inttypes.h>      // Int-Typen einfügen
#include <avr/interrupt.h>    // Interrupt-Header einfügen
#include <spi.h>      // SPI-Busroutinen einfügen

/* Funktionsprototypen */
void MCP2515_Reset(void);    // Resettet den MCP2515
uint8_t MCP2515_Read(uint8_t);    // Liest ein Byte aus dem MCP2515
void MCP2515_Write(uint8_t, uint8_t);  // Schreibt ein Byte im MCP2515
void MCP2515_RTS(uint8_t Buffer);  // Sendet ein "RTS" an den MCP2515
uint8_t MCP2515_Status(void);    // Liest den Status des MCP2515
void MCP2515_Modify(uint8_t Address, uint8_t Mask, \
    uint8_t Data);    // Modifiziert ein Byte im MCP2515

/* Makros */
#define HIGH(Word) Word>>8    // Nur High-Teil eines 16-Bit Worts
verarbeiten
#define LOW(Word) Word&0x00FF    // Nur Low-Teil eines 16-Bit Worts
verarbeiten

/* Registerdefinitionen */
// Definition des MCP2515 von Lieven Hollevoet, boostc compiler, siehe
// http://creativecommons.org/licenses/by-sa/2.0/

// Register map of the MCP2515
#define RXF0SIDH  0x00
#define RXF0SIDL  0x01
...

#endif


Die Fehler, die dann auftreten, habe ich ja schon in meinem ersten
Posting erwähnt (unknown opcode)...
#366091
Lesenswert?

Und ich denke immer noch, dass dein Assembler
nicht wirklich glücklich damit ist, wenn du ihm
C-Syntax vorwirfst.
Es mag zwar eine gewisse Überschneidung geben, zwischen
dem was der Assembler syntaktisch verarbeiten kann und
dem was der C-Compiler kann. Aber 100% wird das nie sein.

Der Assembler, wird mit einem 'void' genausowenig
anfangen können wie mit einem 'typedef'.

Wenn es dir nur darum geht, die
#define
in den Assembler reinzukriegen, dann extrahiere die in
ein eigenes H-File, die sowohl von main.h als auch
von deinem Assembler-File inkludiert wird.
Gast #366093
Lesenswert?

Ja, das was Du da schreibst klingt logisch. Er ruft die
#include-Funktionalität ja von der Assemblerdatei aus... ok.

Aber gibt es nun wirklich keine elegantere Lösung, als die alle
mcp2515-spezifischen Definitionen in eine allgemeine Header-Datei zu
schreiben? Ich hätte sie nämlich lieber dort stehen, wo sie hingehören
;-)

Aber ok, ich bin erstmal beruhigt, eine Erklärung gefunden zu haben.
Danke!

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