www.mikrocontroller.net

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


Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: moonuser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du dir schon mal das DCC tutorial angeschaut? Unter Assembler ist
das beschrieben.

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Andreas Hesse (asmhesse)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)...

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry. Muss natuerlich heissen

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

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar, das sehe ich ein ;-)

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

Autor: Jojo S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.