Forum: PC-Programmierung MVAR was macht es??


von Gena (Gast)


Lesenswert?

Hallo an alle,
Programmiere Mikrpkontroller und und verstehe den Befehl MVAR nicht.

Was bedeutet z.B. das
#define MVAR(object, addr)   (*((object volatile *) (addr)))

oder das??

#define Interrupt_Enable_Register     MVAR(unsigned char, 0x280001)

thanks for help

von Werner A. (homebrew)


Lesenswert?

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

von Norgan (Gast)


Lesenswert?

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.

von Gena (Gast)


Lesenswert?

Danke für die schnellen antworten. habt mir weiter geholfen

von Gena (Gast)


Lesenswert?

und noch eine frage die vieleicht nicht so kompl. ist.
wie füge ich in mein progr. am schnellsten einen header ein????

z.B. UART.h

???????

von Uhu U. (uhu)


Lesenswert?

Wenn es ein Header vom Compiler ist üblicherweise

   #include <uart.h>

Für eigene benutzt man

   #include "file.h"

Der Unterschied sind die Suchräume, in denen nachgesehen wird.

von Gena (Gast)


Lesenswert?

hab ich so gemacht #include "file.h",
findet das file drotzdem nicht.

von Uhu U. (uhu)


Lesenswert?

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

von Gena (Gast)


Lesenswert?

Hi kann ich auch eigentlich das bereits oben beschriebene Macro 
beschreiben???
z.B.

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

oder kann ich das nur auslesen?????


danke

von Uhu U. (uhu)


Lesenswert?

Macros sind keine Variablen. Sie werden vom Präprozessor verarbeitet, 
der Compiler sieht nur ihr Resultat.

von Gena (Gast)


Lesenswert?

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

von Thomas O. (Gast)


Lesenswert?

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.

von Uhu U. (uhu)


Lesenswert?

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.

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.