2014-02-13 146 views
1

考虑这个指针声明:一个特定的地址

(volatile unsigned long *) 0x4000703C 

这是否意味着声明我们声明指针地址0x4000703C?和:

#define STEPPER (*((volatile unsigned long *)0x4000703C)) 

void Step(void){ 
    STEPPER = 10; 
    STEPPER = 9; 
    STEPPER = 5; 
    STEPPER = 6; 
} 

STEPPER是指针的地址0x4000703C的尊重,和我们直接写0x4000703C。这是对的吗?

+2

不,是的。第一个不是声明,它是一个表达式,它产生一个指向'unsigned long'的指针,它指向一个特定的地址。 –

回答

2

这是否意味着声明我们声明的指针地址

不,声明包含标识,在这种情况下,一个变量名。您有一个将整数转换为指针类型的操作,指向0x4000703C。没有声明。

STEPPER是地址0x4000703C处指针的设计,我们直接写入0x4000703C。这是对的吗?

是的。 0x4000703C有什么样的内存当然是完全系统特定的。

+0

是的,在这种情况下,0x4000703C是I/O端口的地址。感谢您的确认,因为我还在学习。 – Amumu

1

您正在虚拟内存中直接写入该地址,是的。

+0

你怎么知道没有OP指定这个系统运行的虚拟内存?并非每台电脑都是PC。 – Lundin

0

这种技术在嵌入式系统编程中广泛使用来定义硬件寄存器。

更新:

以防万一,对于可能想知道更多关于在嵌入式系统领域使用这种技术的人:

+0

我不明白为什么downvote。在编写低级固件时,这种技术确实被广泛用于定义硬件外设。 – yongzhy

+1

可能因为这应该作为评论发布,而不是答案。你不回答提出的两个问题中的任何一个。 – Lundin