MVAR was macht es??

> Was bedeutet z.B. das
> #define MVAR(object, addr)   (*((object volatile *) (addr)))
Das definiert einen Befehl MVAR mit 2 Parameter

>
> #define Interrupt_Enable_Register     MVAR(unsigned char, 0x280001)
und hier wird der Befehl dann genutzt.

was dieser Befehl allerdings macht weiss ich auch nicht ;-)
1
(*((object volatile *) (addr)))
Gast
Das sind keine "Befehle", das sind Macros. MVAR() castet "addr" auf 
einen Pointer und dereferenziert den Pointer (holt den Inhalt). 
Interrupt_Enable_Register() holt somit den Inhalt von Adresse 0x280001 
als einen unsigned char. Das volatile dient dazu, dem Compiler zu 
erzählen, er soll die Zugriffe nicht optimieren. Damit wird 
sichergestellt, dass 0x280001 jedesmal frisch gelesen (oder geschrieben) 
wird, wenn das so im Code steht.
Gena wrote:
> hab ich so gemacht #include "file.h",
> findet das file drotzdem nicht.

Ich vermute mal, daß uart.h zum Compiler gehört und nicht zu deinem 
Progamm. Dann mußt du die Form <...> nehmen. Der Compiler sucht dann den 
Pfad ab, den er bei der Installation in seinen Einstellungen hinterlegt 
bekommen hat.

Die Form "..." nimmt man für Dateien, die im selben Verzeichnis liegen, 
wie die .c-Datei. (Man kann aber auch dafür üblicherweise einen Pfad 
definieren.)

Lies mal im Compilerhandbuch das Kapitel "include" nach...
Gast
Hi kann ich auch eigentlich das bereits oben beschriebene Macro 
beschreiben???
z.B.

Interrupt_Enable_Register = 0x78;   ????????????

oder kann ich das nur auslesen?????


danke
Gast
Aber der Inhalt z.B. von der adresse 0x280001
(#define Interrupt_Enable_Register     MVAR(unsigned char, 0x280001))

muss doch irgendwie beschrieben werden, also ist das doch eine Art 
Variable???  deren Inhalt man füllen kann???   aber Wie????
Gast
Hallo Gena,
funktioniert das denn bei Dir nicht??
Üblicherweise sollte ein C-Compiler daraus folgendes machen:

   *((unsigned char volatile *) 0x280001) = 0x78;

und das ist in 'C' 'ne übliche Schreibweise.
Prinzipiell ist es auf jeden Fall sinnvoll, innerhalb von Macros die 
verwendeten Platzhalter zu klammern, also:

   #define MVAR(object, addr)   (*(((object) volatile *) (addr)))


Gruß
Thomas O.
Gena wrote:
> Aber der Inhalt z.B. von der adresse 0x280001
> (#define Interrupt_Enable_Register     MVAR(unsigned char, 0x280001))
>
> muss doch irgendwie beschrieben werden, also ist das doch eine Art
> Variable???  deren Inhalt man füllen kann???   aber Wie????

Das ist aber ein bischen was anderes, als den Macro zu beschreiben - Der 
ist nämlich nur eine Anweisung an den Präprozesser, das Symbol 
Interrupt_Enable_Register durch was anderes zu ersetzen und das Ergebnis 
dann dem Compiler zu fressen zu geben.

Der Compiler weiß davon nichts.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.