2010-03-05 119 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