mikrocontroller.net

Forum: Compiler & IDEs C Konstanten mit Inline Assembler verwenden


Autor: Pivo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich würde gerne bestimmte Konstanten, die ich in einem C header file
mit #define definiert habe im Inline Assembler verwenden. Weiss jemand,
ob das möglich ist und wenn ja wie?

Danke!

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

da jedes C-File erstmal durch den Präprozessor geht sollte das kein
Problem sein.

Matthias

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nu ja, Vorsicht.  Klar geht jedes C-File durch den Präprozessor, aber
innerhalb von Strings finden natürlich keine Ersetzungen statt.
Inline-asm-Anweisungen sind aber erstmal Strings.

Aber als Operand zu einer inline-asm-Anweisung sollten sie taugen --
bedingt jedenfalls.  Dinge wie die Makros für die Portnamen taugen
dort nicht direkt, da sie zu ziemlich verqueren Typecast expandieren,
aber auch dafür gibt es Lösungen einschließlich Beispielen in der
Doku.

Herr Namenlos, am besten, du beschreibst lieber erstmal dein Problem
ein wenig mehr.  OK, meistens kommt dann raus, dass du den inline asm
gar nicht erst brauchst :-), aber das ist 'ne andere Baustelle.

Autor: Pivo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
danke erst mal für die Antworten. Mein genaues Problem liegt darin,
dass ich im C Code an einer bestimmten Stelle unwiederruflich an eine
Adresse springen will, die an einer ganz bestimmten Adresse im Speicher
abgelegt ist. Es sind quasi 2 unabhängige Programme, die nur über die
abgelegte Einsprungadresse miteinander verknüpft sind und sonst nichts
voneinander wissen. Im Moment realisiere ich das mit dem Inline
Assembler ala "br &0FDFEh". Aufgrund der Übersichtlichkeit würde ich
die Adresse gern als Konstante definieren, damit der Code später
leichter angepasst werden kann.
Wenn ich das richtig verstanden habe, meinst du, dass man eventuell
über  eine String Operation die Assembleranweisung und den Operand
verknüpfen könnte. Auf diese eigentlich naheliegende Idee bin ich nicht
gekommen. Danke! Allerdings erzeugt mir das denke ich zuviel Code
Overhead. Das ist mir die Sache dann nicht unbedingt wert.
Aber vielleicht ist mir auch schon geholfen, wenn ich die gesamte
Assembleranweisung zentral im Header File ablege und im C Code ersetzen
lasse. Das wäre ein Kompromiss. Es geht mir halt nur um eine einfache
Wartbarkeit und möglichst zentrale Anpassung.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

du könntest das ganze auch über einen Funktionspointer lösen.

Matthias

Autor: Pivo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
mit Funktionspointern habe ich gerade erst angefangen mich zu
beschäftigen, da ich die wage Idee hatte, dass man es so lösen könnte.
Ich werde mal ein wenig in diese Richtung recherchieren.
Danke!

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void
jumpsomewhere(void)
{
        void const (*funcptr)(void) = (void const (*)(void))0x1234;

        funcptr();
}

Autor: Sven Bohner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define  const   0xf7

unsigned char tmp = 0x7f;

asm volatile(
    "andi   %0, %A1    \n\t"
    : "=r" (tmp)
    : "K" (const)
);

...brauchst du es genauer Erklärt?

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"const" umzudefinieren, ist sicher keine so gute Idee. ;-)

Autor: Sven Bohner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich weiss...

...bin wie mir nach dem posten aufgefallen ist eh am thema
vorbeigeschrammt... :-)

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.