Forum: Mikrocontroller und Digitale Elektronik avr-as Problem mit include und allgemeiner Syntax


von Stephan W. (stephan-w)


Lesenswert?

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

von Hc Z. (mizch)


Lesenswert?

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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Hc Z. (mizch)


Lesenswert?

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.

von Stephan W. (stephan-w)


Lesenswert?

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

von Hc Z. (mizch)


Lesenswert?

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

von Stephan W. (stephan-w)


Lesenswert?

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
Noch kein Account? Hier anmelden.