Forum: Compiler & IDEs Include in Assemblerdatei (.S) - wie funktionierts?


von Steffen Hausinger (Gast)


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

von moonuser (Gast)


Lesenswert?

Hast du dir schon mal das DCC tutorial angeschaut? Unter Assembler ist
das beschrieben.

von Steffen Hausinger (Gast)


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?

von Andreas H. (asmhesse)


Lesenswert?

Hi,

schau Dir mal die I2C-Master Bibliothek von Peter Fleury an.
http://homepage.hispeed.ch/peterfleury/avr-software.html

Da kannst Du die korrekte Integration anschauen.

Gruss
Andreas

von Karl heinz B. (kbucheg)


Lesenswert?

> unknown opcode typedef

na ja. Ich wuerde mal sagen, dass der Assembler
mit einem 'typedef' (einem reinen C-Sprachmittel)
herzlich wenig anfangen kann. Und das teilt er
dir mit.

Wie sieht denn deine main.h aus?

von Steffen Hausinger (Gast)


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)...

von Karl heinz B. (kbucheg)


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.

von Karl heinz B. (kbucheg)


Lesenswert?

Sorry. Muss natuerlich heissen

... die sowohl von mcp2515.h als auch ...

von Steffen Hausinger (Gast)


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!

von Karl heinz B. (kbucheg)


Lesenswert?

Das Problem ist:
  Fuer C gehören sie in das File
  Fuer Assembler gehört alles andere nicht in das File

Wenn man zwischen 2 Welten vermitteln muss, muss man
Kompromisse machen.

von Steffen Hausinger (Gast)


Lesenswert?

Klar, das sehe ich ein ;-)

Vielen Dank an Dich und alle, die mir geholfen haben!

von Jojo S. (Gast)


Lesenswert?

für Assembler gibt es solche Dateien meist auch, die Endung ist dann oft
'.inc'. Suche mal nach solchen Dateien in deiner Entwicklungsumgebung.
Ich kenne die mcp's nicht, bei AVR's ist das aber so.

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.