Forum: Compiler & IDEs Bit Banding bei ARM und einfache Frage zu #define


von Felix C. (felix_c13)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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;

von (prx) A. K. (prx)


Lesenswert?

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

von Bernd K. (prof7bit)


Lesenswert?

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
von Felix C. (felix_c13)


Lesenswert?

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.

von Bernd K. (prof7bit)


Lesenswert?

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
Noch kein Account? Hier anmelden.