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
Hast du dir schon mal das DCC tutorial angeschaut? Unter Assembler ist das beschrieben.
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?
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
> 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?
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)...
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.
Sorry. Muss natuerlich heissen ... die sowohl von mcp2515.h als auch ...
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!
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.
Klar, das sehe ich ein ;-) Vielen Dank an Dich und alle, die mir geholfen haben!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.