Forum: Mikrocontroller und Digitale Elektronik Assembler Macro in AVR GCC Projekt mit Registernamensteil als Parameter


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von BobRob (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Grüß euch,
Ich portiere gerade ein umfangreiches xMega128A3U-Projekt, dass im AVR 
Assembler geschrieben wurde in ein AVR-gcc Projekt.Das mach ich aus dem 
Grund, dass das Projekt um USB Funktion per ASF ergänzt werden und somit 
letzten Endes sowohl C-Code als auch Assembler Code enthalten soll.
So weit so gut, nun häng ich an dem Punkt, dass bei vielen Macros manche 
Parameter Teile von Variablennamen oder Registernamen sind.

Exemplarisch so:
1
 
2
.macro SPI_Setup
3
//...
4
  sts @0_CTRL, R16
5
//...
6
.endm
7
8
//Aufruf:
9
10
start:
11
  SPI_Setup SPID
12
//...

Nun hab ich versucht, das auch in .s files im gcc Projekt zu erreichen 
und zwar so:
1
.macro SPI_Setup v0
2
//...
3
  sts \v0\()_CTRL, R16
4
//...
5
.endm
6
7
//Aufruf:
8
9
start:
10
  SPI_Setup SPID
11
//...

Als Fehlermeldung bekomme ich dann
"undefined reference to `SPID_CTRL'.

Gibt es eine Möglichkeit in .s-files in AVR-gcc Projekten Namensteile an 
Macros zu übergeben und zu verwenden wie beim AVR Assembler?

Viele Dank schon mal!
Robin

von Johann L. (gjlayde) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Das funktioniert so nicht.  Das Problem ist, dass die Makros aus 
avr/io.h vom C-Präprozessor aufgelöst werden, der wiederum vor dem 
gas-Präprozessor läuft.

gas wiederum erzeugt keine Zwischendatei, wie sie nach 
gas-Makro-Auflösung entsteht (was ziemlich blöd ist, wenn man gas-Makros 
debuggen will), sondern erzeugt direkt eine Object-Datei, welche das 
undefinierte Symbol SPID_CTRL enthält.

Man könnte der undefined reference also per
1
-Wl,--defsym,SPID_CTRL=0x09c0
begegnen, wobei die Adresse dem Header wie z.B. iox64a4.h (für 
ATXmega16A4) entnommen werden kann.
1
#define SPID_CTRL  _SFR_MEM8(0x09C0)
Das ist aber auch blöd und umständlich.

Am besten sorgst du also dafür, dass "SPID_CTRL" erzeugt wird, bevor 
oder während der C-Präprozessor läuft, etwa indem du ein C-Makro 
verwendest anstatt eines gas-Makros.

von BobRob (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Alle klar, danke für die schnelle Antwort!

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]
  • [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.