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
> 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))) |
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.
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 ???????
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.
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...
Hi kann ich auch eigentlich das bereits oben beschriebene Macro beschreiben??? z.B. Interrupt_Enable_Register = 0x78; ???????????? oder kann ich das nur auslesen????? danke
Macros sind keine Variablen. Sie werden vom Präprozessor verarbeitet, der Compiler sieht nur ihr Resultat.
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????
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.