2014-02-13 48 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