Ich will hier eigentlich nur eine kurze Bestätigung, ob ich das richtig verstanden habe. -Zu jedem Bit im SRAM-Bereich(0x20000000-0x200FFFFF) oder der Peripherie(0x40000000-0x400FFFFF) gibt es in der Bitbanding-Region ein entsprechendes Word. -Der Speicherbedarf in der Bitbanding_Region ist 32 Mal grösser da der 32Bit Prozessor immer nur 32 Bit schreiben kann? -Folglich wird schneller geschrieben da die Words in der Bitbanding-Region komplett neu geschrieben werden können, statt mit AND und OR geändert zu werden. Und die eigentlichen zu ändernden Bit's dann automatisch geändert werden. -Die zugehörigen Words enthalten immer nur den Wert 1 oder 0 bzw. müssen immer 0x00000001 oder 0x00000000 beschrieben werden. Und noch eine andere Anfänger Frage. Ich versteh diesen Befehl nicht #define PB8 (*((volatile unsigned long*) 0x422141A0 )) Also das #define ist klar. Der Compiler wandelt alle PB8 in (*((volatile unsigned long*) 0x422141A0 )) um. Dann wirds schon hakelig (volatile unsigned long*) 0x422141A0 //Erstelle einen Pointer der auf den Wert an der Speicheradresse 0x422141A0 zeigt? (*((volatile unsigned long*) 0x422141A0 )) //Der Wert an der Adresse, die den Wert des Wertes hat, auf den der Pointer zeigt? Danke für eure Hilfe Gruss Felix
Felix C. schrieb: > #define PB8 (*((volatile unsigned long*) 0x422141A0 )) PB8 ist ein "memory-mapped" I/O-Register, das die Adresse 0x422141a0 hat. Um auf dieses Register so zugreifen zu können, wie auf eine beliebige Variable, erzeugt das Macro einen Pointer auf die Adresse und dereferenziert ihn. Und damit kannst Du im Code schreiben: PB8 = 1234; oder a = PB8;
Felix C. schrieb: > -Die zugehörigen Words enthalten immer nur den Wert 1 oder 0 bzw. müssen > immer 0x00000001 oder 0x00000000 beschrieben werden. Beim Schreiben zählt das unterste Bit. Der Rest ist egal. https://www.mikrocontroller.net/articles/ARM_Bitbanding
Felix C. schrieb: > (*((volatile unsigned long*) 0x422141A0 )) //Der Wert an der Adresse, > die den Wert des Wertes hat, auf den der Pointer zeigt? Der Wert an der Adresse auf die der Pointer zeigt.
:
Bearbeitet durch User
Rufus Τ. F. schrieb: > PB8 ist ein "memory-mapped" I/O-Register, das die Adresse 0x422141a0 > hat. > > Um auf dieses Register so zugreifen zu können, wie auf eine beliebige > Variable, erzeugt das Macro einen Pointer auf die Adresse und > dereferenziert ihn. Bernd K. schrieb: > Felix C. schrieb: >> (*((volatile unsigned long*) 0x422141A0 )) //Der Wert an der Adresse, >> die den Wert des Wertes hat, auf den der Pointer zeigt? > > Der Wert an der Adresse auf die der Pointer zeigt. Das mit dem Register ist mir nicht so wichtig. Es ging mir vor allem um den Pointer-Kram. Das Macro erzeugt als einen Pointer: (volatile unsigned long*) 0x422141A0 der auf die Adresse 0x422141A0 zeigt. Wieso reicht das nicht? Würde ich mit #define PB8 (volatile unsigned long*) 0x422141A0 PB 8 = irgendeinWert; die Adresse ändern, auf die der Pointer zeigt, weswegen der Pointer nochmal deferenziert werden muss? Da auf den Rest nicht mehr Bezug genommen wurde, schätze ich, dass ich jenes als richtig erachten kann.
Felix C. schrieb: > weswegen der Pointer nochmal deferenziert werden muss? Exakt so ist es. Nun musst du das Sternchen nicht mehr hinschreiben und es fühlt sich an wie eine Variablenzuweisung.
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.