2010-03-05 124 views
10

如何爲指針指定特定的內存地址?指向特定固定地址的指針

微控制器中的特殊功能寄存器,如AVR m128具有固定地址,AVR GCC在io.h頭文件中定義了SFR,但我想自己處理。

回答

28

當然,沒問題。你只可以直接分配到一個變量:

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

我最常做的就是聲明內存映射I/O宏:

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

,然後定義我的寄存器在頭文件:

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

,然後用它們:

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

I W應該使用通用的void指針,除非該位置的數據是無符號的int。 – 2010-03-05 19:17:42

+1

將內存映射的I/O地址聲明爲volatile是個好主意。 – 2010-03-05 19:19:09

+0

@Sean,他想訪問一個內存映射寄存器。你不能取消引用一個'void'指針,那會有什麼用? – 2010-03-05 19:19:21