mikrocontroller.net

Forum: Compiler & IDEs GCC-Macro-Einstieg...


Autor: Macro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

leider kenne ich die "Welt" der GCC- Tools (noch) wenig, ich möchte
eventuell eine früher entwickelte (8080)-Macrosprache für meine Atmel
Versuche umsetzen, falls dies möglich ist.

Als Einstieg suche ich einen Hinweis bzw. den Manual-Einstieg wo die
Preprozessor-Fähigkeiten stehen.
Ich bin für jeden Hinweis dankbar.

So möchte ich zum Beispiel:

ASSIGN <channel>,<identifier>,<adress>,<mask>


ASSIGN (INPUT,POS,0x32,0x38)

PseudoCODE...umsetzen nach:

??
...
#if channel EQ INPUT

#define xadr_POS 0x32
#define xmask_POS 0x38

#EXIT MACRO ???
#ENDIF
....

Kann mir jemand sagen wie man da die Dummy Paramete verknüpft

zb: xadr$identifier wird zu xadr_POS... etc.

Ein Zeige auf da Manual wo ich diese Thematik finde würde mir schon
reichen. Oder geht sowas nicht?
Das Ganze wurde füher mit nem Macro_Assembler realisiert.

Vielen Dank
Achim

Autor: AndreasH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

diese Art von Makros beim 8080 kenne ich auch.
Wie Du das jetzt im Detail beim gcc umsetzen musst, kann ich Dir nicht
sagen.

Ein Macro beginnt mit
.macro
Bei Dir wäre das
.macro ASSIGN channel,identifier,adress,mask
..... ; weiterer Code
.endm

Die nachfolgenden Anweisungen lauten entsprechend
#if         ==> .if
#endif      ==> .endif
#EXIT MACRO ==> .exitm

Angesprochen werden die Parameter dann mit einem Backslash davor:
.if \address - \mask

Aufgerufen wird das Makro dann:
ASSIGN INPUT,POS,0x32,0x38

Weiteres findest Du in der Assembler-Doku. Ich habe die nur ausgedruckt
und weiss nicht mehr wo ich die zugehörige Datei auf meinem Rechner
habe.
Ich kann auch nicht mehr sagen wo ich die runtergeladen habe.
Versuch einfach mal bei google nach "gnu-assembler" zu suchen.
Bei mir ist es die Version 2.11 und nennt sich "Using as"

Grüße
Andreas

Autor: Macro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo AndreasH

geht sowas auch in C mit #define xxx oder ist das überzogen?
Ich meine also nicht im Assembler. Leider find ich (noch) keine Manuals
über das Thema

MfG
Achim

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jein, genau das gleiche wirst du in C vermutlich nicht erreichen können.
Du musst bedenken, dass der Präprozessor von C recht "dumm" ist und
selten mehr als einen sture Textersetzung vornimmt.
Es gibt zwar sowas wie #ifdef, aber damit kannst du nur auf
Präprozessorsymbole testen, nicht auf Parameter.

Du brauchst als if-Anweisung also IMHO das tatsächliche if() von C. Für
xadr_POS musst du eine globale Variable definieren.
Immerhin kannst du zwei Token mit dem Präprozessor aneinanderkleben:
#define some_macro(identifier) xadr_##identifier

some_macro(POS) liefert nun den dynamisch erstellten Bezeichner
xadr_POS.

Ein C-Buch deiner Wahl sollte IMHO die meisten deiner Fragen klären
können.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
p.s.:
Hm, kann sein, dass ich mich gerade gewaltig getäuscht habe. Evtl. geht
sowas (zu faul zum Testen):

#define POS = 1

#if (POS == 1)
#define POS_IST_EINS
#endif


Innerhalb von Makros kannst du aber AFAIK keine weiteren
Präprozessorbefehle absetzen, weil sie nicht am Anfang der Zeile stehen
würden.

Autor: AndreasH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da der 8080 in Assembler programmiert wird und mir kein C-Compiler
bekannt ist, hatte ich angenommen Du willst das ganze auch in Assembler
umsetzen.

Ansonsten gilt. Probier es einfach an einem kleinen Makro aus.

Ich meine mich daran zu erinnern, dass ich in den letzten Monaten mal
folgendes ausprobiert habe:

#define POS = 5

#if (POS == 5)
#elif (POS == 1)

Das ging dann nicht. Ich kann dir auch nicht mehr genau sagen welcher
Compiler das war. Da ich in den letzten Wochen nur mit dem avr-gcc
gespielt habe, ist die Wahrscheinlichkeit gross dass es mit dem war.
Könnte allerdings auch in ähnlicher Form in Delphi gewesen sein.
Wie gesagt, kann mich nicht mehr genau daran erinnern. Daher: Probieren
geht über studieren.

Grüße
Andreas

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.