2010-03-05 6 views
10

Comment affecter une adresse mémoire spécifique à un pointeur? La fonction spéciale Registres dans un microcontrôleur tel AVR m128 a des adresses fixes, l'AVR GCC définit le SFR dans le fichier d'en-tête io.h, mais je veux le gérer moi-même.Pointeur vers une adresse fixe spécifique

Répondre

28

Bien sûr, pas de problème. Vous pouvez simplement l'attribuer directement à une variable:

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

Ce que je fais habituellement est de déclarer une macro E/S mappé en mémoire:

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

Et puis définissez mes registres dans un fichier d'en-tête:

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

Et puis les utiliser:

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

I w ould aurait utilisé un pointeur générique vide, à moins que les données de cet emplacement ne soient un entier non signé. –

+1

Il est généralement recommandé de déclarer les adresses d'E/S mappées en mémoire comme volatiles. –

+0

@Sean, il veut accéder à un registre mappé en mémoire. Vous ne pouvez pas déréférencer un pointeur "void", à quoi cela servirait-il? –

Questions connexes