mikrocontroller.net

Forum: PC-Programmierung MVAR was macht es??


Autor: Gena (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Werner A. (homebrew)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)
(*((object volatile *) (addr)))

Autor: Norgan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gena (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnellen antworten. habt mir weiter geholfen

Autor: Gena (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

???????

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gena (Gast)
Datum:

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

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Gena (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: Gena (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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????

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.