Hallo, ich habe ein Programm in Assembler geschrieben, welches ich auch ohne Probleme mit dem AVR-Studio Assembler (AVRASM2) übersetzen und laufen lassen konnte. Jetzt möchte ich darin enthaltene Funktionen gern im Rahmen eines C-Projektes nutzen. Natürlich meckert der GCC-Assambler avr-as über andere Syntax. Das ist ärgerlich, aber nachvollziehbar. Gibt es ein Dokument in dem nötige Anpassungen (avrasm --> avr-as)zusammengefasst sind? Exemplarisch konnte ich herausfinden, dass es zum Beispiel folgende Translation gibt: aus .equ SPM_PAGESIZE = SPM_PAGESIZE*2 ; im AVRASM2 wird .equ SPM_PAGESIZE , SPM_PAGESIZE*2 ; im AVR-AS Nun habe ich aber ein weiteres Problem: Welche Include-Datei muss ich nehmen, um im .S-Source-File verwendete defines wie das o.g. SPM_PAGESIZE nutzen zu können? Für meinen ATmega 1281 gibt es da ja die m1281def.inc und die iom1281.h. Letztere ist für C-Files da und mit der ersten INC-Datei kann der avr-as scheinbar nicht umgehen (mit dem AVRASM2 ging es natürlich wunderbar): beim includieren mittels .include "m1281def.inc" kommen jedenfalls hunderte Fehlermeldungen aus der Datei. Auszug: m1281def.inc: Assembler messages: m1281def.inc:47: Error: unknown pseudo-op: `.device' m1281def.inc:49: Error: expected comma after "SIGNATURE_000" m1281def.inc:50: Error: expected comma after "SIGNATURE_001" m1281def.inc:51: Error: expected comma after "SIGNATURE_002" m1281def.inc:60: Error: expected comma after "UDR3" m1281def.inc:61: Error: expected comma after "UBRR3H" m1281def.inc:62: Error: expected comma after "UBRR3L" m1281def.inc:63: Error: expected comma after "UCSR3C" ... ... ... Welche Datei muss ich nun für den Include nehmen? Ich danke für Eure Hilfe. vG Stephan
Du kannst die Atmel-.inc-Files nicht mit avr-as verwenden, dazu ist die Syntax zu unterschiedlich. Ein
1 | #include <avr/io.h> |
am Beginn Deines Assembler-Programms holt Dir alle Definitionen für den momentanen µC. Welcher das ist, bestimmt die -mmcu=... - Angabe auf der Kommandozeile.
> Welche Datei muss ich nun für den Include nehmen?
avr/io.h
Wenn der MCU korrekt auf dein Target Atmegam1281 definiert ist,
includiert die automatisch avr/iom1281.h.
Und du musst die richtige Endung für die Sourcen haben, damit vor dem
gnu-as der C-Präprozessor drüber läuft (.S).
1 | file.s |
2 | Assembler code. |
3 | file.S |
4 | Assembler code which must be preprocessed. |
http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Overall-Options.html Nicht geprüft habe ich, in welcher Includedatei SPM_PAGESIZE definiert ist. Eine Textsuche in dem Includeverzeichnis des AVR-GCC bzw. WinAVR müsste da aber weiterhelfen.
Ein Stolperstein verdient noch erwähnt zu werden: Das ist _SFR_IO_ADDR(). Während der Atmel-Assembler die Adressen passend für die in-, out-, sbis-, etc.-Befehle liefert, also z.B. 0x02 für PORTB beim ATmega644P, werden bei der GCC-Toolchain die Memory-gemappten Adressen verwendet, also im Beispiel 0x22. Die Umsetzung auf die I/O-Adressen geschieht über das Macro _SFR_IO_ADDR. _SFR_IO_ADDR(PORTB) würde also die gewünschten 0x02 liefern. Du kannst das global umstellen, indem Du zu Beginn Deines Assembler-Files ein
1 | #define __SFR_OFFSET 0
|
voranstellst. Dann liefert im Beispiel PORTB wieder 0x02. Für Dateien, die im Nachhinein auf den anderen Assembler umgestellt wurden, ist das ein guter Workaround. In Dateien, die von Anfang an für avr-as geschrieben werden, würde ich das Macro nehmen, das erscheint mir sauberer.
Super, danke für Eure Hilfe!
Habt ihr noch eine Idee zu dem ersten Problem?
-->
>Gibt es ein Dokument in dem nötige Anpassungen (avrasm -->avr-as)>zusammengefasst
sind?
Vielleicht gibt es ja schon irgendwo solch eine Zusammenstellung,...
vG Stephan
>>Gibt es ein Dokument in dem nötige Anpassungen (avrasm -->avr- > zusammengefasst sind? Ich kenne keines, habe aber ein Skript, das ein paar grundlegende Umsetzungen vornimmt. Ich würde trotzdem davon abraten: Atmels Assembler verwendet im Flash Wortadressen, avr-gcc Byteadressen. Einfache Verdoppelung der Adressen geht nicht, da SRAM- und I/O-Adressen immer Byteadressen sind und die Erkennung, wo das Ziel ist, praktisch nicht automatisierbar ist. Unterm Strich hast Du somit etwas, was meistens hinhaut, aber umso mehr Arbeit macht, weil der Friede trügerisch ist. Wenn Du das Skript trotzdem versuchen möchtest: es heißt _conv.awk und ist Teil von: Beitrag "Re: Peter Danneggers Bootloader (fastboot) für AVR-GCC-Toolchain".
Vielen Dank mizch, die Bedenken bezüglich der Adresseverwaltung, die du genannt hast, habe ich noch garnicht betrachtet. Unter dem Umstand werde ich wohl doch händisch die Änderungen vornehmen. So viel ist es wahrscheinlich garnicht. vG Stephan
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.