2013-04-21 72 views
4

我一直在閱讀關於訪問外圍設備的內存映射寄存器的問題,看起來您可以採用多種方式。例如:使用char和int訪問內存映射寄存器的區別

方法1:

#define MyReg 0x30610000 

volatile int *ptrMyReg; 
ptrMyReg = (volatile int *) MyReg; 
*ptrMyReg = 0x7FFFFFFF; /* Turn ON all bits */ 

方法2:

#define MyReg 0x30610000 

volatile unsigned char *ptrMyReg; 
ptrMyReg = (volatile unsigned char *) MyReg; 
*ptrMyReg = 0x7FFFFFFF; /* Turn ON all bits */ 

問:是否有任何具體的原因,爲什麼人會選擇一個比另一個?

假設:體系結構上的int大小爲4個字節。

+1

第一個選擇第二個的原因是第一個會編譯,第二個不會(因爲你試圖給'char *'分配一個int *')。 – Praetorian 2013-04-21 17:13:28

+0

@Praetorian - 這是一個錯字。修復。謝謝。 – modest 2013-04-21 17:17:50

回答

5

*ptrMyReg = 0x7FFFFFFF;

在第二種情況下,*ptrMyRegunsigned char類型,以便將0x7FFFFFFF分配之前被轉換爲unsigned char(即,轉換後的值將是0xFF)和只有一個字節將被寫入。如果你最初打算寫4個字節,我不認爲這是你想要的。

2

那麼,第二個例子不是有效的代碼,因爲你的類型轉換不匹配。如果你解決這個問題:

ptrMyReg = (volatile unsigned char *)MyReg; 

然後,是的,他們是不同的。在第二種情況下,該常量會被截斷,並且您將只寫入0xFF至該字的最高或最低有效字節0x30610000,具體取決於字節順序。無論如何,這是在0x30610000的單個字節,將被寫入,而不是其他人。

1

CPU體系結構可能要求所有對周圍寄存器的訪問都是例如。 32位寬。如果是這樣,做字節訪問可能會導致CPU異常或無聲的錯誤執行。許多ARM SoC都是這種情況。

0

在方法2,你是不會提領的指針訪問整個intchar(除非,當然,sizeof(int) = 1對您的平臺)。

除此之外,你應該看看你的硬件。使用不同大小的內存操作數訪問時,它的行爲可能會有所不同。

相關問題