2010-03-05 8 views
10

Wie weisen Sie einem Zeiger eine bestimmte Speicheradresse zu?Zeiger auf eine bestimmte feste Adresse

Die Sonderfunktionsregister in einem Mikrocontroller wie AVR m128 hat feste Adressen, der AVR GCC definiert das SFR in der io.h Headerdatei, aber ich möchte es selbst handhaben.

Antwort

28

Sicher, kein Problem.

volatile unsigned int *myPointer = (volatile unsigned int *)0x12345678; 

Was ich in der Regel tun, ist ein Memory-Mapped-Makro I/O erklären: Sie können es nur direkt einer Variablen zuweisen

#define mmio32(x) (*(volatile unsigned long *)(x)) 

Und dann meine Register in einer Header-Datei definiert werden:

#define SFR_BASE (0xCF800000) 
#define SFR_1  (SFR_BASE + 0x0004) 
#define SFR_2  (SFR_BASE + 0x0010) 

Und dann sie verwenden:

unsigned long registerValue = mmio32(SFR_1); // read 
mmio32(SFR2) = 0x85748312;     // write 
+2

I w hätte einen generischen Void-Zeiger verwenden müssen, es sei denn, die Daten an dieser Position sind ein vorzeichenloser Int-Wert. –

+1

Es ist normalerweise eine gute Idee, speicherabgebildete E/A-Adressen als flüchtig zu deklarieren. –

+0

@Sean, er möchte auf ein Speicherabbildregister zugreifen. Sie können einen "void" -Zeiger nicht dereferenzieren, welcher Nutzen wäre das? –

Verwandte Themen