Bit Banding bei ARM und einfache Frage zu #define

OP #4299098
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
Persönliche Seite #4299110
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;
OP #4299187
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.