www.mikrocontroller.net

Forum: PC-Programmierung MVAR was macht es??

Autor: Gena (Gast)
Datum: 09.04.2008 11:26

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: 09.04.2008 11:36

> 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: 09.04.2008 12:02

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: 09.04.2008 13:27

Danke für die schnellen antworten. habt mir weiter geholfen
Autor: Gena (Gast)
Datum: 09.04.2008 14:25

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: 09.04.2008 15:14

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: 09.04.2008 15:49

hab ich so gemacht #include "file.h",
findet das file drotzdem nicht.
Autor: Uhu Uhuhu (uhu)
Datum: 09.04.2008 15:59

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: 25.06.2008 14:08

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: 25.06.2008 16:56

Macros sind keine Variablen. Sie werden vom Präprozessor verarbeitet,
der Compiler sieht nur ihr Resultat.
Autor: Gena (Gast)
Datum: 26.06.2008 08:14

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: 26.06.2008 09:21

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: 26.06.2008 11:41

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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net